Struts2学习之拦截器
Struts2框架 之 拦截器
过滤器:自动登录
/* 所有请求
LoginServlet。退出
拦截器:相当于过滤器,插件式-针对方法
登录:管理操作之前,做权限判断
Struts2标签 jstl标签
创建拦截器
1.方式一:实现Interceptor接口
package a_interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
// 方式一:实现Interceptor接口
public class MyInterceptor1 implements Interceptor {
@Override
// 对象销毁时调用
public void destroy() {
}
@Override
// 对象创建初始化时调用
public void init() {
}
@Override
// 核心拦截方法
public String intercept(ActionInvocation invocation) throws Exception {
// Action前处理
System.out.println("MyInterceptor1");
// 放行 - 下一个拦截器
invocation.invoke();
// Action后处理
// 返回值
return null;
}
}
2.方式二:继承AbstractInterceptor类
package a_interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
// 方式二:继承AbstractInterceptor类
public class MyInterceptor2 extends AbstractInterceptor {
@Override
// 核心拦截方法
public String intercept(ActionInvocation invocation) throws Exception {
// Action前处理
System.out.println("MyInterceptor1");
// 放行 - 下一个拦截器
invocation.invoke();
// Action后处理
// 返回值
return null;
}
}
3.方式三:继承MethodFilterInterceptor类(推荐使用)
package a_interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
// 方式三:继承MethodFilterInterceptor类
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("前处理");
// 放行
//invocation.invoke();
System.out.println("后处理");
// 放行后,返回值无效
// 如果不放行,返回值取代的就是Action中的返回值,指定结果
// return "error";
return invocation.invoke();
}
}
拦截器在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.devMode" value="true"></constant>
<package name="customer" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="permission" class="com.zzxx.crm.web.interceptor.PermissionInterceptor">
<param name="excludeMethods">login</param>
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="permission"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!-- 全局结果定义 -->
<global-results>
<result name="toLogin" type="redirect">/login.jsp</result>
</global-results>
<!-- 全局异常映射 -->
<global-exception-mappings>
<exception-mapping result="error" exception="com.zzxx.crm.exception.LoginException"></exception-mapping>
</global-exception-mappings>
<action name="CustomerAction_*" class="com.zzxx.crm.web.CustomerAction" method="{1}">
<result name="toList" type="redirectAction">CustomerAction_list</result>
<result name="list">/jsp/customer/list.jsp</result>
</action>
<action name="UserAction_*" class="com.zzxx.crm.web.UserAction" method="{1}">
<result name="success" type="redirect">/index.htm</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>
拦截器与Action的配置信息 必须写在 同一个 < package > < /package> 标签里,否则无法进行拦截
配置信息还需要依次填写 有先后顺序 标签也不能写错 否则都会造成 程序无法运行
< interceptor name=“permission”
class=“com.zzxx.crm.web.interceptor.PermissionInterceptor”>
< param name=“excludeMethods”>login</ param>
< /interceptor>
在这段代码中 excludeMethods 意思是 不包括这个 login 方法 就是对这个方法不进行拦截
如果将 excludeMethods 改成 includeMethods 意思就变成 只拦截这个方法
全局异常映射是在 程序 发生异常时 接收到 error 结果 然后将异常信息 返回到 指定地方
< !-- 全局异常映射 -->
< global-exception-mappings>
< exception-mapping result=“error”
exception=“com.zzxx.crm.exception.LoginException”>< /exception-mapping>
< /global-exception-mappings>
这段代码 就是程序 发生异常以后 有个 结果 是error 然后 转发到 前端,整体来说就是 在登录是 输入的账号密码与数据库不匹配 就会 在页面 显示 用户名或密码错误
详情我会在 另一个crm系统总结的 博客文章中 仔细描写
Struts2标签(了解)
TagAction.java
package b_tag;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class TagAction extends ActionSupport {
@Override
public String execute() throws Exception {
List<String> list = new ArrayList<String>();
list.add("lucy");
list.add("jack");
list.add("rose");
list.add("tom");
ActionContext.getContext().put("list", list);
this.addActionError("这是错误信息!!!很嚣张");
return SUCCESS;
}
}
Tag1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- OGNL表达式 -->
<s:if test="#list.size() == 3">
3
</s:if>
<s:elseif test="#list.size() == 4">
4
</s:elseif>
<s:else>
不3不4
</s:else>
<hr>
<s:iterator begin="1" end="100" step="1">
<!-- 每一次循环的值 -->
<s:property/> |
</s:iterator>
<hr>
<!-- 迭代ActionContext域中的list -->
<s:iterator value="#list" >
<!-- 每一次循环的值 -->
<s:property/> |
</s:iterator>
<hr>
<!-- 如果list中是对象,要取对象中的属性,需要中间变量 -->
<s:iterator value="#list" var="name" >
<!-- 每一次循环的值 -->
<s:property value="#name"/> |
</s:iterator>
<%-- <s:property value=""/> --%>
<s:actionerror/>
</body>
</html>
Tag2.jsp(有自带样式的好处)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- action:就是struts配置文件中定义的Action名字 -->
<!-- 好处1:自带样式 simple-没有样式,默认:xhtml -->
<!-- 好处2:自动回显 -->
<s:form action="tag" namespace="/" method="post"
theme="xhtml" >
<s:textfield label="用户名" name="username"></s:textfield>
<s:password label="密码" name="password"></s:password>
<s:checkboxlist list="{'抽烟', '喝酒', '烫头'}" name="hobby" label="爱好"></s:checkboxlist>
<s:checkboxlist list="#{1: '抽烟',2: '喝酒', 3:'烫头'}" name="hobby" label="爱好"></s:checkboxlist>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
上一篇: pymongo的使用
下一篇: Pymongo使用