Struts2简介
- 介绍
Struts1–>Struts2–>Spring MVC
Struts1(Apache)–>Webwork(opensymphony)–>Struts2(Apache)
2. 结构和流程
基于MVC结构(xwork),用于开发Java Web程序。
spring mvc
struts2 mvc
对比
StrutsPrepareAndExecuteFilter等价于DispatcherServlet
Action等价于Controller Result等价于ViewResolver
Struts2的基本使用
- 环境搭建
- 添加struts2开发包
- 添加src/struts.xml主配置文件
- 流程设计
请求–>Filter控制器–>Action–>Result–>响应/hello.action–>Filter控制器–>HelloAction–>Result(dispatcher)–>/WEB-INF/hello.jsp–>HTML界面响应
3. 流程的实现
- 编写Action
- 编写JSP
4. 流程的配置
- Filter控制器配置(web.xml)
<filter>
<filter-name>strutsmvc</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<!-- 默认加载src/struts.xml -->
</filter>
<filter-mapping>
<filter-name>strutsmvc</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
- Action配置(struts.xml)
<!-- name请求名;class是Action类名;method是Action方法名,默认execute -->
<action name="hello" class="cn.xdl.action.HelloAction">
<!--定义result-->
</action>
- Result配置(struts.xml)
/WEB-INF/hello.jsp
主控制器StrutsPrepareAndExecuteFilter
- 负责接收用户请求(一个请求创建一个Action)
- 负责调用Action中请求处理方法
- 负责根据Action返回值调用Result处理
- 默认情况下,Filter控制器只处理*.action或没有扩展名的请求,只有符合请求才能进入Action调用流程。
- 如果需要修改请求扩展名,可以在struts.xml中追加下面配置
<constant name="struts.action.extension" value="do"/>
- Filter查找Action时,按namespace精确匹配,没有会向父路径查找。例如/day01/a/b/hello,会查找namespace=/day01/a/b,没有时会继续查找/day01/a,再没有会继续查找/day01
Action
1.编写规则
请求处理方法
对应请求处理,固定格式如下:
public String xxx(){
//请求处理逻辑,调用Model组件
}
属性
可以接收请求参数、可以向响应JSP传值
public class HelloAction { private String msg;//在响应JSP中使用${msg} private List<City> cities; public List<City> getCities() { return cities; } public void setCities(List<City> cities) { this.cities = cities; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } //public String xxx(){} public String execute(){ System.out.println("执行了HelloAction"); msg = "欢迎学习Struts2"; cities = new ArrayList<City>(); cities.add(new City(1,"北京")); cities.add(new City(2,"沈阳")); cities.add(new City(3,"成都")); cities.add(new City(4,"上海")); return "success";//返回是result标识名,对应<result name="success"> } }
2.配置规则
<package>
<action name="请求名" class="类" method="方法名">
</action>
<action name="请求名">
</action>
</package>
//class属性不指定,默认调用ActionSupport类
public class ActionSupport{
public String execute(){
return "success";
}
}
例:
登录功能
页面跳转功能(显示登录页面)
如果没有业务处理逻辑,只是单纯的页面跳转,可以使用框架提供的ActionSupport组件。
/tologin.do–>Filter控制器–>ActionSupport
–>Result(dispatcher)–>/WEB-INF/login.jsp登录按钮处理
/login.do–>Filter控制器–>LoginAction
–>Result–>成功/WEB-INF/ok.jsp;失败/WEB-INF/login.jsp
Requst、Session、Application的使用
1. Map封装原理:
public class SessionMap extends AbstractMap{
private HttpSession httpSession;
public SessionMap(HttpServletRequest request){
httpSession = request.getSession();
}
public void put(Object key,Object value){
httpSession.setAttribute(key.toString(),value);
}
public Object get(Object key){
return httpSession.getAttribute(key.toString());
}
}
Map session = new SessionMap(request);
2. 使用建议
- Action对象使用,建议采用Aware接口注入
- Map类型接口:
RequestAware、SessionAware、ApplicationAware
- Servlet类型接口:
ServletRequestAware、ServletResponseAware、ServletContextAware
- Action对象以外使用,只能用ActionContext或ServletActionContext
- Map类型接口:用ActionContext获取
- Servlet类型接口:用ServletActionContext获取
请求–>filter控制器–>拦截器1/拦截器2–>Action–>Result–>拦截器2/拦截器1–>响应输出
内置拦截器
params:将请求参数从request提取,然后给Action属性赋值 defaultStack:默认执行的一个拦截器栈。
自定义拦截器
编写拦截器实现类,实现Interceptor接口(或者继承AbstractInterceptor)
在struts.xml中配置拦截器
<interceptors>
<interceptor name="myinter" class="cn.xdl.interceptor.MyInterceptor"/>
</interceptors>
3. 使用拦截器
<action name="list" class="listAction">
<interceptor-ref name="myinter"/>
<interceptor-ref name="defaultStack"/>
<result name="success" type="mydispatcher">
<param name="url">/WEB-INF/list.jsp</param>
</result>
</action>
提示:为Action指定了拦截器后,默认defaultStack拦截器不再执行,需要显式调用下。
熟悉框架主要组件
- StrutsPrepareAndExecuteFilter
- Action
- Result
- Interceptor
- ValueStack
熟悉框架组件功能和规则
StrutsPrepareAndExecuteFilter
1. 功能
主控制器(前端控制器),控制请求处理流程。
- 请求来进入Filter控制器
- Filter控制器创建ValueStack对象并初始化
- Filter控制器根据struts.xml调用defaultStack拦截器栈
- Filter控制器根据struts.xml调用Action处理
- Filter控制器会根据Action返回值+struts.xml调用Result处理
- Filter控制器销毁ValueStack对象信息
- Filter控制器将Result生成的响应信息输出
2. 规则
- 编写规则
public class MyFilter implements Filter{
public void doFilter(ServletRequest arg0,
ServletResponse arg1, FilterChain chain)
throws IOException, ServletException {
//判断请求扩名是否为.action或没有
// if(是Actoin请求){
// - Filter控制器创建ValueStack对象并初始化
// - Filter控制器根据struts.xml调用defaultStack拦截器栈
// - Filter控制器根据struts.xml调用Action处理
// - Filter控制器会根据Action返回值+struts.xml调用Result处理
// - Filter控制器销毁ValueStack对象信息
// - Filter控制器将Result生成的响应信息输出
// }else{
// chain.doFilter(arg0, arg1);//放过,调用jsp、jpg、js、css
// }
}
}
- 配置规则
<filter>
<filter-name>strutsmvc</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<!-- 默认加载src/struts.xml -->
</filter>
<filter-mapping>
<filter-name>strutsmvc</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Action
1. 功能
业务控制器,请求到达Action,Action可以获取到请求参数、可以调用Model组件处理请求、可以将处理结果返回。
- 一个请求对应一个Action对象
- 利用Action属性接收请求参数
- 利用Action属性返回处理结果
- 利用Action方法调用Model组件处理请求,默认方法名为execute
2. 规则
- 编写规则
public class xxxAction (extends ActionSupport){
//根据请求参数key定义属性
//根据传出结果类型定义属性
public String execute(){
//调用Model组件处理
}
}
- 使用Request、Session、Application对象
实现Aware接口、ActionContext、ServletActionContext
- 配置规则(struts.xml)
<package name="xx" namespace="/" extends="struts-default|json-default">
<action name="请求名" class="" method="">
</action>
</package>
Result
1. 功能
用于生成响应信息。(调用jsp生成响应hmtl、将action属性以json或字节流输出)
2. 规则
- 编写规则
public class XxxResult implements Result{
public void execute(ActionInvocation arg0) throws Exception {
//编写响应逻辑(调用jsp生成响应hmtl、将action属性以json或字节流输出)
}
}
配置规则
使用(熟悉)
<result name="Action方法返回值" type="result类型名">
<param > name="属性名">参数值</param> </result>
装配
<result-types> <result-type name="result类型名" class="result实现类"/> </result-types> </package>
Interceptor
1. 功能
拦截器可以对请求处理进行拦截,可以插入共通处理逻辑进去,也可以打断Action执行。
例如框架提供了大量的拦截器,封装了很多共通处理。典型的params、fileupload、defaultStack等
2. 规则
- 编写规则(基本掌握)
public class XxxxInterceptor implements Interceptor{
public String intercept(ActionInvocation ai)
throws Exception {
//插入逻辑或打断Action执行
ai.invoke();//执行Action,如果不调用就是打断执行
}
}
- 配置规则
使用配置(掌握)
<action>
<interceptor-ref name="拦截器名"/>
<interceptor-ref name="defaultStack"/>
<result>
</result>
</action>
- 装配配置
<package>
<interceptors>
<interceptor name="拦截器名" class="拦截器类"/>
</interceptors>
</package>
ValueStack
1. 作用
ValueStack被称为值栈。用于存储请求处理相关的数据对象。例如request、session、application、action、parameters等
存储结构如下:
2. 访问原理
利用OGNL工具解析ValueStack。Object Graphics Navigation Language对象图导航语言。
Ognl.getValue(“OGNL表达式”,context,root)
Ognl.setValue(“OGNL表达式”,context,root,value)
熟悉框架组件处理流程
- 请求来进入Filter控制器
- Filter控制器创建ValueStack对象并初始化
- Filter控制器根据struts.xml调用defaultStack拦截器栈
- Filter控制器根据struts.xml调用Action处理
- Filter控制器会根据Action返回值+struts.xml调用Result处理
- Filter控制器销毁ValueStack对象信息
- Filter控制器将Result生成的响应信息输出