zoukankan      html  css  js  c++  java
  • struts自定义拦截器

    1. 创建项目

    在 MyEclipse 中创建一个 Web 项目 struts2Demo03,将 Struts2 框架所需的 JAR 包添加到项目 WEB-INF 目录下的 lib 文件夹中,并发布到类路径下。

    2. 配置 web.xml 文件

    在 web.xml 文件中配置过滤器和首页信息,其配置代码如下所示。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
        <!-- 定义filter -->
        <filter>
            <!-- filter名字 -->
            <filter-name>struts2</filter-name>
            <!-- filter的实现类,此处是Struts2的核心过滤器 -->
            <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
            </filter-class>
        </filter>
        <filter-mapping>
            <!-- filter的名字,必须是filter元素中已经声明过的过滤器的名字 -->
            <filter-name>struts2</filter-name>
            <!-- 定义filter负责拦截的URL地址 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <!-- 首页 -->
        <welcome-file-list>
            <welcome-file>main.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

    3. 创建用户实体类

    在 src 目录下创建一个名为 com.mengma.domain 的包,在该包下创建 User 类,如下所示。

    package com.mengma.domain;
    public class User {
        private String username; // 用户名
        private String password; // 密码
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }

    在 User 类中,定义了 username 和 password 两个属性,以及其 getter 和 setter 方法。

    4. 创建 Action

    1)创建登录 Action。在 src 目录下创建包 com.mengma.action,在该包下创建 LoginAction 类,编辑后如下所示。

    package com.mengma.action;
    import com.mengma.domain.User;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    public class LoginAction extends ActionSupport implements ModelDriven<User> {
        private static final long serialVersionUID = -8493698886438630994L;
        private User user = new User();
        @Override
        public User getModel() {
            return user;
        }
        public String execute() throws Exception {
            // 获取ActionContext
            ActionContext actionContext = ActionContext.getContext();
            if ("admin".equals(user.getUsername())
                    && "123456".equals(user.getPassword())) {
                // 将用户存储在session中
                actionContext.getSession().put("user", user);
                return SUCCESS;
            } else {
                actionContext.put("msg", "用户名或密码错误,请重新登录!");
                return INPUT;
            }
        }
    }

    2)创建商品 Action。在 com.mengma.action 包下创建 BookAction 类,编辑后如下所示

    package com.mengma.action;
    import com.opensymphony.xwork2.ActionSupport;
    public class BookAction extends ActionSupport {
        private static final long serialVersionUID = 5640989517690867879L;
        // 购买图书
        public String buy() {
            return SUCCESS;
        }
    }

    5. 创建拦截器

    通过之前对拦截器的学习,可以将自定义拦截器的使用过程分为以下三步。

    1. 用户自定义的拦截器类,必须实现 Interceptor 接口或继承 AbstractInterceptor 类。
    2. 需要在 Struts.xml 中定义自定义的拦截器。
    3. 在 Struts.xml 中的 Action 中使用拦截器。

    下面就按照上述步骤创建拦截器。

    1)创建拦截器类。在 src 目录下创建一个名称为 com.mengma.interceptor 的包,在该包下创建一个名称为 PrivilegeInterceptor.java 的文件,如下所示。

    package com.mengma.interceptor;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    public class PrivilegeInterceptor extends AbstractInterceptor {
        private static final long serialVersionUID = 193664972753450682L;
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            // 得到 ActionContext
            ActionContext actionContext = invocation.getInvocationContext();
            // 获取User对象
            Object user = actionContext.getSession().get("user");
            if (user != null) {
                return invocation.invoke(); // 继续向下执行
            } else {
                actionContext.put("msg", "您还未登录,请先登录!");
                return Action.LOGIN; // 如果用户不存在,则返回login值
            }
        }
    }

    2)配置 struts.xml 文件。在 src 目录下创建 struts.xml 文件,此文件用于声明自定义拦截器、拦截器栈以及对 book 操作的 Action,其代码如下所示。

    <?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>
        <package name="struts2" namespace="/" extends="struts-default">
            <!-- 声明拦截器 -->
            <interceptors>
                <interceptor name="privilege"
                    class="com.mengma.interceptor.PrivilegeInterceptor" />
                <interceptor-stack name="myStack">
                    <interceptor-ref name="defaultStak" />
                    <interceptor-ref name="privilege" />
                </interceptor-stack>
            </interceptors>
            <!-- 用户登录操作 -->
            <action name="login" class="com.mengma.action.LoginAction">
                <result>/main.jsp</result>
                <result name="input">/login.jsp</result>
            </action>
            <!-- 关于book操作 -->
            <action name="book_*" class="com.mengma.action.BookAction"
                method="{1}">
                <result>/success.jsp</result>
                <result name="login">/login.jsp</result>
                <!-- 在action中使用自定义拦截器 -->
                <interceptor-ref name="myStack" />
            </action>
        </package>
    </struts>

    在 struts.xml 中,首先声明了一个名称为 privilege 的拦截器,并将该拦截器放入自定义的拦截器栈 myStack 中;然后配置了用户登录的 action 信息;最后定义了关于对页面 book 操作的 action 信息,并在该 action 中引用自定义的拦截器栈 myStack。

    6. 创建显示页面

    在 WebContent 目录下创建三个视图页面,分别为主页 main.jsp、登录页面 login.jsp 和操作成功页面 success.jsp。其中主页 main.jsp 的代码如下所示。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!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>主页</title>
    </head>
    <body>
        <table border="0">
            <tr>
                <td>《SSH框架整合实战教程》</td>
                <td><a href="/struts2Demo03/book_buy">购买</a></td>
            </tr>
        </table>
    </body>
    </html>

    登录页面 login.jsp 的代码如下所示。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>登录</title>
    <style type="text/css">
        input[type=text],input[type=password]{width:150px}
    </style>   
    </head>
    <body>
        <div align="center">
            <form action="/struts2Demo03/login.action" method="post">
            <table>
                <tr>
                    <td><label style="text-align:right;">用戶名:</label></td>
                    <td><input type="text" name="username"></td>
                    <td><span style="color:#F00">${requestScope.msg }</span></td>
                </tr>
                <tr>
                    <td><label style="text-align:right;">&nbsp;&nbsp;&nbsp;&nbsp;码:</label></td>
                    <td><input type="password" name="password"></td>
                </tr>
                <tr>
                    <td align="right" colspan="2"><input type="submit" value="登录"></td>
                </tr>
            </table>
            </form>
        </div>
    </body>
    </html>

    操作成功页面 success.jsp 的代码如下所示。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>成功页面</title>
    </head>
    <body>
        尊敬的会员${user.username },您已成功购买商品,祝您购物愉快!
    </body>
    </html>
    没有停止的脚步,只有倒下去的脚步
  • 相关阅读:
    virtualbox 5.0.6 在debian jessie amd64启动报错
    golang中的检验hash
    删除多余的自编译的内核、mysql连接不了的问题
    scoket常用函数简单介绍
    我的bootstrap学习
    TCP/IP四层模型和OSI七层模型
    五种调试方法
    实现对一个8bit数据的指定位的置0或者置1操作,并保持其他位不变。
    如何测试一个杯子
    黑白盒测试及区别、测试用例的设计(测试小笔记)
  • 原文地址:https://www.cnblogs.com/hkMblogs/p/13228899.html
Copyright © 2011-2022 走看看