一.struts配置
1.struts路径浅解
<package name="config" namespace="/demo" extends="struts-default">
<action name="add" class="cn.struts.c_config.DemoAction" method="add">
<result name="success">/index.jsp</result>
</action>
</package>
访问路径:
http://localhost:8080/testPath/demo/add OK
http://localhost:8080/testPath/demo/a/b/add OK
http://localhost:8080/testPath/demo/b/add OK
http://localhost:8080/testPath/demo/add/a NOK 错误!
===如:
路径匹配:
http://localhost:8080/testPath/demo/a/b/add
localhost 12.0.0.18080 端口/ E:\apache-tomcat-6.0.16\webappstestPath 项目
/demo/a/b/add 访问资源
--> 获取名称空间:
---->/demo/a/b; 匹配struts.xml,没有找到
---> /demo/a 匹配struts.xml,没有找到
---> /demo 找到,进入当前package
---> /add 配置add对应的Action,执行设置的方法
2.struts配置通配符
<package name="config" namespace="/demo" extends="struts-default">
<!--
<action name="add" class="cn.struts.c_config.DemoAction" method="add">
<result name="add">/index.jsp</result>
</action>
<action name="update" class="cn.struts.c_config.DemoAction" method="update">
<result name="update">/index.jsp</result>
</action>
<action name="delete" class="cn.struts.c_config.DemoAction" method="delete">
<result name="delete">/index.jsp</result>
</action>
-->
<!-- 很多配置都是重复的-->
<!-- 用通配符简化配置 -->
<action name="demo_*" class="cn.struts.c_config.DemoAction" method="{1}">
<result name="{1}">/c/{1}.jsp</result>
</action>
<!-- 访问: http://localhost:8080/day29/demo/demo_add
会找demo的Action下的add方法,根据返回值,跳转到add.jsp页面.
即demo_ 后面的*被什么取代了,占位符{1}就是什么
-->
</package>
3.struts配置的常用的常量
常用的常量:指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出<constant name="struts.i18n.encoding" value="UTF-8"/>
自定义后缀修改常量<constant name="struts.action.extension" value="do"/>
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭<constant name="struts.serve.static.browserCache" value="false"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开<constant name="struts.configuration.xml.reload" value="true"/>
开发模式下使用,这样可以打印出更详细的错误信息<constant name="struts.devMode" value="true" />
默认的视图主题 (struts标签)<constant name="struts.ui.theme" value="simple" />
与spring集成时,指定由spring负责action对象的创建<constant name="struts.objectFactory" value="spring" />
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false一般设置为false,访问路径更安全/合理<constant name="struts.enable.DynamicMethodInvocation" value="false"/><!--如果开启动态方法调用:http://localhost:8080/day29/demo!executehttp://localhost:8080/day29/demo!addhttp://localhost:8080/day29/demo!delete表示访问demo这个action中的execute方法,符号“!” 后面即方法名称!-->
上传文件的大小限制<constant name="struts.multipart.maxSize" value=“10701096"/>
二.拦截器
1.基本概念
a.概念:interceptor
可以在请求到达Action之前进行拦截,从而处理一些特性业务.struts总定义了32个拦截器:可在struts-default.xml中查看.默认执行defaultStack中有18个.struts的功能都要在拦截器的基础上实现.
b.拦截器栈
为了方便拦截器的引用,struts支持栈的技术.一个拦截器栈包含多个拦截器.若想使用定义的拦截器,则需要报其拦截器加到拦截器栈中.(拦截器栈相当于项目里的一个有特殊作用的文件夹,要想在项目里使用拦截器,必须把拦截器放到该文件夹中)
c.拦截器的作用
struts通过拦截器完成一些通用的功能,如:请求数据的封装/文件上传/数据校验/数据类型转换等操作.
d.细节
拦截器如果没有指定,默认执行默认的拦截器栈(defaultStack),如果一旦指定了执行的拦截器栈,默认的就不会执行.(所以一般都会把默认拦截器加到自定义拦截器中)
e.拦截器与过滤器
拦截器:是struts的一门技术,只能在struts中使用.只能拦截Action请求.过滤器:是servlet中的技术.可用在普通的servlet项目中,也可以在struts的项目中.(可用在web项目中)
但拦截器与过滤器又有许多相似的地方,如执行流程.
f.拦截器会被核心过滤器调用
2.拦截器Api
|-- interface Interceptor 拦截器接口
|-- abstract Class AbstactInterceptor 提供自定义拦截器父类
|-- void destroy() 服务器停止时,销毁拦截器|-- void init() 服务器启动时,初始化拦截器|-- abstract String intercept(ActionInvocation invocation) 每次访问时,都会调用此方法(拦截器类似过滤器)
3.拦截器配置(struts.xml)
<span style="white-space:pre"> </span><interceptors>
<span style="white-space:pre"> </span><!-- 定义拦截器 -->
<span style="white-space:pre"> </span><interceptor name="[拦截器名]" class="[拦截器对应的类]"/>
<span style="white-space:pre"> </span><interceptor name="[拦截器名]" class="[拦截器对应的类]"/>
<span style="white-space:pre"> </span><!-- 可多个-->
<span style="white-space:pre"> </span><!-- 将拦截器添加到拦截器栈中 -->
<span style="white-space:pre"> </span><interceptor-stack name="[拦截器栈名]">
<span style="white-space:pre"> </span><!-- 添加默认栈到自定义栈,因为许多功能在默认的拦截器中已经实现了 -->
<span style="white-space:pre"> </span><interceptor-ref name="defaultStack"/>
<span style="white-space:pre"> </span><interceptor-ref name="[上面定义的拦截器中,需要放到这个拦截器栈的拦截器名]"/>
<span style="white-space:pre"> </span><!-- 可多个,添加多个 -->
<span style="white-space:pre"> </span></interceptor-stack>
<span style="white-space:pre"> </span></interceptors>
<!-- 声明要执行的拦截器栈 -->
<default-interceptor-ref name="[要执行的拦截器名]"/>
<!-- 若不声明,默认执行默认的拦截器栈 -->
4.自定义拦截器
a.定义拦截器类,实现Interceptor接口(这项目是为了 了解拦截器的执行流程)
public class HelloInterceptor implements Interceptor{
public HolleInterceptor(){
//1.启动时,创建拦截器对象
System.out.println("创建拦截器实例!");
}
@Override
public void init(){
//2.创建拦截器对象后,执行init()初始化方法
System.out.println("HelloInterceptor.init()");
}
@Override
public String intercept(ActionInvocation invocation) throw Exception{//与过滤器类似
System.out.println("HelloInterceptor.intercept()");
//3.每次访问/执行Action前,处理请求
String result = invocation.invoke();
//若已没有下一个拦截器,放行,执行当前运行的/准备执行的Action中的execute()方法(或配置中声明的默认方法)
//若还有下一个拦截器,执行下一个拦截器(顺序与,拦截器栈中的顺序一致)
//都执行完后,依次返回,然会,根据Action中的返回值,按照配置跳转
//若拦截器放行,拦截器的返回值,不会应影响跳转
//获取域对象,预处理请求
ActionContext ac = invocation.getInvocationContext();//获取ActionContext
Map<String, Object> application = ac.getApplication();//获取application
Map<String, Object> request = ac.getContextMap();//获取request
Map<String, Object> session = ac.getSession();//获取session
return result;
//若拦截器不放行,会根据拦截器的返回值跳转
}
@Override
public void destroy(){
//服务器停止时执行
System.out.println("HelloInterceptor.destroy()");
}
}
b.配置拦截器(struts.xml)
<struts>
<package name="interceptor" extends="struts-default">
<!-- 1. 拦截器配置 -->
<interceptors>
<!-- 1.1 配置自定义的拦截器 -->
<interceptor name="hello" class="cn.struts.h_interceptor.HelloInterceptor"></interceptor>
<!-- 1.2 定义拦截器栈 -->
<interceptor-stack name="myStack">
<!-- a. 先引入默认的拦截器栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- b. 在引入自定义拦截器 -->
<interceptor-ref name="hello"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 2. 执行拦截器 -->
<!-- 如果没有执行拦截器,默认就执行默认的拦截器栈; 一旦配置了执行哪个拦截器栈,默认栈就不执行! -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!-- 全局视图 -->
<global-results>
<result name="success">/index.jsp</result>
<result name="test">/test.jsp</result>
</global-results>
<!-- Action配置 -->
<action name="user" class="cn.struts.h_interceptor.UserAction">
</action>
</package>
</struts>
c.拦截器执行流程简单叙述
服务器启动:
1). 创建Interceptor拦截器实例2). 执行拦截器init()初始化方法
用户访问:
3). 创建Action实例4). 执行拦截器的intercept()方法, 处理拦截器业务5). 执行invocation.invoke();
--执行下一个拦截器--执行Action类的execute()方法 (如果没有下一个拦截器)
6). 执行Action动作类的业务方法,如:execute()7). execute方法执行完毕后,依次回到各个拦截器!
*这是本人学习时做的笔记,如有错误或不足,请指出,一起探讨,谢谢!