1. Struts2下载
解压后的目录结构如下:
从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的:
- 操作(Actions)
- 拦截器(Interceptors)
- 值栈(Value Stack)/OGNL
- 结果(Result)/结果类型
- 视图技术
请求生命周期
通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:
- 用户发送一个资源需求的请求到服务器(例如:页面)。
- 核心控制器查看请求后确定适当的动作。
- 使用验证、文件上传等配置拦截器功能。
- 执行选择的动作来完成请求的操作。
- 如果需要的话,配置的拦截器可做任何后期处理。
- 最后,由视图显示结果并返回给用户。
2. HelloWorld程序
1. 四个组件:
- Action(操作)
创建一个动作类,包含完整的业务逻辑并控制用户、模型以及视图间的交互。 - Interceptors(拦截器)
这是控制器的一部分,可依据需求创建拦截器,或使用现有的拦截器。 - View(视图)
创建一个JSP与用户进行交互,获取输入并呈现最终信息。 - Configuration Files(配置文件)
创建配置文件来连接动作、视图以及控制器,这些文件分别是struts.xml、web.xml以及struts.properties。
2. 创建项目
记得勾选Generate web.xml deployment descriptor.
目录结构:
3. 导入jar包
将struts-2.3.34文件中的lib文件夹中的一下jar包引入项目的WebContent/WEB-INF/lib文件夹中
- commons-fileupload-1.3.2.jar
- commons-io-2.2.jar
- commons-lang-2.4.jar
- commons-lang3-3.2.jar
- commons-logging-1.1.3.jar
- freemarker-2.3.22.jar
- javassist-3.11.0.GA
- ognl-3.0.21.jar
- struts2-core-2.3.34.jar
- xwork-core.2.3.34.jar
4. 创建HelloWorldAction类
public class HelloWorldAction {
private String name;
public String execute() throws Exception{
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5. 创建HelloWorld.jsp页面
在/Webcontent/下创建jsp文件夹,将所有创建的jsp页面存储在这个文件夹,在/Webcontent/jsp/文件夹下创建HelloWorld.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Insert title here
Hello World,
6. 在/WebContent/jsp/页面创建index.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
Insert title here
Hello World From Struts2
7. 在src目录下创建struts.xml文件
/jsp/HelloWorld.jsp
8. 在src目录下创建logging.properties配置文件
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \ java.util.logging.ConsoleHandler
9. 在web.xml文件中进行配置
HelloWorld
index.html
index.htm
/jsp/index.jsp
default.html
default.htm
default.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
10. 运行项目
在输入框中输入文字,点击Say Hello
11. 设置索引
修改struts.xml文件为
/jsp/index.jsp
/jsp/HelloWorld.jsp
在浏览器输入http://localhost:8080/HelloWorld/index.action
即可访问.
3. 配置文件
1). struts.xml文件
/jsp/index.jsp
/jsp/HelloWorld.jsp
标签具有以下属性:
属性 | 描述 |
---|---|
name(必需) | 为package的唯一标识 |
extends | 指定package继承另一package的所有配置。通常情况下,我们使用struts-default作为package的基础。 |
abstract | 定义package为抽象的。如果标记为true,则package不能被最终用户使用。 |
namespace | Actions的唯一命名空间 |
标签以及name和value属性将用于覆盖default.properties中定义的任一属性,就像我们设置的struts.devMode属性一样。设置struts.devMode属性允许我们在日志文件中查看更多的调试消息。 Results(结果)确定在执行操作后返回到浏览器的内容,而从操作返回的字符串应该是结果的名称。 Results按上述方式配置,或作为“全局”结果配置,可用于包中的每个操作。 Results有
name
和type
属性可选,默认的name值是“success”。Struts.xml文件可以随着时间的推移而增长,因此通过包打破它是使它模块化的一种方式,但struts提供了另一种模块化struts.xml文件的方法,你可以将文件拆分为多个xml文件,并用以下方式导入它们。
2). struts.properties文件
配置文件提供了一种机制来改变框架的默认行为。
### When set to true, Struts will act much more friendly for developers
struts.devMode = true
### Enables reloading of internationalization files
struts.i18n.reload = true
### Enables reloading of XML configuration files
struts.configuration.xml.reload = true
### Sets the port that the server is run on
struts.url.http.port = 8080
4. 拦截器
1). 分类
序号 | 拦截器和说明 |
---|---|
1 | alias 允许参数在请求之间使用不同的别名。 |
2 | checkbox 通过为未检查的复选框添加参数值false,以辅助管理复选框。 |
3 | conversionError 将字符串转换为参数类型的错误信息放置到action的错误字段中。 |
4 | createSession 自动创建HTTP会话(如果尚不存在)。 |
5 | debugging 为开发人员提供一些不同的调试屏幕。 |
6 | execAndWait 当action在后台执行时,将用户发送到中间的等待页面。 |
7 | exception 映射从action到结果抛出的异常,允许通过重定向自动处理异常。 |
8 | fileUpload 便于文件上传。 |
9 | i18n 在用户会话期间跟踪选定的区域。 |
10 | logger 通过输出正在执行的action的名称提供简单的日志记录。 |
11 | params 设置action上的请求参数。 |
12 | prepare 这通常用于执行预处理工作,例如设置数据库连接。 |
13 | profile 允许记录action的简单分析信息。 |
14 | scope 在会话或应用程序范围内存储和检索action的状态。 |
15 | ServletConfig 提供可访问各种基于servlet信息的action。 |
16 | timer 以action执行时间的形式提供简单的分析信息。 |
17 | token 检查action的有效性,以防止重复提交表单。 |
18 | validation 提供action的验证支持。 |
2). 使用Struts2中的拦截器
I. 给HelloWorldAction 添加timer拦截器(测量执行action方法所需的时间)及params拦截器(将请求参数发送给action)
/jsp/index.jsp
/jsp/HelloWorld.jsp
II. 测试
在最后两行打印了当前action执行的时间。
3). 自定义拦截器
I. 创建拦截器类
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Pre-Processing--先执行");
// 执行方法
String result = invocation.invoke();
System.out.println("Post-Processing--后执行");
return result;
}
}
II. 创建Action类
public class HelloWorldAction extends ActionSupport{
private String name;
public String execute() throws Exception{
System.out.println("execute...");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
III. structs.xml文件中配置
/jsp/index.jsp
/jsp/HelloWorld.jsp
IV. 执行结果
5. 文件上传
注意:服务器可能有适当的安全策略,禁止你写入临时目录以外的目录以及属于Web应用程序的目录。使用FileUpload过滤器
1). 创建jsp文件
I. 文件上传fileupload.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
File Upload
II. 创建上传成功success.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
File Upload Success
You have successfully uploaded
III. 创建上传失败error.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
File Upload Error
There has been an error in uploading the file.
2). 创建FileUploadAction
/**
* 默认情况下,FileUpload拦截器为你提供三个参数,它们分别按以下方式命名:
* [文件名参数] - 这是用户已上传的实际文件。在这个例子中它将是“myFile”
* [文件名参数]ContentType - 这是上传的文件的内容类型。在这个例子中,它将是“myFileContentType”
* [文件名参数]FileName - 这是上传的文件的名称。在这个例子中,它将是“myFileFileName”
* @author mazaiting
*/
public class FileUploadAction extends ActionSupport{
private File myFile;
private String myFileContentType;
private String myFileFileName;
private String destPath;
@Override
public String execute() throws Exception {
destPath = "E:/file/";
try {
System.out.println("Src File name: " + myFile);
System.out.println("Dst File name: " + myFileFileName);
File destFile = new File(destPath, myFileFileName);
FileUtils.copyFile(myFile, destFile);
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
return SUCCESS;
}
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
public String getDestPath() {
return destPath;
}
public void setDestPath(String destPath) {
this.destPath = destPath;
}
}
3). 配置文件
序号 | 属性和说明 |
---|---|
1 | struts.multipart.maxSize 可接受的上传文件的最大值(以字节为单位),默认值为250M。 |
2 | struts.multipart.parser 用于上传多部分表单的库,默认为jakarta。 |
3 | struts.multipart.saveDir 存储临时文件的位置,默认是javax.servlet.context.tempdir。 |
/jsp/index.jsp
/jsp/HelloWorld.jsp
500000000
image/jpeg,image/gif,text/plain,application/vnd.ms-powerpoint
.txt,.ppt,.jpeg,.jpg,.gif
/jsp/success.jsp
/jsp/error.jsp
fileUpload拦截器有两个参数:maximumSize和allowedTypes。
- maximumSize参数是设置所允许的文件大小的最大值(默认约为2MB)。
- allowedTypes参数是所允许的内容(MIME)类型的用逗号分隔的列表
4). web.xml文件
文件上传
index.html
index.htm
/jsp/fileupload.jsp
default.html
default.htm
default.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
5). 执行测试
点击upload后
6. 全局异常映射
struts.xml文件配置
/jsp/index.jsp
/jsp/HelloWorld.jsp
500000000
image/jpeg,image/gif,text/plain,application/vnd.ms-powerpoint
.txt,.ppt,.jpeg,.jpg,.gif
/jsp/success.jsp
/jsp/error.jsp
6. 注解
1). 添加jar包
在之前导入包的基础上新增antlr-2.7.2.jar、asm.3.3.jar、asm-commons-3.3.jar和struts2-convention-plugin-2.3.34.jar
2). 创建视图
I. 创建主页
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Employee Form
II. 创建成功视图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Success
Employee Information is captured successfully.
III. 创建失败视图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Error
Employee Information is captured error.
3). 创建Action
@Results({
@Result(name="success", location="/jsp/success.jsp"),
@Result(name="error", location="/jsp/error.jsp"),
@Result(name="input", location="/jsp/index.jsp")
})
public class EmployeeAction extends ActionSupport{
private String name;
private int age;
@Action(value="/empinfo")
@Override
public String execute() throws Exception {
return SUCCESS;
}
@RequiredFieldValidator(message="The name is required.")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@IntRangeFieldValidator(message="Age must be in between 28 and 65",
min = "29", max = "65")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4). 配置文件web.xml
StrutsAnnoTest
index.html
index.htm
/jsp/index.jsp
default.html
default.htm
default.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts.devMode
true
struts2
/*