您的位置:首页 > 编程语言 > Java开发

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;

       }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: