一、Struts2拦截器概述
功能:在拦截器里面封装了很多struts2框架功能
struts2里有很多拦截器,每次执行默认的拦截器,不是每次都执行所用。
拦截器位置(默认): struts-core-2.3.24.jar --> struts-default.xml中的<interceptor-stack>标签
执行时机:在action对象创建之后,action的方法执行之前
1.2 拦截器底层原理(两个原理)
1)aop思想(Aspect Oriented Programming):面向切面编程。
解释:不修改源代码来扩展功能。一般使用动态代理来实现。
画图分析理解:
2)责任链模式:java多种设计模式之一
责任链模式:
情景理解:要执行多个操作(操作1,操作2,操作3)时,需要先完成操作1,再完成操作2,最终才能完成操作3.
过滤链:一个请求被多个过滤器进行过滤时,需要依次被每个过滤器放行才能完成请求。
1.3 aop思想和责任链模式对拦截器的应用过程
aop应用:在action方法执行之前执行默认拦截器。这个执行过程使用aop思想。
解释:在action中没有直接调用拦截器方法,而是使用配置文件方式进行操作
责任链模式应用:在执行多个拦截器时,需要依次通过每个拦截器,最终执行action中方法。此过程为责任链模式
画图分析应用流程:
1.4 重要概念(两个区别)
1 过滤器和拦截器区别
1)过滤器:过滤器理论上可以任意内容,比如html、jsp、servlet、图片路径
2)拦截器:拦截器只可以拦截action
2 Servlet和action区别
1)servlet默认第一次访问时候创建,创建一次,单实例对象
2)action每次访问时候创建,创建多次,多实例对象
二、自定义拦截器
作用:应付实际开发中的各种需求功能,而不仅局限于已struts2封装的功能。
实现步骤:
1)写类,继承 MethodFilterInterceptor类实现
2)重写类中 doIntercept 方法,实现拦截逻辑
3)让拦截器作用于action:通过配置文件方式实现。
自定义好处:也可让action里面某个的方法不进行拦截
通过源代码看拦截器底层结构
2.2 配置action和拦截器关系(注册拦截器)
步骤:
1)在要拦截的action标签所在的package标签里面声明拦截器
2)在具体的action标签里面使用声明的拦截器
3)struts2里面执行很多的默认拦截器,但是如果在action里面配置自定义拦截器,则默认的拦截器将不会执行。
解决:把默认拦截器手动使用一次
4)配置对action里面某些方法不进行拦截:
代码示例:
<package name="demo" extends="struts-default" namespace="/">
<!-- 1 声明拦截器 -->
<interceptors>
<interceptor name="拦截器类名" class="拦截器全路径(包名.类名)"></interceptor>
</interceptors>
<action name="customer_*" class="cn.itcast.action.CustomerAction" method="{1}">
<!-- 2 使用自定义拦截器 -->
<interceptor-ref name="拦截器类名">
<!-- 配置action里面某些方法不进行拦截
name属性值: excludeMethods
值:action不拦截的方法名称
-->
<!-- 4 配置对action里面某些方法不进行拦截 -->
<param name="excludeMethods">不拦截的方法名称</param>
</interceptor-ref>
<!-- 3 把默认拦截器手动使用一次 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="good">/login.jsp</result>
</action>
</package>
三、Struts2标签库
3.1 struts2标签
注:struts2标签只能使用在jsp页面中
1) s:property: 和ognl表达式在jsp页面中获取值栈数据
2) s:iterator: 获取值栈list集合数据,表示list集合
3) s:debug: 查看值栈结构和数据
3.2 struts2中对应的html表单标签
<body>
<!-- form标签 -->
<s:form>
<!-- 1 普通输入项 -->
<s:textfield name="username" label="username"></s:textfield>
<!-- 2 密码输入项 -->
<s:password name="password" label="password"></s:password>
<!-- 3 单选输入项 -->
<!-- value属性值和显示值一样的 -->
<s:radio list="{'女','男'}" name="sex" label="性别"></s:radio>
<!-- value属性值和显示值不一样的 -->
<s:radio list="#{'nv':'女','nan':'男'}" name="sex1" label="性别"></s:radio>
<!-- 4 复习输入项 -->
<s:checkboxlist list="{'吃饭','睡觉','敲代码'}" name="love" label="爱好"></s:checkboxlist>
<!-- 5 下拉输入框 -->
<s:select list="{'幼儿园','博士后','教授'}" name="college" label="学历"></s:select>
<!-- 6 文件上传项 -->
<s:file name="file" label="上传文件"></s:file>
<!-- 7 隐藏项 -->
<s:hidden name="hid" value="abcd"></s:hidden>
<!-- 文本域 -->
<s:textarea rows="10" cols="3" name="resume" label="简历"></s:textarea>
<!-- 8 提交按钮 -->
<s:submit value="提交"></s:submit>
<!-- 9 重置 -->
<s:reset value="重置"></s:reset>
</s:form>
</body>
效果图示: