java struts2入门学习---拦截器学习
一、拦截器,拦截器栈
1、拦截器的作用
拦截器本质上和servlet的过滤器是一样的。在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦截器。
2、拦截器执行顺序
在struts.xml文件中,<intercepto-ref/>中先引用的先执行,后引用的后执行。如果某个拦截器出错或不允许通过,那么下一个拦截器是不允许执行的。
需要拦截哪个Action,就在哪个Action对应的<action>标签中配置即可。
在部署web应用时,拦截器的空参构造方法和init()方法各执行一次,每次请求时intercept()方法都会执行一次。
3、自定义拦截器
1) 声明一个拦截器
<pacakge > <interceptors>
<interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor">
</interceptor>
</interceptors> <action ></action>
</package>
注意:这里interceptors与action标签同级。其中class对应拦截器的全路径。name对应拦截器的名称,这个可以自己随便定义,建议与类名相同,此名称要唯一。
2)引用一个拦截器:
<action>
<!-- 引用自定义的拦截器 -->
<interceptor-ref name="LoginInterceptor"></interceptor-ref>
<action>
注意:如何引用一个拦截器?即在Action中<action>标签下配置即可。这里name名称与自定义的名称要一致。
4、自定义拦截器栈
1)声明一个拦截器栈
interceptor-stack标签中进行配置需要引用的拦截器,如下:
<interceptors>
<interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="amosStack">
<interceptor-ref name="LoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack> </interceptors>
2)引用一个拦截器栈:
<!-- 引用自定义的拦截器栈 -->
<interceptor-ref name="amosStack"></interceptor-ref>
二、需求分析
如图所示,访问upload.jsp进行上传文件--》LoginInterceptor拦截器进行拦截---》
1、未登录,那么跳转页面到登录页面---》进行登录页面--》登录成功---》可以点击返回到上传文件页面;
2、已登录,登录直接开始上传文件。
三、代码分析:
upload.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>
<s:form action="UploadAction" enctype="multipart/form-data" method="POST">
<s:textfield label="上传用户" name="username"/>
<s:file label="上传文件" name="upload" />
<s:file label="上传文件" name="upload" />
<%-- <s:file label="上传文件" name="upload" /> --%> <s:submit value="提交"/>
</s:form>
</body>
</html>
upload_success.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>
<s:form action="UploadAction" enctype="multipart/form-data" method="POST">
<s:textfield label="上传用户" name="username"/>
<s:file label="上传文件" name="upload" />
<s:file label="上传文件" name="upload" />
<%-- <s:file label="上传文件" name="upload" /> --%> <s:submit value="提交"/>
</s:form>
</body>
</html>
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>login</title>
</head>
<body>
<s:form action="LoginAction" method="POST">
<s:textfield label="上传用户" name="username"/>
<s:submit value="登录"/>
</s:form>
</body>
</html>
login_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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login success</title>
</head>
<body>
登录成功<br>
<%-- ${pageContext.request.contextPath } --%>
<a href="upload.jsp" >返回上传页面</a>
</body>
</html>
sturts.xml
<?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>
<!-- <include file="config/upload.xml"></include>
-->
<!-- 加载其他配置文件 -->
<include file="config/upload-interceptor.xml"></include>
</struts>
upload-sturts.xml
<?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="login" extends="struts-default">
<action name="LoginAction" class="interceptor.LoginAction"
method="loginMethod">
<result>
/login_success.jsp
</result>
</action>
</package>
<package name="upload" extends="struts-default">
<interceptors>
<interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="amosStack">
<interceptor-ref name="LoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack> </interceptors> <action name="UploadAction" class="action.UploadAction" method="uploadMethod">
<param name="uploadPath">/home/amosli/develop/struts2_learn/</param>
<result name="success" type="dispatcher">
/WEB-INF/upload_success.jsp
</result>
<result name="input" type="dispatcher">
upload.jsp
</result>
<result name="toLoginJsp" type="dispatcher">
login.jsp
</result>
<!-- 对系统的拦截器进行设置 -->
<interceptor-ref name="fileUpload">
<!-- 对单个上传文件的大小进行设置,5M -->
<param name="maximumSize">5242880</param>
<!-- 对允许的文件扩展名进行设置,这里以英文逗号隔开 -->
<param name="allowedExtensions">.txt,.xml</param>
<!-- 对允许的文件类型进行设置,这里以英文逗号进行隔开 -->
<param name="allowedTypes">text/plain,text/xml</param>
</interceptor-ref>
<!-- 引用自定义的拦截器 -->
<!-- <interceptor-ref name="LoginInterceptor"></interceptor-ref> --> <!-- 显示引用默认的拦截器 -->
<!-- <interceptor-ref name="defaultStack"></interceptor-ref> --> <!-- 引用自定义的拦截器栈 -->
<interceptor-ref name="amosStack"></interceptor-ref> </action>
</package>
</struts>
LoginAction.java
package interceptor; import java.util.Map; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; /**
* @ClassName: LoginAction
* @Description: 用户登录
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 17, 2014 12:11:35 AM
*/
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 3514444221760688282L; private String username; public void setUsername(String username) {
this.username = username;
} public String loginMethod() {
// 取得HTPPSession
Map<String, Object> session = ActionContext.getContext().getSession(); session.put("username", username);
return SUCCESS;
} }
LoginInterceptor.java
package interceptor; import java.util.Map; import action.UploadAction; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; /**
* @ClassName: LoginInterceptor
* @Description: 登录拦截器
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 17, 2014 11:42:54 PM
*/
public class LoginInterceptor implements Interceptor { private static final long serialVersionUID = 8314579656513662711L; public LoginInterceptor() {
System.out.println("LoginInterceptor():" + this.hashCode());
} public void destroy() {
System.out.println("destroy()");
} public void init() {
System.out.println("init()");
} public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("LoginInterceptor");
// //获取此拦截器将要拦截的action
// Object action = invocation.getAction();
// System.out.println("action:"+action);//action:action.UploadAction@6522cf92
// //获取action的返回值
// String resultValue = invocation.invoke();
// System.out.println("resultValue:"+resultValue);// resultValue:success // 如果拦截器将要拦截的action为UploadAction,那么判断用户是否已经登录
if (invocation.getAction() instanceof UploadAction) {
Map<String, Object> session = ActionContext.getContext().getSession();
if (session.get("username") != null) {// 判断用户是否已经登录
// 如果返回值为"success"那么将会匹配到配置文件中为result属性为"success"的内容。
// 如果返回值为invocation.invoke(),那么将会执行uploadaction方法
return invocation.invoke();
} else {
return "toLoginJsp";
}
} return null;
} }
UploadAction.java
package action; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream; import com.opensymphony.xwork2.ActionSupport; /**
* @ClassName: UploadAction
* @Description: 文件上传
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 14, 2014 1:50:28 AM
*/
public class UploadAction extends ActionSupport {
private static final long serialVersionUID = -8920466592471253212L;
private String username;// 用户名
private String[] uploadContentType;// 上传文件的类型,(Fileupload拦截器传入的参数)
private File[] upload;// 上传的文件,(Fileupload拦截器传入的参数)
private String[] uploadFileName;// 上传文件的真实文件名,(Fileupload拦截器传入的参数)
private String uploadPath; public void setUploadPath(String uploadPath) {
this.uploadPath = uploadPath;
} public void setUsername(String username) {
this.username = username;
} public String[] getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
} public File[] getUpload() {
return upload;
} public void setUpload(File[] upload) {
this.upload = upload;
} public String[] getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
} public String getUsername() {
return username;
} public String uploadMethod() throws Exception {
// ServletContext context = ServletActionContext.getServletContext();
// String real_path = context.getRealPath("/WEB-INF/upload/");
for (int i = 0; i < upload.length; i++) {
InputStream inputStream = new FileInputStream(upload[i]);
OutputStream outputStream = new FileOutputStream(uploadPath + "/" + uploadFileName[i]);
byte[] b = new byte[1024];
int len = 0;
while ((len = inputStream.read(b)) > 0) {
outputStream.write(b, 0, len);
}
// 关闭流
inputStream.close();
outputStream.close();
// 删除tmp文件,最好是用tyrcatch finally进行删除
// upload[i].delete();
} return SUCCESS;
} }
其中文件上传的代码主要引用上一篇文章中的,所以这里主要讲LoginInterceptor.java拦截器的代码分析:
实现Interceptor接口,重写其方法,这里主要注意intercept()方法。这里通过ActionInvocation类型的参数获取session值判断用户是否已经登录。
1)如果没有登录返回值为"toLoginJsp",这里对应upload-interceptor.xml中的result name,将其转发到login.jsp页面;
2)如果已经登录,那么执行上传,但这里需要注意的是, 如果返回值为"success"那么将会匹配到配置文件中为result属性为"success"的内容,如果返回值为invocation.invoke(),那么将会执行UploadAction方法,所以这里切记要return invocation.invoke();否则文件上传失败。
其中upload-sturts.xml的配置也是细节问题,主要可以参考文章开头的内容。
四、执行效果:
五、源代码:
https://github.com/amosli/strut2_learn sturts2拦截器、拦截器栈学习
java struts2入门学习---拦截器学习的更多相关文章
- SpringMVC—Struts2拦截器学习网址整理
引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...
- java struts2入门学习实例--使用struts2快速实现上传
一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...
- Struts2学习-拦截器
1.新建项目user4,建立好和user3一样的目录,与之相比只是添加几个类,主要是struts.xml和action类的改变,其结果没有太大的变化 struts,xml <?xml versi ...
- Struts2学习-拦截器2续
定义拦截器有2种办法:1.实现Interceptor接口2.集成AbstractInterceptor抽象类 一.方法1 ..... <struts> <package name=& ...
- 《java从入门到精通》学习记录
目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...
- 5.Struts2中的拦截器
拦截器是Struts2中的核心,其自带很多很多的拦截器,这里主要介绍一下自定义拦截器,恩多一半情况下呢?我们不需要使用到自定义的拦截器,Struts2本身已经提 供了很多的拦截器供我们使用,对于自定义 ...
- Struts2(十四)拦截器实现权限管理
一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...
- Java实战之01Struts2-04拦截器、上传下载、OGNL表达式
十二.Struts2中的拦截器 1.拦截器的重要性 Struts2中的很多功能都是由拦截器完成的.比如:servletConfig,staticParam,params,modelDriven等等. ...
- Struts2透过自定义拦截器实现登录之后跳转到原页面
Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...
随机推荐
- 简短介绍 C# 6 的新特性
几周前我在不同的地方读到了有关C#6的一些新特性.我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍.它们中的一些可能不会如预期那样神奇,但那也只是目前的更新. 你可以通过下载V ...
- jQuery EasyUI 入门简介
对于前端开发者来说,在开发过程中应用“框架”这一工具,可以极大的缩短开发时间,提高开发效率.今天我们就开介绍一款常用的框架——jQuery EasyUI. 那什么是jQuery EasyUI呢? jQ ...
- 命令行下从bak文件恢复sqlserver数据库方法
命令行下从bak文件恢复sqlserver数据库方法 注:本文所示访问从SqlServer 2000 - 2014版都是通用的 参考:http://blog.sina.com.cn/s/blog_5c ...
- Python爬虫实战(一):爬糗事百科段子
代码: # _*_ coding:utf-8 _*_ import urllib2 import re from datetime import datetime class QSBK: def __ ...
- 从 bootup.js 学习加载脚本等资源
本文内容 如何使用 示例 参考资料 本文的目的在于,通过 bootup.js 的源代码,认识如何从客户端加载服务器的文件,特别是 JavaScript 文件,注入到页面,并存储在本地缓存,以扩展对 J ...
- ORACLE 执行计划
有关oracle 执行计划几个不错的连接 执行计划的一些概念介绍:http://database.51cto.com/art/200611/34273.htm执行计划的例子:http://www.or ...
- 保存登录plsql developer 的用户名和密码
1 保存用户名 tools -> Preferences -> User Interface - Options 勾选 Autosave username . 保存 2 保存密码 tool ...
- 解决Jquery向页面append新元素之后事件的绑定问题
/*经过用户技能标签增加样式*/ $(".s-edited").live("hover",function(){ $(this).toggleClass(&qu ...
- linux CPU占用率高(转)
来自:http://www.cnitblog.com/houcy/archive/2012/11/28/86801.html 1.用top命令查看哪个进程占用CPU高 gateway网关进程14094 ...
- 图像检索:RGBHistogram+欧几里得距离|卡方距离
RGBHistogram: 分别计算把彩色图像的三个通道R.G.B的一维直方图,然后把这三个通道的颜色直方图结合起来,就是颜色的描写叙述子RGBHistogram. 以下给出计算RGBHistogra ...