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

一、访问或添加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 ;i<uploadImages.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解压目录的src\java目录中选择xwork-validator-1.0.3.dtd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd

时间: 2024-12-25 16:59:30

关于Struts2文件上传与自定义拦截器_java的相关文章

8、如何自学Struts2之Struts2文件上传[视频]

8.如何自学Struts2之Struts2文件上传[视频]   之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上:   http://pan.baidu.com/s/1kTDsa95 由于本次视频没有声音,将会在下节课"Struts2数据库访问"这一节课,一起再讲一下. 注意:不好意思,不知道为什么在这次录制过程中没有声音,很抱歉,本节重点是碰到一个空指针异常,原因是fileUpload这个拦截器要放在其他拦截器之前才没

JavaEE中struts2实现文件上传下载功能实例解析_java

本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下 一.文件上传 struts提交的文件组件上传, 前台: 1).提交方式POST 2).表单类型 multipart/form-data 3).input type=file 后台: Apache提供的FileUpload组件 核心类: FileItemFactory FileItem的工厂 ServletFileUpload servlet 中的文件上传的核心类 FileItem 封装了上传的表单文件项的

java中Struts2文件上传问题详解_java

首先是网页部分,upload_file.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>Upload File</title> </head> <body> <form act

关于struts2文件上传和保存到数据库的同步问题!急~

问题描述 利用struts2文件上传后,对文件信息保存到数据库.文件上传成功后,对文件信息进行保存,失败则不保存.问题就在于如果文件上传成功后,对数据库保存失败,那么该如何保持事务的准确性.目前相到两种解决方法:1.建立temp临时文件夹,当保存数据库成功,则copy文件到正式目录,不论文件上传成功失败,最后删除temp.(麻烦)2.使用异步对文件进行操作.(不大清楚实现逻辑)希望大家能给我提供方案.谢谢~ 解决方案 先插入数据,成功则保存文件,不成功则不进行处理不就可以了么解决方案二:同意ji

java中struts2实现文件上传下载功能实例解析_java

本文实例讲述了java中struts2实现文件上传下载功能实现方法.分享给大家供大家参考.具体分析如下: 1.文件上传 首先是jsp页面的代码 在jsp页面中定义一个上传标签   复制代码 代码如下: <tr>      <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>      <td bgcolor="#FFFFFF">

使用FLEX进行多文件上传和自定义上传信息

在Web应用中上传文件是比较常见的需求,在这里通过一个实际应用向大家介绍一下在 Flex下如何进行多文件上传,并在上传文件的同时提供一些自定义描述信息以便数据逻辑处 理. 功能需求 首先通过以下界面了解一下需求: 主要功能 包括: 1)允许添加多个上传的文件 2)自定义文件标题 3)可以对没 上传的或正在上传的文件删除 4)上传过程把窗体隐藏在后台,不影响用户的其他的 操作(这个就很简单,把窗体隐藏起来在主界面显示个上进工作按钮就可以了,需要的时候 再点击一下查看进度)

Struts2文件上传(一) Common-FileUpload

文件上传是许多项目都遇到的需求,Struts2中也带有文件上传功能,但它是利用的java领域的其他 俩个常用的文件上传的项目:Common- FileUpload和COS,在了解Struts2之前让我们了解下怎样使用 Common-FileUpload来实现文件上传以及文件上传实现过程中应该注意的问题. 在Common- FileUpload中,它把从客户端提交过来的表单封装成一个个FileItem对象,这也是它实现文件上传功能 的核心类.另一个很重要的类就是FileUploadBase,他的功

Struts2文件上传

以一个图片上传为例子,演示了文件上传的各个方面.包括客户端控制,服务端控制,图片预览,图片压缩等. 采用struts2的文件上传机制,除struts2必要的jar外还需要额外导入commons-fileupload.jar,commons-io-1.4.jar web.xml配置: 首先是一个上传界面及其HTML,和一个静态常量类: 客户端: 若直接点击上传,则效果如下: 对应的JS代码如下: 若是选择了非规定类型的文件,则效果如下

SSH框架网上商城项目第13战之Struts2文件上传功能_java

上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说.为此,这篇文章详细介绍一下Struts2实现文件上传的功能.1. 封装文件信息我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件.文件类型和文件名.针对我们要传的图片,我们新建一个Model如下: public class FileImage { private File file; private String contentType; private String file