struts 2——拦截器的实现实例
目录
说明
struts 2:登录页面+拦截器
配置文件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" 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">
<display-name>Text</display-name>
<!-- 核心拦截器 -->
<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>
</web-app>
配置文件struts.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>
<package name="mypackage" extends="struts-default">
<!-- 定义一个拦截器 -->
<interceptors>
<interceptor name="authority"
class="struts.myinterceptor">
</interceptor>
<!-- 拦截器栈 -->
<interceptor-stack name="myinterceptor-stack">
<interceptor-ref name="authority" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
</package>
</struts>
action类login.java
代码片
.
package struts;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import user.user;
//设置action的包名
@ParentPackage("mypackage")
public class login extends ActionSupport implements ModelDriven<user> {
private static final long serialVersionUID = 1L;
private user user=new user();//实例化实体类
//注册一个action,访问路径是login,加入一个拦截器栈myinterceptor-stack。dispatcher:转发,redirect:重定向
@Action(value="login",
results={@Result(name="login",location="/WEB-INF/login.jsp",type="dispatcher"),
@Result(name="hello",location="/hello.jsp",type="redirect")},
interceptorRefs={
@InterceptorRef(value="myinterceptor-stack")
})
//登录验证
public String mylogin(){
HttpServletRequest request=ServletActionContext.getRequest();
System.out.println("这是action");
//模拟数据库操作--成功登录
if(user.getName().equals("123")&&user.getPass().equals("123")){
ServletActionContext.getRequest().getSession().setAttribute("login","true");
return "login";
}
//登录失败
request.getSession().setAttribute("mapping", "密码或用户名错误");
return "hello";
}
@Override
public user getModel() {
// TODO Auto-generated method stub
return user;
}
}
说明:
- 使用ModelDriven< user >接口,接收表单数据。要实例化实体类,实体类的属性名和表单项名一一对应。
- 使用注解来注册action。继承ActionSupport,表示此类是一个action。(也可以不继承)
实体类user.java
代码片
.
import java.io.Serializable;
public class user implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public String toString() {
return "user [name=" + name + ", pass=" + pass + "]";
}
}
说明:
拦截器myinterceptor.java
代码片
.
package struts;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
//判断用户是否登录
public class myinterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// 获得被调用的Action类
Object action = arg0.getAction();
//在struts中可以直接使用ServletActionContext对象,获取web的内置对象
HttpServletRequest request=ServletActionContext.getRequest();
System.out.println("在拦截器中"+request.getParameter("s"));
//用户是否有访问的钥匙“s”
if(request.getParameter("s")==null){
request.setAttribute("s", "false");
}
//有钥匙或者是登录页面,都会被放行
if(request.getParameter("s").equals("true")||
request.getSession().getAttribute("login").equals("true")){
System.out.println("这是struts拦截器-=-通过");
return arg0.invoke(); //通过拦截器,执行action中的内容
}
//被拦截,向页面输出提示
System.out.println("这是struts拦截器-=-拦截");
request.getSession().setAttribute("mapping", "请先登录");
System.out.println(request.getSession().getAttribute("mapping"));
//直接返回字符串与action的 Result 匹配
return "hello";
}
}
说明:
- 实现抽象类AbstractInterceptor ,表示此类是一个拦截器。
- 实现Interceptor 接口重写init()和destroy()方法,完成拦截器的生命周期。
servlet监视器mysessionli.java
代码片
.
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class mysessionli implements HttpSessionListener {
public mysessionli() {
}
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("这是监视器");
arg0.getSession().setAttribute("login", "false");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
}
}
说明
- 用注解来定义servlet监视器。
- 监视session的创建。
- 设置用户登录是否成功。
登录界面hello.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>
<div align="center">
<font size="6" color="red"> <%
System.out.println("jsp"+request.getAttribute("s"));
if (session.getAttribute("mapping") != null) {
out.println(session.getAttribute("mapping"));
}
%></font>
<form action="login?s=true" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input name="name" type="text" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="pass" type="password" /></td>
</tr>
<tr>
<td><input type="submit" value="提交" id="s" /></td>
<td><input type="reset" value="重置" id="r" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
总结
1. 拦截器如何不拦截登录页面
2. 注解定义action
**引用包是最大的困难(一步一步来)**