1.strusts2概念
struts2是在webwork2基础上发展过来的。其优点:
① 在软件设计上Struts2没有像struts1那样跟Servlet API和Struts API有有着紧密的耦合,struts2的应用可以不依赖于servlet API和struts API.Struts2 这种设计属于无嵌入式设计,而Struts1这种设计属于嵌入式设计。
② Struts提供了拦截器,利用拦截器可以进行AOP编程,可以进行权限编程
③ Struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型
④ Struts2提供了多种表现层技术 如:jsp、freeMarke
⑤ Struts2的输入校验可以对指定方法进行校验,解决啦struts1的长久之痛
⑥ 提供了全局范围、包范围和action范围的国际化资源文件管理实现
2.搭建Struts2的开发环境
① 找到开发struts2应用需要使用到jar文件
② 编写struts2的配置文件(默认的配置文件struts.xml),该文件应放在WEB-INF/classes,开发中放在src文件夹里
③ 在web.xml中加入Struts2 MVC的框架启动配置(是通过filter启动的)如果struts2版本是2.1.3之前的则filter类是org.apache.struts2.dispatcher.FilterDispatcher,如果是往后的,则filter是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
3.struts2中配置Struts.xml配置的包介绍
<package name="ali" namespace="/test" extends="struts-default">
<action name="helloword" class="" method=”execute”>
<result name="sucess">/WEB-INF</result>
</action>
</package>
讲解:在struts2框架中使用包来管理action,包的作用和java中的类包非常类似,主要用于管理一组业务功能相关的action.
配置包时必须指定name属性,改name属性值可以任意取名,但必须唯一,如果其它包要继承该包,必须通过该属性进行引用。包的namespace属性必须定义该包的命名空间,命名空间作为访问该包下action的路径的一部分,如访问上面的例子的Action,该访问路径为:/test/helloword.action.namespace属性可以不配置,如果不指定该属性,默认的命名空间是“”.
通常每个包都应该继承struts-default包,因为struts很多核心功能都是拦截器来实现。Struts-default包定义了这些拦截器和result类型。可以这么说,当包继承了struts-default才能使用struts2的核心功能。
4.Action名称的搜索顺序例如:url路径为:http://server/struts2/path1/path2/path3/test.action
会先寻找namespace为/path1/path2/path3的package,如果不存在这个包,则会寻找namepace为/path1/path2下的package,以此类推。如果在/path1/path2/path3里没有找到test.action,则会到默认的namespace的package里面去找。默认的命名空间是“”。
5.Action配置中的各项默认值
如果没有为action指定class,默认是Action Support
如果没有为action指定method,默认执行action中的execute()方法
如果没有指定result的name属性,默认值为success
6.Action中result的各种转发类型
<action name=”helloword” class=”具体Action路径”>
<result name=”success”>/WEB-INF/page/hello.jsp</result>
</action>
在result配置类似于struts1中的forward,但struts2中提供了多种结果的类型,常用的类型有:type=”dispatcher”(内部转向,默认的)或者redirect(重定向)、redirectAction(Action)、 plainText(原代码呈现)。
在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:<resulttype=”redirect”>/view.jsp?Id=${id}</result>
如果重定向的action在别的命名空间下:
<result type=”redirectAction”>
<paramname=”actionName”>helloword</param>
<paramname =”namespae”>/test</param>
</result>//需要配置另一个包的名字和空间域
一个package中的全局results<global-results></global-results>
为Action的属性注入值,在是在action中配置param如:
<action ....><param name=”xxx”>xxxValue</action>。
需要在action中写上属性xxx,并有getXxx()和setXxx方法();
7.struts2 常用的常量(1)struts.i18n.encoding=UTF-8
指定默认编码
用法: <constant name="struts.i18n.encoding" value="UTF-8" />
(2)struts.action.extension 指定Struts 2处理的请求后缀,默认值是action,即所有匹配*.action的请求都由Struts2处理,如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开 用法:<constant name="struts.action.extension" value="do" /> 或者 <constant name="struts.action.extension" value="do,action" /> (3)struts.configuration.xml.reload 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 用法:(4)struts.devMode开发模式下使用,默认为false,设置成true,这样可以打印出更详细的错误信息,有助于查找到错误,在开发的时候建议开启,项目发布之后改成false<constant name="struts.devMode" value="true" /><constant name="struts.configuration.xml.reload" value="true" />
(5)struts.multipart.saveDir指定上传文件时的临时目录,默认使用 javax.servlet.context.tempdir用法:<constant name="struts.multipart.saveDir" value="/tmpuploadfiles" />(6)struts.multipart.maxSize该属性指定Struts 2文件上传中整个请求内容允许的最大字节数 默认为2M用法:<constant name="struts.multipart.maxSize" value="2097152" />(7)struts.ui.theme默认的视图主题,可以为simple,xhtml或ajax用法:<constant name="struts.ui.theme" value="simple" />(8)struts.ui.theme默认的视图主题,可以为simple,xhtml或ajax用法:<constant name="struts.ui.theme" value="simple" />(9)struts.serve.static.browserCache设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭用法:<constant name="struts.serve.static.browserCache" value="false" />(10)struts.serve.static.browserCache设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭用法:<constant name="struts.serve.static.browserCache" value="false" />(11)struts.enable.DynamicMethodInvocation设置是否支持动态方法调用,true为支持,false不支持.用法:<constant name="struts.enable.DynamicMethodInvocation" value="true" />8.struts2的处理流程
StrutsPrepareAndExecuteFilter是struts2 框架的核心控制器,负责拦截有<url-pattern>/*</url-pattern>指定的所有用户的请求。
当用户请求到达时,该filter会过滤用户的请求。默认情况下,如果请求的路径不带后缀或者后缀以.action结尾,则请求将转入Struts 2框架处理,否则Struts2框架将略过请求的处理。与Struts1不同,Struts2对用户的每一次请求都会创建一个action,所以Struts2中的action是线程安全的。
其Struts2在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>
9.为引用指定多个struts配置文件
我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其它配置文件,下面的struts.xml通过<include>元素指定多个配置文件。
<struts>
<include file=”struts-user.xml”>
</struts>
10.动态方法调用和使用通配符
禁止动态方法调用方法(一般建议不适用动态方法):
<constant name=”struts.enable.DynamicMethodInvocation” value=”false”>
使用通配符获取方法:例如:
<action name=”list_*” class=”类的路径” method={1}>//{1}就等于*代表的字符串