拦截器
interceptor(拦截器):拦截action,类似过滤器filter。
区别:
过滤器:过滤从客户端向服务器发送的请求或拦截从服务器端向客户端的响应。
拦截器:拦截客户端对action的访问。所以不能拦截jsp和html,可以拦截到action中具体的方法。
拦截器的地位:strut2框架的核心功能都是依赖拦截器实现的。那么怎么执行的呢?
在com.opensymphony.xwork2.DefaultActionInvocation.class中有一个invoke方法,这个方法便是拦截器的核心方法,也可以说是struts2的核心方法。

Struts2的执行流程
首先会从客户端发送过来一个请求,请求到达核心过滤器StrutsPrepareAndExecuteFilter,这个过滤器就有预处理init()和执行doFilter()。在foFilter方法中执行executeAction()方法,在这个方法的内部调用了dispatcher.serviceAction()方法,在这个方法的内部创建了Action的代理,最终执行的是Action代理中的execute(),在execute()方法中调用ActionInvocation的invoke()方法。在这个方法中递归执行一组拦截器,这组拦截器完成部分功能,如果没有拦截器了就执行目标Action,再根据Result的返回结果完成页面的跳转,会倒序执行拦截器,最终响应到页面。

对拦截器进行配置
1.自定义拦截器
编写一个类继承AbstractInterceptor或实现Interceptor接口。再在struts.xml文件中进行拦截器的定义以及引入操作。
配置struts环境的步骤这里不再举例了,下面是自定义拦截器的步骤:
①定义两个拦截器
public class InterceptorDemo1 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("InterceptorDemo1执行了...");
String invoke = invocation.invoke();
System.out.println("InterceptorDemo1执行结束了...");
return invoke;
}
}
public class InterceptorDemo2 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("InterceptorDemo2执行了...");
String invoke = invocation.invoke();
System.out.println("InterceptorDemo2执行结束了...");
return invoke;
}
}
②创建被拦截的action的类
public class ActionDemo1 extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("actionDemo1执行了");
return super.execute();
}
}
③配置struts.xml文件
<package name="demo1" extends="struts-default" namespace="/">
<!-- 定义拦截器============== -->
<interceptors>
<interceptor name="interceptorDemo1"
class="com.aloha.web.interceptor.InterceptorDemo1" />
<interceptor name="interceptorDemo2"
class="com.aloha.web.interceptor.InterceptorDemo2" />
</interceptors>
<action name="actionDemo1" class="com.aloha.web.action.ActionDemo1">
<!-- 引入拦截器================= -->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="interceptorDemo1"/>
<interceptor-ref name="interceptorDemo2"/>
<result>demo1/demo1.jsp</result>
</action>
</package>
执行结果:

2.自定义拦截器栈
这种方式使用多个拦截器,引入方便:
定义拦截器栈:
<interceptors>
<interceptor name="interceptorDemo1"
class="com.aloha.web.interceptor.InterceptorDemo1" />
<interceptor name="interceptorDemo2"
class="com.aloha.web.interceptor.InterceptorDemo2" />
<!-- 2_定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="interceptorDemo1"/>
<interceptor-ref name="interceptorDemo2"/>
</interceptor-stack>
</interceptors>
引入拦截器栈:
<action name="actionDemo1" class="com.aloha.web.action.ActionDemo1">
<!-- 2_引入拦截器栈 -->
<interceptor-ref name="myStack"/>
<result>/demo1/demo1.jsp</result>
</action>
注意:自定义拦截器后,默认拦截器(defaultStack)会失效,所以我们在引入拦截器的时候也需要把默认拦截器引入,否则会丢失默认的拦截功能!!!struts2框架就废了!!!若是拦截器栈,则把默认拦截器加入拦截器栈中,引入拦截器栈即可。
拦截器的设计思想:拦截器可以用来做权限校验的功能,他也是可以根据我们的需求进行添加和去除的,不会影响程序的运行。
标签库(不是重点)
由两部分组成:通用标签库和UI标签库。UI标签库可进行方便的标签回显。

