关于Struts2文件上传与自定义拦截器

HR3L4E

HR3L4E

2016-02-19 10:32

今天图老师小编要跟大家分享关于Struts2文件上传与自定义拦截器,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

一、访问或添加request/session/application属性

public String scope() throws Exception{
   ActionContext ctx = ActionContext.getContext();
   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app
   ctx.getSession().put("ses", "session范围");//往session里放入ses
   ctx.put("req", "request范围");//往request里放入req
   return "scope";
}
JSP:
 body
    ${applicationScope.app} br
    ${sessionScope.ses}br
    ${requestScope.req}br
 /body

二、获取HttpServletRequest / HttpSession / ServletContext / HttpServletResponse对象

方法一,通过ServletActionContext.类直接获取:
public String rsa() throws Exception{
 HttpServletRequest request = ServletActionContext.getRequest();
 ServletContext servletContext = ServletActionContext.getServletContext();
 request.getSession() 
 HttpServletResponse response = ServletActionContext.getResponse();
 return "scope";
}
方法二,实现指定接口,由struts框架运行时注入:
public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAware{
 private HttpServletRequest request;
 private ServletContext servletContext;
 private HttpServletResponse response;
 public void setServletRequest(HttpServletRequest req) {
  this.request=req;
 }
 public void setServletResponse(HttpServletResponse res) {
  this.response=res;
 }
 public void setServletContext(ServletContext ser) {
  this.servletContext=ser;
 }
}

三、文件上传

第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。

第二步:把form表的enctype设置为:“multipart/form-data“,如下:
form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post"
  input  type="file" name="uploadImage"
/form

第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:

public class HelloWorldAction{
  private File uploadImage;//得到上传的文件
  private String uploadImageContentType;//得到文件的类型
  private String uploadImageFileName;//得到文件的名称
  //这里略省了属性的getter/setter方法
  public String upload() throws Exception{
 String realpath = ServletActionContext.getServletContext().getRealPath("/images");
 File file = new File(realpath);
 if(!file.exists()) file.mkdirs();
 FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName));
 return "success";
  }
}

四、多文件上传

第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。

第二步:把form表的enctype设置为:“multipart/form-data“,如下:
form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post"
  input  type="file" name="uploadImages"
  input  type="file" name="uploadImages"
/form

第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:
public class HelloWorldAction{
  private File[] uploadImages;//得到上传的文件
  private String[] uploadImagesContentType;//得到文件的类型
  private String[] uploadImagesFileName;//得到文件的名称
  //这里略省了属性的getter/setter方法
  public String upload() throws Exception{
 String realpath = ServletActionContext.getServletContext().getRealPath("/images");
 File file = new File(realpath);
 if(!file.exists()) file.mkdirs();
 for(int i=0 ;iuploadImages.length; i++){ File uploadImage = uploadImages[i];
    FileUtils.copyFile(uploadImage, new File(file, uploadImagesFileName[i]));
}
 return "success";
  }}

五、自定义拦截器

要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:
public class PermissionInterceptor implements Interceptor {
   private static final long serialVersionUID = -5178310397732210602L;
   public void destroy() {
   }
   public void init() {
   }
   public String intercept(ActionInvocation invocation) throws Exception {
  System.out.println("进入拦截器");
 if(session里存在用户){
  String result = invocation.invoke();
 }else{
  return “logon”;
 }
 //System.out.println("返回值:"+ result);
 //return result;
    }
}
package name="csdn" namespace="/test" extends="struts-default"
 interceptors
           interceptor name=“permission" class="cn.csdn.aop.PermissionInterceptor" /
           interceptor-stack name="permissionStack"
    interceptor-ref name="defaultStack" /
   interceptor-ref name=" permission " /
            /interceptor-stack
  /interceptors
 action name="helloworld_*" class="cn.csdn.action.HelloWorldAction" method="{1}"
  result name="success"/WEB-INF/page/hello.jsp/result
  interceptor-ref name="permissionStack"/
 /action
/package

因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。

如果希望包下的所有action都使用自定义的拦截器,可以通过default-interceptor-ref name=“permissionStack”/把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。

六、输入校验

在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
对于输入校验struts2提供了两种实现方法:
1. 采用手工编写代码实现。
2. 基于XML配置方式实现。

七、手工编写代码实现对action中所有方法输入校验

通过重写validate() 方法实现, validate()方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过s:fielderror/显示失败信息。
validate()使用例子:
public void validate() {
       if(this.mobile==null || "".equals(this.mobile.trim())){  this.addFieldError("username", "手机号不能为空");
        }else{  if(!Pattern.compile("^1[358]\d{9}").matcher(this.mobile.trim()).matches()){
  this.addFieldError(“mobile", "手机号的格式不正确"); }
       }
}

验证失败后,请求转发至input视图:

result name="input"/WEB-INF/page/addUser.jsp/result
在addUser.jsp页面中使用s:fielderror/显示失败信息。
通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过s:fielderror/显示失败信息。

validateXxx()方法使用例子:
public String add() throws Exception{  return "success";}
public void validateAdd(){
          if(username==null && "".equals(username.trim()))  this.addFieldError("username", "用户名不能为空");
}

验证失败后,请求转发至input视图:

result name="input"/WEB-INF/page/addUser.jsp/result
在addUser.jsp页面中使用s:fielderror/显示失败信息。

八、输入校验的流程

1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4、再调用action中的validate()方法。
5、经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。

九、基于XML配置方式实现对action的所有方法进行输入校验

使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法。如果Action类为cn.csdn.UserAction,那么该文件的取名应为:UserAction-validation.xml。下面是校验文件的模版:
?xml version="1.0" encoding="UTF-8"?
!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"

validators
    field name="username"
        field-validator type="requiredstring"
            param name="trim"true/param
            message用户名不能为空!/message
        /field-validator
    /field
/validators

field指定action中要校验的属性,field-validator指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
message为校验失败后的提示信息,如果需要国际化,可以为message指定key属性,key的值为资源文件中的key。
在这个校验文件中,对action中字符串类型的username属性进行验证,首先要求调用trim()方法去掉空格,然后判断用户名是否为空。
编写校验文件时,不能出现帮助信息
在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:
windwos-preferences-myeclipse-files and editors-xml-xmlcatalog
点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的srcjava目录中选择xwork-validator-1.0.3.dtd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

关于Struts2文件上传与自定义拦截器

编程语言 网络编程
关于Struts2文件上传与自定义拦截器

java Struts2 在拦截器里的跳转问题

Web开发
java Struts2 在拦截器里的跳转问题

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

struts2中实现多个文件同时上传代码

编程语言 网络编程
struts2中实现多个文件同时上传代码

Windows8文件拖放、自定义锁定屏幕功能

电脑入门
Windows8文件拖放、自定义锁定屏幕功能

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

关于Struts2的类型转换详解

编程语言 网络编程
关于Struts2的类型转换详解

如何自定义Win7文件鼠标停留时的内容注释

电脑网络
如何自定义Win7文件鼠标停留时的内容注释

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

一个ORACLE分页程序挺实用的.

一个ORACLE分页程序挺实用的.

定时保养开启电脑管家健康预警

定时保养开启电脑管家健康预警
下拉加载更多内容 ↓