Struts2学习笔记四:Struts2拦截器学习、拦截器实现案例、Struts2标签学习

文章目录

      • 1. Struts2学习笔记四:拦截器学习
        • 1.1. struts.xml全局配置
        • 1.2. 利用OGNL表达式获取栈顶信息
        • 1.3. Struts2拦截器创建
        • 1.4. Struts.xml配置拦截器
      • 2. 案例一:登录拦截器
        • 2.1. 登录拦截器的用途
        • 2.2. 代码实现
        • 2.3. 解决登录页面出现在框架中,而不是出现在整个页面中的问题
      • 3. Struts通用标签

1. Struts2学习笔记四:拦截器学习

1.1. struts.xml全局配置

  1. 利用全局配置获取页面中抛出运行时异常信息
  • 运行时异常
if(existU==null) {
    throw new RuntimeException("用户名不存在");
}
if(!existU.getUser_password().equals(user.getUser_password())) {
    throw new RuntimeException("密码错误");
}
  • struts.xml配置
<global-exception-mappings>
    
    <exception-mapping result="error" exception="java.lang.RuntimeException">exception-mapping>
global-exception-mappings>
<result name="error" >/login.jspresult>
  • 将该异常的结果配置成error,如果出现了该异常就进入login.jsp页面。

1.2. 利用OGNL表达式获取栈顶信息

  1. 由于OgnlContext中的ROOT值栈存放的是访问的Action对象,可以在jsp页面中利用OGNL表达式获取Action中的信息方法是:
  • 添加标签
<%@ taglib prefix="s" uri="/struts-tags" %>
  • 添加debug标签查看值栈信息
<s:debug>s:debug>
  • 利用ognl表达式获取值栈信息

1.3. Struts2拦截器创建

  1. 通过实现interceptor创建拦截器
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor {
  • 有个问题,因为实现的是接口,那么该接口的方法必须实现,那么就是问题了,因为每次都要实现它的方法。
  1. 通过继承AbstractInterceptor 抽象类实现创建
//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor {
  1. 通过继承MethodFilterInterceptor实现定制拦截器,和doget,dopost方法类似。
//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
//	定制哪些方法需要拦截.
//	定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		//前处理
		System.out.println("MyInterceptor3 的前处理!");
		//放行
		String result = invocation.invoke();
		//后处理
		System.out.println("MyInterceptor3 的后处理!");
		return result;
	}
}
  • return 若表示不放行,直接跳转到一个结果页面,不执行后续的拦截器以及Action,直接交给Result处理结果.进行页面跳转。

1.4. Struts.xml配置拦截器

  1. 注册拦截器

<interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3">interceptor>
  • class是某个自定义拦截器类
  1. 注册拦截器栈

<interceptor-stack name="myStack">
    
    <interceptor-ref name="myInter3">
        
        
        <param name="includeMethods">add,deleteparam>
    interceptor-ref>
    
    <interceptor-ref name="defaultStack">interceptor-ref>
interceptor-stack>
  • 拦截器栈的引入包含自定义拦截器,和Struts2自带的拦截器,这些拦截器要放在自定义拦截器之后。
  1. 指定包中的默认拦截器栈

<default-interceptor-ref name="myStack">default-interceptor-ref>
  • 默认拦截器,意味着这个包中的action都会走这个拦截器栈。可以将拦截器栈放到Action中,表示这个Action单独走这个拦截器。
<action name="Demo1Action_*" class="cn.zh.a_interceptor.Demo1Action" method="{1}" >
     
   <interceptor-ref name="myStack">interceptor-ref>
    <result name="success" type="dispatcher" >/index.jspresult>
action>
  1. 指定哪些方法是否拦截
  • 指定某些方法拦截,某些方法不拦截,只能指定一种,即:要么指定某些方法拦截,要么指定某些方法不能拦截,不能同时指定。

<param name="excludeMethods">add,deleteparam>

<param name="includeMethods">add,deleteparam>

2. 案例一:登录拦截器

2.1. 登录拦截器的用途

  1. 登录拦截器主要是判断当前用户是否登录,比如用户要执行一些操作,系统就要先判断该用户是否登录,如果不使用拦截器的话,每个类都要判断一下该用户是否登录,这就造成了代码冗余,通过创建拦截器,使用AOP面向切面编程的思想,就可以大量减少代码冗余。

2.2. 代码实现

  1. 创建拦截器类,判断当前用户是否已经登录

一、获取session

二、从session中获取登录标识

三、判断登录标识

public class LoginInterceptor extends MethodFilterInterceptor {
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		//1.获取session
		Map<String,Object> session=ActionContext.getContext().getSession();
		//2. 获取登录标识
		Object object=session.get("user");
		//3.判断标识是否存在
		if(object==null) {
			return "toLogin";
		}else {
			//拦截器放行
			return invocation.invoke();
		}
	}
}
  1. 在Struts.xml中配置拦截器

一、注册拦截器

二、注册拦截器栈,并导入默认拦截器

三、指定拦截方法

四、指定默认拦截器栈

<interceptors>
    
    <interceptor name="loginInterceptor" class="cn.zh.web.interceptor.LoginInterceptor">interceptor>
    
    <interceptor-stack name="myStack">
        <interceptor-ref name="loginInterceptor">
            <param name="excludeMethods">loginparam>
        interceptor-ref>
        <interceptor-ref name="defaultStack">interceptor-ref>
    interceptor-stack>
interceptors>

<default-interceptor-ref name="myStack">default-interceptor-ref>
  1. 定义全局结果集
<global-results>
    <result name="toLogin" type="redirect" >/login.jspresult>
global-results>

2.3. 解决登录页面出现在框架中,而不是出现在整个页面中的问题

  1. 在login.jsp的head标签中添加页面加载后执行函数window.function()
<script type="text/javascript">
	window.onload=function(){
		if(window.parent!=window){
			window.parent.location.href="${pageContext.request.contextPath}/login.jsp";	
		}	
	};
</script>

这段代码表示:如果当前页面的父页面不等于他自己,(说明在框架内)那就让其父页面等于他自己,

Struts2学习笔记四:Struts2拦截器学习、拦截器实现案例、Struts2标签学习_第1张图片

3. Struts通用标签

  1. Struts2标签历史

Struts2学习笔记四:Struts2拦截器学习、拦截器实现案例、Struts2标签学习_第2张图片
Struts2学习笔记四:Struts2拦截器学习、拦截器实现案例、Struts2标签学习_第3张图片

  1. 常用标签–控制标签

<%@ taglib prefix="s" uri="/struts-tags" %>


	


	|

if else标签


list长度为4! list长度为3! list不3不4!

property标签–数据标签


  1. Struts2表单标签(不常用)
	
	
	
	
	
		
		
		
		
		
		
		
		
		
		
	
  1. Struts2非表单标签,actionerror这个主要是用来获取Action中this.addActionError();的错误信息。

你可能感兴趣的:(Struts2学习笔记)