一组if-elseif-else示例:
<s:set var="i" value="6" scope="request" />
<s:if test="#request.i>3" >
i 大于 3
</s:if>
<s:elseif test="#request.i<3">
i 小于 3
</s:elseif>
<s:else>
i 等于 3
</s:else>
iterator遍历的用法:
遍历集合:
<s:iterator var="i" value="{'aa','bb','cc'}">
<s:property value="#i"/>
</s:iterator>
<hr/>
类似foreach方法的遍历map集合:
<s:iterator var="entry" value="#{'aaa':'111','bbb':'222','ccc':'333' }">
<s:property value="#entry.key"/>=<s:property value="#entry.value"/>
</s:iterator>
<hr/>
类似普for循环:
<s:iterator var="i" begin="1" end="10" step="1">
<s:property value="#i"/>
</s:iterator>
<hr/>
类似普for循环带status判断:
<s:iterator var="i" begin="100" end="300" step="5" status="status">
<s:if test="#status.count % 3 == 0"><!-- 如果i对三取余为0,则字体为红色 -->
<font color="red"><s:property value="#i"/></font>
</s:if>
<s:else>
<s:property value="#i"/>
</s:else>
</s:iterator>
status的属性有判断功能,参见:https://blog.csdn.net/fygkchina/article/details/8767924?utm_source=jiancool
UI标签的好处:我们在提交表单和用户登录的时候,如果填写的完成提交的时候有一个数据错误,那么需要重新输入的时候,因为UI标签库回显方便,所以我们可以用它来将正确的数据重新回显,只把错误数据框清空就OK了。不会也不影响开发。

小的表单demo:
<h3>UI标签表单</h3>
<!-- theme="simple"属性不使用UI样式,可以修改struts2常量来给所有表单不适用UI样式 -->
<s:form action="" method="post" >
<s:hidden ></s:hidden>
<s:textfield name="name" label="用户名" />
<s:password name="password" label="密码" />
<s:radio list="{'男','女'}" name="sex" label="性别" />
<s:textfield name="age" label="年龄" />
<s:select list="{'北京','上海','广州','深圳'}" name="city" label="籍贯" headerKey="" headerValue="--请选择--" />
<s:checkboxlist list="#{'basketball':'篮球','football':'足球','volleyball':'排球','tennis':'网球' }" name="hobby" label="爱好" />
<s:textarea name="introduce" label="自我介绍" cols="40" rows="10" value="在这里填写自我介绍" />
<s:submit value="提交" />
</s:form>
结果(自动带样式了~):

UI标签库的回显便利性演示
jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<h3>UI标签表单</h3>
<!-- theme="simple"属性不使用UI样式,可以修改struts2常量来给所有表单不适用UI样式
showPassword="true"则密码回显
-->
<s:form action="uIActionDemo" method="post" namespace="/">
<s:hidden ></s:hidden>
<s:textfield name="name" label="用户名" />
<s:password name="password" label="密码" showPassword="true"/>
<s:radio list="{'男','女'}" name="sex" label="性别" />
<s:textfield name="age" label="年龄" />
<s:select list="{'北京','上海','广州','深圳'}" name="city" label="籍贯" headerKey="" headerValue="--请选择--" />
<s:checkboxlist list="#{'basketball':'篮球','football':'足球','volleyball':'排球','tennis':'网球' }" name="hobby" label="爱好" />
<s:textarea name="introduce" label="自我介绍" cols="40" rows="10" value="在这里填写自我介绍" />
<s:submit value="提交" />
</s:form>
</body>
</html>
实体:
package com.aloha.domain;
/**
* 实体
* @author malaganguo
*
*/
public class User {
private String name;
private String password;
private String sex;
private Integer age;
private String city;
private String[] hobby;
private String introduce;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getIntroduce() {
return introduce;
}
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
}
Action页面:
package com.aloha.web.action;
import com.aloha.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 模式驱动封装数据
* @author malaganguo
*
*/
public class UIActionDemo extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public User getUser() {
return user;
}
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
配置struts.xml:
<?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">
<struts>
<constant name="struts.action.extension" value="action" />
<package name="demo1" extends="struts-default" namespace="/">
<action name="uIActionDemo" class="com.aloha.web.action.UIActionDemo">
<result name="input">/demo2/demo3.jsp</result>
</action>
</package>
</struts>
结果演示:
提交前后比较:



数据均以进栈了~
struts2的黑马课程学习到此结束~
Struts2拦截器与标签库详解
本文详细介绍了Struts2框架中的拦截器概念及其配置方法,包括自定义拦截器和拦截器栈的实现过程,并展示了Struts2标签库的基本使用方法。
2851

被折叠的 条评论
为什么被折叠?



