本文将从自己学习应用过程中进行总结:
一、简介:
struts的英文单词意思是:支柱支干,来源于建筑和就是飞机使用的金属支架,struts是流行和成熟的基于MVC设计模式的Web应用程序框架。使用struts可以减少我们在运用MVC设计模式来开发Web应用的时间。
二、工作原理:
struts2的工作原理图:
我的理解是:一个从页面发过来的HttpServletRequest,首先要经过一系列的filter,其中ActionContextCleanUp是一个可选项,然后经过一些其他用于与其他框架结合的filter是可选的,然后是到达struts2的核心处理器,在2.3之前的版本名字叫FilterDispatcher之后叫StrutsPrepareAndExecuteFilter(原因是:StrutsPrepareAndExecuteFilter是支持执行action之前添加filter),经过核心filter后,只有.action的请求可以到达actionMapper找到对应的action返回到StrutsPrepareAndExecuteFilter,然后执行到ActionProxy,ActionProxy通过ConfigurationManaer去读struts.xml找到对应的action类,然后通过ActionProxy代理创建ActionInvocation(action实例),然后通过一系列的自定义的拦截器执行action返回result,得到对应的视图(Template),然后在通过一系列的自定义拦截器到达HttpServletResponse返回到页面。
三、struts2的配置;
我的应用中是采用的是maven管理jar包,如果没有则需要asm-3.3.jar、asm-commons-3.3.jar、asm-tree-3.3.jar、commons-fileupload-1.3.1.jar、commons-io-2.2.jar、commons-lang3-3.2.jar、freemarker-2.3.22.jar、javassist-3.11.0.GA.jar、log4j-api-2.2.jar、log4j-core-2.2.jar、ognl-3.0.6.jar、struts2-core-2.3.24.1.jar、xwork-core-2.3.24.1.jar,maven配置如下:
<!-- struts的坐标 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.28</version>
</dependency>
在we.xmlb配置StrutsPrepareAndExecuteFilter,web应用加载StrutsPrepareAndExecuteFilter,StrutsPrepareAndExecuteFilter加载struts2框架,详细如下:
<!-- strturs框架的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<!-- StrutsPrepareAndExecuteFilter路径 -->
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 过滤全部请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
然后配置struts.xml,其包括:1、全局属性,2、用户请求和Action之间的对应关系,3、Action可能用到的参数和结果,4、各种拦截器的配置。简单配置及其注解如下
<?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"><!--文件描述 采用2.3dtd校验文件 -->
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" /><!-- constant标签是配置全局属性,这里意思是关闭动态action -->
<constant name="struts.devMode" value="true" /><!-- 开发者模式是否开启,开启后明显的提高开发效率,能获得更多日志或debug信息,性能方面会降低。所以struts默认的是非开发模式。设置为开发模式之后
1、每次请求都会重新加载资源文件,所以当对properties文件进行修改后,下一次请求是就能够反映相应的变化。(struts.i18n.reload = true也可以达到相同的效果)
2、每次请求的时候也会重新加载xml配置文件、验证文件等,这样可以方便调试或者修改相应的配置文件,而不用重新部署重启web服务器。(struts.configuration.xml.reload = true 也可以达到相同的效果)
-->
<!--
name : package的名字(可以随便命名)
namespace命名空间 请求uri的前缀
extend 继承别的包
-->
<package name="default" namespace="/" extends="struts-default">
<!-- uri匹配name的属性值后,没有指定处理类,就交给ActionSupport的execute()方法处理,返回一个字符串success
默认处理类 ActionSupport
默认处理方法 execute()
自定义处理类: 通过属性class设置
自定义处理方法:通过属性method设置
name : 请求的uri的后缀
class 请求资源的处理类名
-->
<action name="hello" class="com.yc.struts2.action.MyAction" method="myMethod" ><!-- 采用自己定义的方法返回字符串fail-->
<!-- result的属性name的默认值是success, 作用是actiongn与请求处理方法执行后的结果进行匹配,分发页面
默认页面跳转:dispatcher转发
自定义转发方式:通过result属性type来设置
常用的type值有:
chain:转发到另一个XXXAction
dispatcher:转发到另一个页面XXXX.jsp ,XXX.html
redirect: 重定向到另一个页面XXX.jsp XXX.html
redirectAction : 重定向到另一个XXXAction
-->
<result name="show" >/show.jsp</result>
<result name="fail" type="redirect">/fail.jsp</result>
<result>/index.jsp</result>
</action>
</package>
</struts>
四、简单例子:
结合上面的配置对应的Action处理类
public class MyAction {
public String execute() throws Exception{
System.out.println("我是默认方法。。。。");
return "show";
}
public String myMethod() throws Exception{
System.out.println("我是自定义方法。。。。");
return "fail";
}
}
ur例子
项目名/hello