欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2学习之拦截器

程序员文章站 2022-05-28 17:06:22
...

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>
相关标签: Struts2拦截器

上一篇: pymongo的使用

下一篇: Pymongo使用