• Struts2拦截器和标签


    一、struts2拦截器

      1、struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面。

      2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器。

      3 struts2里面默认拦截器位置,在struts2-core.jar jar包里面有一个struts-default.xml文件,在里面配置了默认拦截器。

        

      4拦截器在action被创建之后,方法执行之前执行。

      5拦截器的底层使用的两个原理

        (1)aop思想:struts2的拦截器底层使用了aop的思想,aop是面向切面(方面)编程,

                 aop的思想是不通过修改源代码而去增强功能,通过使用配置文件来完成。

        (2)责任链模式:责任链模式是一种设计模式。在责任链中要执行多个操作,比如添加、修改、删除三个操作。

                 首先执行添加操作,添加操作执行之后 做类似于放行操作,执行修改操作,修改操作执行之后做类似于放行操作,执行删除操作。

      6、aop和责任链在struts2拦截器中的应用。

        (1)在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作

         (2)在执行拦截器时候,执行很多的拦截器,这个过程使用责任链模式

             假如执行三个拦截器,执行拦截器1,执行拦截器1之后做放行操作,执行拦截器2,执行拦截器2之后做放行,执行拦截器3,

             行拦截器3之后放行,执行action的方法。

      7、两个不同点:

        (1)action和Servlet的不同点:

            servlet:默认第一次访问servlet时创建,只创建一次,属于单实例对象。

            action:默认每次访问action都会创建,属于多实例对象。

        (2)过滤器和拦截器的不同:

            过滤器:理论上可以过滤任何内容。比如html、jsp、Servlet、文件路径等。

            拦截器:struts独有概念,只能过滤action。

    二、自定义拦截器

      1、虽然在struts2里面已经封装了很多的过滤器,但是有时我们需要使用没有的拦截器,这时候就需要自己创建拦截器。

      2创建自定义拦截器的步骤:

        (1)先写一个类来继承MethodFilterInterceptor类。

        (2)重写该类的doIntercept方法。

        (3)在方法中写处理逻辑

        (4)如果成功则返回 invocation.invoke();

          (5)如果失败则返回要到的result标签中的name属性值。

        (6)在xml文件中注册该拦截器,将拦截器和action关联起来。

      3、示例:

        (1)首先写一个登录的页面和action方法。

    页面:login.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>
    <h1>登录</h1>
        <form action="${pageContext.request.contextPath}/demo_login.action" method="post">
            username:<input name="username"><br/>
            password:<input name="password"><br/>
            <br/>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

    action:

    public String login(){
            
            HttpServletRequest request =ServletActionContext.getRequest();
            String name =request.getParameter("username");
            String pwd =request.getParameter("password");
            
            if("admin".equals(name) && "123".equals(pwd)){
                //将username放到session中保持登录的状态,在拦截器中通过该session判断是否登录
                request.getSession().setAttribute("username", name);
                return "loginsucess";
            }else{
                return "login";
            }
        }

        (2)在写一个登录成功的页面

    success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%--要使用struts2标签,必须要引入struts2标签库 --%>
    <%@ 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>
        <h1>用户名:${sessionScope.username}</h1>
        <%--跳转Action,验证拦截器 --%>
        <a href="${pageContext.request.contextPath}/demo_add.action">添加</a>
    </body>
    </html>

        (3)在写一个增加的页面和action方法

    add.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%--要使用struts2标签,必须要引入struts2标签库 --%>
    <%@ 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>
    <h1>添加</h1>
        <input type="text" name="username"><br/>
        <input type="password" name="password"><br/>
        <input type="submit" value="提交">
    </body>
    </h

    action

    public String add(){
                
                HttpServletRequest request =ServletActionContext.getRequest();
                String name =request.getParameter("username");
                String pwd =request.getParameter("password");
                
                return "add";
            }

        (4)写拦截器

    //自定义拦截器,继承MethodFilterInterceptor类
    //拦截器只能拦截action
    public class LoginInterpret extends MethodFilterInterceptor{
    
        //2重写doIntercept方法
        protected String doIntercept(ActionInvocation invocation) throws Exception {
        
            //3写内部逻辑
            HttpServletRequest request =ServletActionContext.getRequest();
            
            Object object = request.getSession().getAttribute("username");
            
            if(object != null){
                //通过拦截器
                return invocation.invoke();
            }
            //不通过,返回值写xml配置文件中的result里面的值
            return "login";
            
        }
        
    
    }

        (5)注册拦截器

        (6)配置拦截器不拦截的方法

    <struts>
            <package name="ValueStackDemoAction" extends="struts-default" namespace="/">
               <!-- 
                       声明拦截器
                       name:拦截器的个名称,自定义
                       class:拦截器类的全路径
                -->
               <interceptors>
                   <interceptor name="logininterceptor" class="com.jack.interpret.LoginInterpret"></interceptor>
               </interceptors>
                
                <action name="demo_*" class="com.jack.value.ValueStackDemoAction" method="{1}">
                  <!-- 
                          2使用声明的拦截器
                          name:上一步声明中的name属性值
                   -->
                  <interceptor-ref name="logininterceptor">
                      <!-- 
                              3不予拦截的方法
                              name:固定值:excludeMethods
                              值:Action中不予拦截的方法名称
                       -->
                      <param name="excludeMethods">login</param>
                  </interceptor-ref>
                   
                    <result name="loginsucess">/jsp/success.jsp</result>
                    <result name="login">/jsp/login.jsp</result>
                    <result name="add">/jsp/add.jsp</result>
                </action>
            </package>
        </struts>

    三、struts2的标签

    1表单标签

    <%--struts2标签只能用在jsp中,不能在html中使用 --%>
        
        <%--表单标签 --%>
        <s:form action="" method="" enctype="" target="" theme="">
            <%--普通文本标签 --%>
            <s:textfield name="name" label="用户名"></s:textfield>
            <%--密码标签--%>
            <s:password name="password" label="密码"></s:password>
            <%--1、单选标签     value属性值和显示值一致 --%>
            <s:radio list="{'男','女'}" name="sex" label="性别"></s:radio>
            <%--2、单选标签     value属性值和显示值不一致 --%>
            <s:radio list="#{'0':'男','1':'女'}" name="sex1" label="性别"></s:radio>
            <%--1 多选标签 --%>
            <s:checkboxlist list="{'吃饭','睡觉','玩手机'}" name="aihao" label="爱好"></s:checkboxlist>
            <%--2 多选标签 --%>
            <s:checkboxlist list="#{'0':'吃饭','1':'睡觉','2':'玩手机'}" name="aihao1" label="爱好"></s:checkboxlist>
            <%--1下拉框标签 --%>
            <s:select list="{'初中','高中','大专','本科'}" name="college" label="学历"></s:select>
            <%--2下拉框标签 --%>
            <s:select list="#{'1':'初中','2':'高中','3':'大专','4':'本科'}" name="college1" label="学历"></s:select>
            <%--文件标签 --%>
            <s:file name="file" label="文件上传"></s:file>
            <%--隐藏标签 --%>
            <s:hidden name="hidden" value="隐藏项"></s:hidden>
            <%--文本域标签 --%>
            <s:textarea name="jianli" label="简介"></s:textarea>
            <%--提交标签 --%>
            <s:submit name="submit" label="提交"></s:submit>
            <%--重置标签 --%>
            <s:reset name="set" label="重置"></s:reset>
        </s:form>

    2、控制标签<s:if>、<s:elseif>、<s:else>标签

    <s:if test="表达式一">
            标签体
        </s:if>
        <s:elseif test="表达式二">
            标签体
        </s:elseif>
        <s:else>
            标签体
        </s:else>
  • 相关阅读:
    更新ubuntu的源
    List<?>和List<Class<?>>区别及泛型相关
    MessageDigest类实现md5加密
    Oracle插入多个值的问题
    Oracle用户的初始化问题
    Linux 环境变量详解
    oracle数据库与实例
    Oracle基础--命令
    SQL 三种基本Join
    三种Join方法
  • 原文地址:https://www.cnblogs.com/jack1995/p/6978991.html
Copyright © 2020-2023  润新知