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

Posted java开发架构师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2学习笔记四:Struts2拦截器学习拦截器实现案例Struts2标签学习相关的知识,希望对你有一定的参考价值。

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

1.1. struts.xml全局配置

  1. 利用全局配置获取页面中抛出运行时异常信息

  • 运行时异常

1if(existU==null) {
2    throw new RuntimeException("用户名不存在");
3}
4if(!existU.getUser_password().equals(user.getUser_password())) {
5    throw new RuntimeException("密码错误");
6}
  • struts.xml配置

1<global-exception-mappings>
2    <!-- 如果出现java.lang.RuntimeException异常,就将跳转到名为error的结果 -->
3    <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
4</global-exception-mappings>
5<result name="error" >/login.jsp</result>
  • 将该异常的结果配置成error,如果出现了该异常就进入login.jsp页面。

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

  1. 由于OgnlContext中的ROOT值栈存放的是访问的Action对象,可以在jsp页面中利用OGNL表达式获取Action中的信息方法是:

  • 添加标签

1<%@ taglib prefix="s" uri="/struts-tags" %>
  • 添加debug标签查看值栈信息

1<s:debug></s:debug>
  • 利用ognl表达式获取值栈信息

1<s:property value="exception.message" />

1.3. Struts2拦截器创建

  1. 通过实现interceptor创建拦截器

