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>
时间: 2024-10-04 03:28:05

Struts2拦截器和标签的相关文章

【SSH2(实践篇)】--Struts2拦截器精解

上篇博客对Struts2的体系结构做了初步的了解,Struts2是以WebWork作为处理核心,并采用拦截器的机制来处理用户的请求,同时它还集成了Struts1丰富的标签库.另外上篇博客还对Struts2的配置使用进行了初步的介绍,下面将会集中讨论Struts2的拦截器. 一.拦截器 1.拦截器小介 拦截器的功能类似于web.xml文件中的Filter,能对用户的请求进行拦截,通过拦截用户的请求来实现对页面的控制.拦截器是在Struts-core-2.2.3.jar中进行配置的,原始的拦截器是在

Struts2 拦截器

一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故将这些权

Struts2.x教程(三) Struts2拦截器

一.Struts2拦截器介绍 Struts2拦截器是使用AOP实现的,主要是针对action对象进行拦截,可以在访问action的某个方法.字段之前或之后实施拦截. 可以为action配置多个拦截器,Struts2会将这一组拦截器按照一定顺序组织成一个拦截器栈.action可以直接引用某个拦截器栈来实现配置多个拦截器的目的. 对于继承struts_default的package中的action,都会默认引用name=defaultStack的拦截器栈(在struts_default中定义了Str

Struts2 拦截器(Interceptor )原理和配置

一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故

Struts2拦截器概述

--------------------siwuxie095 Struts2 拦截器概述 1.Struts2 框架封装的很多功能都在 Struts2 的拦截器中 2.Struts2 框架中有很多拦截器,但这些拦截器不是每次 都执行,只有默认拦截器才会每次都执行 3.Struts2 默认拦截器的位置 「注意:默认拦截器中也有很多拦截器」 4.拦截器的执行 在 Action 对象创建之后,在 Action 方法执行之前 [made by siwuxie095]

笔记:Struts2 拦截器

配置拦截器 Struts.xml 配置文件中,使用<interceptor-/>来定义拦截器,有属性 name 表示拦截器的名称,class 表示拦截器的具体首先类,可以使用<param-/>子元素来配置拦截器的参数,配置示例: <package name="包名称" extends="抽象包名称"> <interceptors> <interceptor name="拦截器名称" class

Struts2 拦截器与Spring AOP的区别

在学习Spring AOP技术的同时,发现其实与以前做过的拦截器的功能很类似,于是开始抱着这两者之间有什么关系的问题进行深入研究. 我们知道struts2使用拦截器主要是用来处理用户的请求,OGNL的使用,表单验证 等. 而spring的拦截器,主要体现在AOP的事务管理方面,还有比如一些错误或者异常的日志的显示 也是通过配置spring的log拦截器来实现的. Struts的拦截器是针对Struts的,比如SSH项目都会去使用AOP ,如果是单纯的STRUTS项目 自然使用Struts本身的拦

Struts2拦截器的使用 (详解)

这位仁兄的写的不错,我照抄过来了:http://www.blogjava.net/i369/articles/162407.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox">  <param name=&q

Struts2拦截器详解

作者:禅楼望月 1. Struts2内置拦截器 Struts2内置了大量的拦截器,如下图: 图片来自:刘水镜的博客:菜鸟学SSH(四)--Struts2拦截器 这些拦截器以name-class的形式配置在struts-default.xml中: <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor n