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>