1//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
2public class MyInterceptor implements Interceptor {
  • 有个问题,因为实现的是接口,那么该接口的方法必须实现,那么就是问题了,因为每次都要实现它的方法。

    2. 通过继承AbstractInterceptor 抽象类实现创建

1//创建方式2: 继承AbstractInterceptor -> struts2的体贴
2//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
3public class MyInterceptor2 extends AbstractInterceptor {
  1. 通过继承MethodFilterInterceptor实现定制拦截器,和doget,dopost方法类似。

 1//继承:MethodFilterInterceptor 方法过滤拦截器
2//功能: 定制拦截器拦截的方法.
3//    定制哪些方法需要拦截.
4//    定制哪些方法不需要拦截
5public class MyInterceptor3 extends MethodFilterInterceptor{
6    @Override
7    protected String doIntercept(ActionInvocation invocation) throws Exception {
8        //前处理
9        System.out.println("MyInterceptor3 的前处理!");
10        //放行
11        String result = invocation.invoke();
12        //后处理
13        System.out.println("MyInterceptor3 的后处理!");
14        return result;
15    }
16}
  • return 若表示不放行,直接跳转到一个结果页面,不执行后续的拦截器以及Action,直接交给Result处理结果.进行页面跳转。

1.4. Struts.xml配置拦截器

  1. 注册拦截器

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

    2. 注册拦截器栈

 1<!-- 2.注册拦截器栈 -->
2<interceptor-stack name="myStack">
3    <!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
4    <interceptor-ref name="myInter3">
5        <!-- 指定哪些方法不拦截
6     <param name="excludeMethods">add,delete</param> -->

7        <!-- 指定哪些方法需要拦截 -->
8        <param name="includeMethods">add,delete</param>
9    </interceptor-ref>
10    <!-- 引用默认的拦截器栈(20个) -->
11    <interceptor-ref name="defaultStack"></interceptor-ref>
12</interceptor-stack>
  • 拦截器栈的引入包含自定义拦截器,和Struts2自带的拦截器,这些拦截器要放在自定义拦截器之后。

    3. 指定包中的默认拦截器栈

1<!-- 3.指定包中的默认拦截器栈 -->
2<default-interceptor-ref name="myStack"></default-interceptor-ref>
  • 默认拦截器,意味着这个包中的action都会走这个拦截器栈。可以将拦截器栈放到Action中,表示这个Action单独走这个拦截器。

1<action name="Demo1Action_*" class="cn.zh.a_interceptor.Demo1Action" method="{1}" >
2    <!-- 为Action单独指定走哪个拦截器(栈)--> 
3   <interceptor-ref name="myStack"></interceptor-ref>
4    <result name="success" type="dispatcher" >/index.jsp</result>
5</action>
  1. 指定哪些方法是否拦截

  • 指定某些方法拦截,某些方法不拦截,只能指定一种,即:要么指定某些方法拦截,要么指定某些方法不能拦截,不能同时指定。

1<!-- 指定哪些方法不拦截-->
2<param name="excludeMethods">add,delete</param>
1<!-- 指定哪些方法需要拦截 -->
2<param name="includeMethods">add,delete</param>

2. 案例一:登录拦截器

2.1. 登录拦截器的用途

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

2.2. 代码实现

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

一、获取session

二、从session中获取登录标识

三、判断登录标识

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

一、注册拦截器

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

三、指定拦截方法

四、指定默认拦截器栈

 1<interceptors>
2    <!-- 注册拦截器 -->
3    <interceptor name="loginInterceptor" class="cn.zh.web.interceptor.LoginInterceptor"></interceptor>
4    <!-- 注册拦截器栈 -->
5    <interceptor-stack name="myStack">
6        <interceptor-ref name="loginInterceptor">
7            <param name="excludeMethods">login</param>
8        </interceptor-ref>
9        <interceptor-ref name="defaultStack"></interceptor-ref>
10    </interceptor-stack>
11</interceptors>
12<!-- 指定包中的默认拦截器栈 -->
13<default-interceptor-ref name="myStack"></default-interceptor-ref>
  1. 定义全局结果集

1<global-results>
2    <result name="toLogin" type="redirect" >/login.jsp</result>
3</global-results>

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

  1. 在login.jsp的head标签中添加页面加载后执行函数window.onload=function()

1<script type="text/javascript">
2    window.onload=function(){
3        if(window.parent!=window){
4            window.parent.location.href="${pageContext.request.contextPath}/login.jsp";    
5        }   
6    };
7</script>

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

页面展示

3. Struts通用标签

  1. Struts2标签历史

jsp标签进化史

Struts2标签分类
  1. 常用标签--控制标签

1<!--先导入标签库-->
2<%@ taglib prefix="s" uri="/struts-tags" %>
1<!-- 遍历标签 iterator -->
2<s:iterator value="#list" >
3    <s:property /><br>
4</s:iterator>
5<!--两种方式对list集合进行遍历-->
6<s:iterator value="#list" var="name" >
7    <s:property value="#name" /><br>
8</s:iterator>
1<s:iterator begin="1" end="100" step="1"  >
2    <s:property />|<!--默认取栈顶元素-->
3</s:iterator>

if else标签

 1<!-- ------------------if else elseif------------------- --><hr>
2<s:if test="#list.size()==4">
3    list长度为4!
4</s:if>
5<s:elseif test="#list.size()==3">
6    list长度为3!
7</s:elseif>
8<s:else>
9    list不34!
10</s:else>

property标签--数据标签

1<!-- ------------------property 配合ognl表达式页面取值 ------------------- --><hr>
2<s:property value="#list.size()" />
3<s:property value="#session.user.name" />
  1. Struts2表单标签(不常用)

 1    <!-- struts2表单标签 -->
2    <!-- 好处1: 内置了一套样式.  -->
3    <!-- 好处2: 自动回显,根据栈中的属性  -->
4    <!-- theme:指定表单的主题
5            xhtml:默认
6            simple:没有主题
7     -->
8    <s:form action="Demo3Action" namespace="/" theme="xhtml" >
9        <s:textfield name="name" label="用户名"  ></s:textfield>
10        <s:password name="password" label="密码" ></s:password>
11        <s:radio list="{'男','女'}" name="gender" label="性别" ></s:radio>
12        <s:radio list="#{1:'男',0:'女'}" name="gender" label="性别" ></s:radio>
13        <s:checkboxlist list="#{2:'抽烟',1:'喝酒',0:'烫头'}" name="habits" label="爱好" ></s:checkboxlist>
14        <s:select list="#{2:'大专',1:'本科',0:'硕士'}" headerKey="" headerValue="---请选择---" name="edu" label="学历" >
15        </s:select>
16        <s:file name="photo" label="近照" ></s:file>
17        <s:textarea name="desc" label="个人简介" ></s:textarea>
18        <s:submit value="提交" ></s:submit>
19    </s:form>
  1. Struts2非表单标签,actionerror这个主要是用来获取Action中this.addActionError();的错误信息。

1<s:actionerror/>


以上是关于Struts2学习笔记四:Struts2拦截器学习拦截器实现案例Struts2标签学习的主要内容,如果未能解决你的问题,请参考以下文章

struts2框架学习笔记6:拦截器

Struts2-学习笔记系列(14)-拦截器

struts2学习笔记拦截器

struts2学习笔记之十三:自定义过滤器

Struts2-学习笔记系列-PreResultListener

Struts2学习笔记