一、struts2 简介
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
二、工作原理
客户端通过HttpServletRequest向Servlet容器提交一个请求,这个请求会经过一系列的过滤器,最终被struts核心过滤器StrutsPrepareAndExecuteFilter过滤。核心过滤器过滤以后,调用访问ActionMapping,决定是否调用某一Action,如果用户请求的是jsp页面或者是其他静态资源,不会调用某Action,否则ActionMapping会将控制权委派给ActionProxy,也叫Action代理,此时Action代理会通过一个ConfigurationManager也就是配置管理器对象加载struts核心配置文件,也就是struts.xml。如果在struts.xml找到需要创建的Action,ActionProxy会创建一个Action Invocation实例,Action Invocation包括一系列的拦截器和Action,先顺序执行一些列的拦截器,然后执行Action处理,返回一个结果,通过Result返回一个视图或者调用另外某个Action。当返回这个视图以后,将之前执行过的拦截器反向执行一遍,然后通过response响应客户端的请求。
三、操作步骤
1、在pom.xml中引入如下依赖
<!-- struts2 mvc -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.32</version>
</dependency>
2、配置WEB-INF/web.xml
<filter>
<filter-name>struts2</filter-name>
<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>
3、创建一个struts.xml文件,src/main/resources 目录下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" extends="struts-default">
<!-- 请求 index.action 跳转到 index.jsp -->
<action name="index">
<result>/index.jsp</result>
</action>
<!-- 请求 hello.action 访问HelloAction#execute 跳转到sucess.jsp -->
<!--
action节点method属性 默认值 execute
action节点class属性 默认值 com.opensymphony.xwork2.ActionSupport
result节点name属性 默认值 success
result节点type属性 默认值 dispatcher
-->
<action name="hello" class="com.mipo.controller.HelloAction" method="execute">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
3.1、常规方式配置让一个Action处理多个请求
<!-- General Method -->
<action name="savePersonAction" class="com.mipo.controller.PersonAction" method="savePerson">
<result name="save" type="dispatcher">/person/save.jsp</result>
</action>
<action name="modifyPersonAction" class="com.mipo.controller.PersonAction" method="modifyPerson">
<result name="modify" type="dispatcher">/person/modify.jsp</result>
</action>
<action name="removePersonAction" class="com.mipo.controller.PersonAction" method="removePerson">
<result name="remove" type="dispatcher">/person/remove.jsp</result>
</action>
<action name="triggerExceptionAction" class="com.mipo.controller.PersonAction" method="triggerException" />
3.2、通配符方式配置让一个Action处理多个请求
<!-- Wildcards Method -->
<action name="*PersonAction" class="com.mipo.controller.PersonAction" method="{1}Person">
<result name="{1}" type="dispatcher">/person/{1}.jsp</result>
</action>
3.3、动态方法(DMI)调用方式配置让一个Action处理多个请求
……
<!-- 启用动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
……
<package strict-method-invocation="true">
……
<!-- Dynamic Method Invocation -->
<action name="personController" class="com.mipo.controller.PersonAction" method="execute">
<result name="success" type="dispatcher">/person/success.jsp</result>
<result name="save" type="dispatcher">/person/save.jsp</result>
<result name="modify" type="dispatcher">/person/modify.jsp</result>
<result name="remove" type="dispatcher">/person/remove.jsp</result>
<allowed-methods>savePerson, modifyPerson, removePerson, triggerException</allowed-methods>
</action>
4、Result 的几种方式
4.1、dispatcher(默认值)
转发到某具体JSP页面,此处只能是JSP路径,不能是action地址。
<result>/main.jsp</result>
4.2、redirect
重定向到某具体JSP页面,此处可以是JSP页面,也可以是action地址。
<result type="redirect">/main.jsp</result>
4.3、chain
转发到某action
<result type="chain">
<param name="actionName">savePersonAction</param>
</result>
4.4、redirectAction
重定向到某action
<result type="redirectAction">
<param name="actionName">savePersonAction</param>
</result>