Struts2 架构 拦截器

Struts2 架构



1.2拦截器介绍

01.为什么需要拦截器

早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低 Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦

 

Mvc和三层的区别?

解析:MVC是表示层的三个组件。核心用途: 将请求和展示分离。

     三层侧重的是架构层面的一个流程组件封装。

 

 

 

04.什么是拦截器 

拦截对Action请求的一个类。

实现Interceptor接口。继承AbstractInterceptor

 

Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能

 

拦截器方法在Action执行之前或者之后执行

 

拦截器栈

从结构上看,拦截器栈相当于多个拦截器的组合

在功能上看,拦截器栈也是拦截器

拦截器与过滤器原理很相似




三阶段执行周期:

1、做一些Action执行前的预处理

2、将控制交给后续拦截器或返回结果字符串

3、做一些Action执行后的处理



拦截器案例:



jar包 不做多余的讲解

首先我们的web.xml  只需配置一个前端控制器

<filter>
  <filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
        </filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 

 

我们的 页面

首先是login.jsp


拦截器 用法:

我们默认没有登录的情况下是走的login.jsp页面

如果我们已经登录过

我们会把name存到session

在我们下一次点页面时 直接跳过登录  到成功 的页面

但是如果我们没有登录过

想要直接访问成功 页面

这时候我们的 拦截器 抢劫的功能就开始启动了

我们会拦截到 没有没有session存值的 和没有直接访问登录页面 的

我们直接给他跳转到 login页面 让他进行登录


<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h2>登录</h2>
<s:form method="POST" action="login">
    请输入用户名: <s:textfield  name="user.username"></s:textfield> <br/>
    <s:textfield name="user.password"></s:textfield><br/>
    <s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>

我们访问的是login

在点击提交的时候


Success页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
 <h2>Success</h2>
</body>
</html>


 实体类  存储登录名 和密码的

package cn.happy.struts07.entity;

/**
 * Created by Happy on 2017-10-24.
 */
public class UserInfo {
    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;
    }
}

拦截器+Action
package cn.happy.struts07.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

import java.util.Map;

/**
 * Created by linlin on 2017/10/25.
 */
public class MyInterceptor implements Interceptor {
    public void destroy() {

    }

    public void init() {
        System.out.println("拦截器已经初始化成功了。。。。");
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("对象"+invocation);
   Object action=invocation.getAction();
        System.out.println("action===="+action);
   String value;
        Map<String,Object> session= ActionContext.getContext().getSession();
        Object name=session.get("uname");
        String actionName=invocation.getProxy().getActionName();
        invocation.getProxy().getNamespace();
        System.out.println("===actionName="+actionName);
        if(actionName.equals("login")){

            System.out.println("======action login==");
            value=invocation.invoke();
        }else if(name!=null){
            value=invocation.invoke();
            String method=invocation.getProxy().getMethod();
            System.out.println("方法:"+method);
        }else{

            value="login";
        }
        System.out.println("逻辑视图名"+value);
        return value;
    }
}

Action
package cn.happy.struts07.action;

import cn.happy.struts07.entity.UserInfo;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

import java.util.Map;

/**
 * Created by linlin on 2017/10/25.
 */
public class LoginAction implements Action{

    private UserInfo user;
    public String execute() throws Exception {

        Map<String,Object> session= ActionContext.getContext().getSession();
       if(user!=null){
           if(user.getUsername().equals("1")&&user.getPassword().equals("1")){
               session.put("uname",user.getUsername());
                       return SUCCESS;
           }else{
               return LOGIN;
           }
       }else{
           if(session!=null&&session.get("uname")!=null){
               return "success";
           }else{
               System.out.println("action中的自定义代码");
               return "login";
           }
       }
    }

    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }
}

最重要的就是我们的 struts.xml

strtus-day07.xml

 

我们先看struts.xml

这里面我们 有配置拦截器 和拦截器栈

我们必须引用 系统自带的拦截器defaultStack

还要引用你写的 拦截器

Global这个节点是在总的xml中设置一个返回的 页面

这样我们的子的就不需要一个一个设置了

我这个默认就是访问的就是login.jsp页面

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>



    <package name="default" namespace="/" extends="struts-default">


        <!--配置拦截器  拦截器栈-->
<interceptors>
    <interceptor name="myInter" class="cn.happy.struts07.interceptor.MyInterceptor">
    </interceptor>
    <interceptor-stack name="myStack">
        <interceptor-ref name="defaultStack"></interceptor-ref>
   <interceptor-ref name="myInter"></interceptor-ref>
    </interceptor-stack>
</interceptors>


<default-interceptor-ref name="myStack"></default-interceptor-ref>

<!--<default-interceptor-ref name="first"></default-interceptor-ref>-->
<global-results>
    <result name="login">/WEB-INF/myinter/login.jsp</result>
</global-results>

<!--<action name="first"></action>-->
<!--
        <action name="he" class="cn.happy.struts01.HelloWorld">
            <result name="helloworld">/helloworld.jsp</result>
        </action>

        <action name="UserAction" class="cn.happy.struts02.UserAction">
            <result name="success">/success.jsp</result>
            <result name="input">/login.jsp</result>
        </action>
        <action name="LoginAction" class="cn.happy.struts03.LoginAction">
            <result name="success">/success2.jsp</result>
        </action>-->

    </package>
    <include file="struts-04.xml"></include>
    <include file="struts-05.xml"></include>
    <include file="struts-06.xml"></include>
    <include file="struts-07.xml"></include>
</struts>


strtus.day07.xml

?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="true"/>
    <package name="day-07" namespace="/" extends="default">

        <action name="login" class="cn.happy.struts07.action.LoginAction">
            <result name="success">/WEB-INF/myinter/success.jsp</result>
            <result name="login">/WEB-INF/myinter/login.jsp</result>
        </action>

        <action name="book" class="cn.happy.struts07.action.BookAction">
            <result name="success">/WEB-INF/myinter/booksuccess.jsp</result>
        </action>
    </package>
</struts>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值