struts2 入门2:struts配置相关与拦截器

14 篇文章 0 订阅

一.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.1
8080   端口
/           E:\apache-tomcat-6.0.16\webapps

testPath      项目


/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!execute  
http://localhost:8080/day29/demo!add
http://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方法执行完毕后,依次回到各个拦截器!


*这是本人学习时做的笔记,如有错误或不足,请指出,一起探讨,谢谢!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值