struts2拦截器
2016-06-15 17:54
399 查看
Struts2拦截器
拦截器介绍
struts2中的拦截器怎样实现的?1.struts2中的拦截器的实现原理是AOP思想.
2.struts2中的拦截器采用的是责任链模式
AOP:面向切面(方面)编程 spring AOP思想.
AOP的具体实现就是使用代理模式。
责任链:java23设计模式中的一种.
将所有操作像锁链串链起来,在任意一个环节都可以让其继续执行,也可以断开。
查看struts2源代码分析struts2中的拦截器.
1.查看StrutsPreparedAndExecuteFilter。
在这个Filte中它完成了两种操作.
1.预处理操作-----加载配置文件,主要体现在init方法中.
2.具体执行内容----拦截器 doFilter方法中.
2.ActionProxy它就是Action的代理对象.
ActionProxy proxy =
config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace,name, method, extraContext, true, false);
3.ActionInvocation
这个对象是真正调用拦截器的对象.
invocation.invoke();
4.怎样调用这些拦截器
调用任意一个拦截器后都执行 invocation.invoke()操作,这相当于执行下一个拦截器。
总结:在struts2中它的AOP代码体现,是为Action对象创建了一个代理对象ActionProxy。而所有的Interceptor都是通过ActionInvocation执行的。
3、常用struts2 拦截器
<interceptor-refname="modelDriven"/> 模型驱动
<interceptor-refname="fileUpload"/> 文件上传
<interceptor-refname="params"> 参数解析封装
<interceptor-refname="conversionError"/> 类型转换错误
<interceptor-refname="validation"> 请求参数校验
<interceptor-refname="workflow"> 拦截跳转 input 视图
自定义拦截器案例
案例 :登陆,对其它Action访问 通过自定义拦截器 进行权限控制导入jar包(struts2 jar、c3p0、 dbutils、 mysql驱动)
web.xml
struts.xml
JDBCUtils工具类
第一步 :编写index.jsp 提供 图书增删改查 四个功能
编写BookAction ,提供四个业务方法
第二步: 完成登陆功能
第三步 :必须要登陆才能进行图书管理
使用Filter 进行权限控制 ---- 过滤所有web请求 (所有web资源访问)
使用拦截器 进行权限控制 ---- 主要拦截对Action访问 (不能拦截JSP)
(1)创建一个类,继承AbstractInterceptor类
publicString intercept(ActionInvocation invo) throws Exception {
Objectuser = invo.getInvocationContext().getSession().get("user");
if(user!= null) {
returninvo.invoke();
}else {
returnAction.LOGIN;
}
}
(2)配置拦截器
方式一
<!--注册拦截器 -->
<package name="demo2" namespace="/"extends="struts-default">
<interceptors>
<interceptorname="pre" class="cn.xxxx.demo2.Invacaton"></interceptor>
</interceptors>
<action name="demo2"class="cn.xxxx.demo2.DemoAction" >
<result>/index.jsp</result>
<resultname="login">/demo100.jsp</result>
<interceptor-refname="defaultStack"></interceptor-ref>
<interceptor-refname="pre"></interceptor-ref>
</action>
</package>
方式二
<!--注册拦截器 -->
<packagename="demo2" namespace="/"extends="struts-default">
<interceptors>
<interceptorname="pre" class="cn.xxxx.demo2.Invacaton"></interceptor>
<interceptor-stack name="mystack">
<interceptor-refname="defaultStack"></interceptor-ref>
<interceptor-refname="pre"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="demo2"class="cn.xxxx.demo2.DemoAction" >
<result>/index.jsp</result>
<resultname="login">/demo100.jsp</result>
<interceptor-refname="mystack"></interceptor-ref>
</action>
</package>
Struts2文件上传下载
Struts2文件上传
提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容fileUpload拦截器默认在 defaultStack 栈中, 默认会执行的
在Action需要对上传文件内容进行接收(提供三个属性)
页面:
<inputtype="file" name="upload" />
Action :
publicclass UploadAction extends ActionSupport {
//接收上传内容
//<input type="file" name="upload" />
private File upload;// 这里变量名 和页面表单元素 name 属性一致
private String uploadFileName;
private String uploadContentType;
}
*格式 :
上传表单项name属性 + ContentType 、 上传表单项name属性 + FileName
* 为三个对象 提供 setter 方法
通过FileUtils 提供 copyFile 进行文件复制,将上传文件 保存到服务器端
public Stringexecute() throws Exception {
Stringpath = ServletActionContext.getServletContext().getRealPath("/1");
Filedisk = new File(path+"/"+uploadFileName);
FileUtils.copyFile(upload, disk);
returnSUCCESS;
}
Struts2文件上传问题解决
配置 input 视图 ,作为上传出错后 跳转页面在文件上传时,如果发生错误 ,fileUpload拦截器 会设置错误信息,workflow拦截器 跳转到 input 视图
struts.multipart.parser=jakarta 定义文件上传,采用 commons-fileupload 技术
* 同时支持 cos 、pell 上传技术(如果使用其它上传技术,单独下载jar包 )
通过struts.multipart.maxSize
常量设置文件上传总大小限制
* struts.multipart.maxSize=2097152 默认上传文件总大小 2MB
* 超过文件总大小,跳转input 视图, 通过 <s:actionError /> 回显错误信息
在struts.xml 设置上传总大小
<constant name="struts.multipart.maxSize"value="20000000"></constant>
设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性
FileUpload 拦截器有 3 个属性可以设置.
*maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
*allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔
*allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔
如果针对fileUpload进行参数设置,当出错时,在页面通过 <s:fieldError /> 回显错误信息
<action name="demo3"class="cn.xxxx.demo3.Demo2Action" >
<resultname="input">/1/b.jsp</result>
<interceptor-refname="defaultStack">
<paramname="fileUpload.maximumSize">102400</param>
<paramname="fileUpload.allowedExtensions">.doc,.jpg</param>
</interceptor-ref>
</action>
多文件上传
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。第二步:把form表的enctype设置为:“multipart/form-data“,如下:
<formenctype="multipart/form-data"action="${pageContext.request.contextPath}/xxx.action"method="post">
<input type="file" name="uploadImages">
<input type="file" name="uploadImages">
</form>
第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:
public classuploadAction{
private File[] uploadImages;//得到上传的文件
privateString[] uploadImagesContentType;//得到文件的类型
privateString[] uploadImagesFileName;//得到文件的名称
//这里略省了属性的getter/setter方法
publicString saveFiles() throws Exception{
ServletContext sc =ServletActionContext.getServletContext();
String realpath =sc.getRealPath("/uploadfile");
try {
if(uploadImages!=null&&uploadImages.length>0){
for(inti=0;i<uploadImages.length;i++){
File destFile = newFile(realpath,uploadImageFileNames[i]);
FileUtils.copyFile(uploadImages[i], destFile);
}
}
} catch (IOException e) {
e.printStackTrace();}return"success";}}
Struts2文件下载
1) struts2 完成文件下载,通过 结果集类型 (Result Type) stream 来完成的<resultname="success" type="stream">
<paramname="contentDisposition">attachment;filename=${fileName}</param>
<paramname="inputStream">${inputStream}</param>
</result>
提供getFileName和getInputStream方法
2)使用Stream结果集 完成文件下载
文件下载原理: 服务器读取下载文件内容,通过Response响应流写回, 设置 ContentType、 ContentDisposition 头信息
public class StreamResult extendsStrutsResultSupport {
protectedString contentType = "text/plain"; // contentType头信息 (下载文件对应 MIME协议规定类型 )
*html --- text/html . txt--- text/plain
protectedString contentDisposition = "inline"; // ContentDisposition头信息 (下载文件打开方式 inline浏览器内部打开, attachment 以附件形式打开)
protectedString inputName = "inputStream"; // 需要Action中 提供 getInputStream 方法 返回 InputStream 提供下载文件 内容
}
Action 提供 InputStream 返回值 getInputStream 方法 ------- 指定下载文件流
配置 stream 结果集 参数 <paramname="contentType">${contentType}</param> ---- 在Action 中提供 getContentType
* ServletActionContext.getServletContext().getMimeType(filename);
配置 stream 结果集 参数 <param
name="contentDisposition">attachment;filename=${filename}</param>---- 在Action 提供 getFilename
*下载附件名乱码问题 , IE和火狐解决不同
public StringencodeDownloadFilename(String filename, String agent)
throws IOException {
if(agent.contains("Firefox")) { // 火狐浏览器
filename ="=?UTF-8?B?"
+ newBASE64Encoder().encode(filename.getBytes("utf-8"))
+"?=";
} else { // IE及其他浏览器
filename =URLEncoder.encode(filename, "utf-8");
}
return filename;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFileName() {
return name;
}
public InputStream getInputStream() {
String path = ServletActionContext.getServletContext().getRealPath("/1");
try {
InputStream is = newFileInputStream(path+"/"+name);
return is;
} catch (FileNotFoundException e) {}
return null;
}
相关文章推荐
- eclipse中的项目导入到源生项目中的各种问题
- Spring定时任务的几种实现
- Java线程常用的操作方法
- JAVA 文件输入/输出流
- 一个简单的Spring测试的例子
- Java 代码完成删除文件、文件夹操作
- [Java学习] xml工具
- [Java学习] springmvc集成activemq,消息产生
- Elasticsearch+Marvel+Kibana集群搭建
- eclipse中文变乱码原因及解决办法
- [Java学习] 黑马javaee点招综合练习
- java web 下载文件 浏览器弹出下载框
- java之路 static
- 如何使用springmvc框架在普通的servlet注入service
- Java之由String.getBytes()说编码
- java判断文件夹是否存在某一文件 如果存在就删除功能
- 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
- java中多线程常见的几个参数
- springMVC教程(六)缓存框架Ehcache使用详解
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间