Struts框架是流行广泛的一个MVC开源实现,而Struts2是Struts框架的新一代产品,是将Struts1和WebWork两种技术进行兼容、合并的全新的
MVC框架。Struts2框架充分发挥了Struts1和WebWork这两种技术的优势,抛弃原来Struts1的缺点,使得Web开发更加容易。
工作流程:
(1)客户端浏览器发送HTTP请求到Web应用
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。ActionContextCleanUp作用
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result
(7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应
- 指定命名空间,不存在则往下搜索
- 默认命名空间,不存在则往下搜索
- 报错
MVC框架。Struts2框架充分发挥了Struts1和WebWork这两种技术的优势,抛弃原来Struts1的缺点,使得Web开发更加容易。
工作流程:
(1)客户端浏览器发送HTTP请求到Web应用
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。ActionContextCleanUp作用
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result
(7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应
(8)HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端
在web.xml中配置核心控制器StrutsPrepareAndExecuteFilter
<!-- 配置StrutsPrepareAndExecuteFilter核心控制器 -->
<filter>
<!-- 过滤器名 -->
<filter-name>struts2</filter-name>
<!-- StrutsPrepareAndExecuteFilter核心控制器的实现类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<!-- 过滤器名 -->
<filter-name>struts2</filter-name>
<!-- 过滤器过滤所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
在src下创建struts.xml配置文件
<struts>
<!-- 指定Struts2处于开发阶段,可以进行调试 -->
<constant name="struts.devMode" value="true"/>
<!-- Struts2的Action都必须配置在package里。这里使用默认的package -->
<package name="default" namespace="/" extends="struts-default">
<action name="register" class="action.RegisterAction">
<!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
<!--
<result name="success">/result.jsp</result>
<result name="error">/error.jsp</result>
-->
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
其中常用属性如下:
(1)name
指定包的名字,当存在多个包时作为唯一标识
(2)extends
指定包所继承的其他包。
struts-default是Struts2框架默认的抽象包,包含了大量结果类型的定义、拦截器及其引用定义等,是配置Action的基础,因此定义包时都要继承struts-default包。
定义时,父包要先于子包;Action相同,后面的覆盖前面
(3)namespace
指定包的命名空间,没有指定namespace值则为默认命名空间”/”
Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action
- 指定命名空间,不存在则往下搜索
- 默认命名空间,不存在则往下搜索
- 报错
Struts2 的传值方式---ModelDrivern 传值
Struts 文件的配置
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="ModelDrivenAction" class="com.hp.action.ModelDrivenAction"
method="addUser">
<result name="success">UserPage.jsp</result>
</action>
</package>
</struts>
User bean类
package com.hp.bean;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
ModelDrivenAction 类
package com.hp.action;
import com.hp.bean.User;
import com.opensymphony.xwork2.ModelDriven;
public class ModelDrivenAction implements ModelDriven<User> {
private User user;
private String addUser() {
System.out.println("ID:" + user.getId());
System.out.println("username:" + user.getUsername());
System.out.println("password" + user.getPassword());
return "success";
}
@Override
public User getModel() {
if (user == null) {
user = new User();
}
return user;
}
}