Struts2.0文件上传:

浏览器端注意事项:

  1.表单提交方式method = post;

  2.表单中必须有一个<input type="file" name = "upload">组件;

  3.表单中必须设置enctype="multipart/form-data";

服务器端:

  Commons-fileupoad.jar

Struts2文件上传实现:

  strust2框架是使用一个fileupload的interceptor来完成文件上传,而我们要使用它:

  1.在action中我们可以提供类似一下的操作就能完成文件上传操作:

public UploadAction extends ActionSupport{private File upload;  //上传的文件private String uploadContentType;  //上传文件的mimeTypeprivate String uploadFilename;  //上传文件的文件名  //对以上三个属性实现get/set方法;
}

    注意:以上示例中的三个属性名称之间是有严格的命名规范的,upload名称需要同前端表单<input type="file">组件中的name属性值保持相同;第二个和第三个成员变量命名遵循第一个成员变量名称+自身的名称(ContentType/Filename);

  2.在Action的执行方法中将文件copy就可以完成文件上传。(strtus2.0框架提供了commons-io.jar包中有一个名为FileUtils的工具类使用它来实现文件copy)

  FileUtils.copyfile(File srcFile,File destFile);

Struts2文件上传注意事项:

  当我们把a.txt文件后缀更改为png后,上传出现问题,会报500空指针异常,然后我们将action extends ActionSupport,再次上传又会发现报404错误,然后我们将struts2.0中一个常量struts.devMode设置为true表示显示详细的错误报告,再次上传会报404错误,然后我们分析错误提示为没有定义一个input视图。分析得:struts2.0默认加载18个intercptor,当这些个intercptor在执行过程中如果出了问题,会将错误信息存储到action中,然后由名为workflow的interceptor执行跳转到指定的input视图。(为什么要extends ActionSupport,因为底层会调用ActionSupport中的addActionError等方法来传递错误信息)这时候我们要查看错误信息,就需要在action中配置一个name值为input的result标签指定一个错误页面,在错误页面中使用<s:actionerror/><s:fielderror/>。。。来查看错误信息。

  这时我们看到这么一条信息:

    Request exceeded allowed size limit! Max size allowed is: 2097152 but request was:2283170!

    错误信息显示,上传的文件信息过大

  在default.properties中有一个常量值为struts.multipart.maxSize = 2097152 (2m)  它是描述上传文件允许的最大值,这时候我们要在struts.xml中重新定义该常量值覆盖掉这个常量值即可。

    eg:<constant name = "struts.multipart.maxSize" value = "20971520"></constant> 这种设置方式为全局设置在整个项目中生效,如果想单独控制某个action的上传文件大小或者文件类型,可以在拦截器中定义,如下:

  我们还可以控制文件上传的类型。。。

    查看FileUploadInterceptor拦截器有如下三个属性:

      maximumSize(文件大小);allowedTypesSet(文件MimeType类型);allowedExtensionsSet(文件的后缀名)

      我们可以通过设置这三个属性的值来控制文件上传的具体属性:

        eg:

<action><interceptor-ref name = "fileUpload"><param name="maximumSize"></param>    <!-- 设置action允许上传文件的大小 --><param name="allowedtypes"></param>    <!-- 设置上传允许的文件的mimetype类型,多个使用逗号分开 --><param name="allowedtypes"></param>    <!-- 设置上传允许的文件的后缀名,多个使用逗号分开 --></interceptor-ref>  <interceptor-ref name="defaultStack"></interceptor-ref>  <!-- 因为当我们自行引入拦截器,那么默认的18个拦截器就不会执行,在这里要重新引入即可 -->
</action>

如果我们上传时,允许上传多个文件,该如何?

  客户端:多个<input type="file" name=""/>   多个file组件的name属性名要保持一致;

  服务器端:

    action中声明的三个参数类型要变更为数组或者List集合的类型:

      eg:        

public UploadAction extends ActionSupport{private File[] upload;  //上传的文件private String[] uploadContentType;  //上传文件的mimeTypeprivate String[] uploadFilename;  //上传文件的文件名//对以上三个属性实现get/set方法;
}

    action中实现文件copy使用遍历:

      eg:

public class uploadManyAction extends ActionSupport {private File[] upload;private String[] uploadContentType;private String[] uploadFileName;//对三个属性实现get/set方法public String execute() {String path = ServletActionContext.getServletContext().getRealPath("/upload");for (int i = 0; i < upload.length; i++) {File dest = new File(path, uploadFileName[i]);FileUtis.copyFile(upload[i],dest);}}
}

struts2框架的ajax开发:

json结构:

  json就是javascript中的对象和数组,通过这两种结构可以表示各种复杂的结构;

  1.对象:对象在js中表示为“{ }”括起来的内容,数据结构为{key:value,key:value,...}的键值对的结构,在面向对象的语言中,key对象的属性,value为对应的属性值,所以取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字,字符串,数组,对象几种。

  2.数组:数组在js中是中括号"[ ]"括起来的内容,数据结构为["android","javascript","c++",...]取值方式和所有语言中一样,使用索引取值,字段值的类型可以是数字,字符串,数组,对象几种。

  对象和数组之间可以嵌套,这样经果两种数据结构的组合就形成了复杂的数据结构了。

java中json工具的介绍:(java数据和js数据之间的转化)

  Fastjson简单使用介绍:

    先导入fastjson的jar包

    JSONObject.toJSONString(Object javabean);//将一个javabean转换成json对象;

    JSONArray.toJSONString(List<javabean> javabean);//将一个javabean的list集合转换成json对象;

    当需要对Date类型的字段进行格式化时需要在该字段上加上如下注释:

      @JSONField(format="yyyy-MM-dd")

    当需要对数据进行过滤,如某些字段的数据不需要生成:

      使用SerializaFilter接口的实现类PropertyFilter来实现属性的过滤:

    

SerializeFilter filter = new Propertyfilter(){@Override/***  arg0是要转换成json的对象*  arg1是属性名称*  arg2是属性值*  当下面方法返回false,则不转换该字段,返回true,则转换该字段;*/public boolean apply(Obect arg0,String arg1,Object arg2){if(arg1.equlas("columnFiledname")){return false;}return true;       }
}
String json = JSONObject.toJSONString(javabean,filter);  //使用toJSONString(Object obj,SerializeFilter sf)重载函数

  Jackson简单使用介绍:

spring mvc 它底层使用的就是jackson

  先导入jsckson的jar包;

  ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(javabean);//将一个javabean或者javabean的list集合均可以转换成json对象;

  当需要对date日期格式进行格式化时可以在上面两行代码中加入如下代码即可:

  mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));//设置一个日期格式化器

  过滤属性:

    在不需要的转化的字段加上注解@JsonIgnore即可;

    亦可以在javabean上面加上注解@JsonIgnoreProperties({"comun1","comun2","comun3"...});

  以上方法有缺陷,当有不同的需求需要生成不同的json数据,那么就需要对javabean中字段进行不同的过滤,这时候就需要使用如下方法(硬编码):

    在javabean上加入注解@JsonFilter("beanFilter")

  ObjectMapper mapper = new ObjectMapper();FilterProvider fp = new SimpleFilterProvide().addFilter("beanFilter", SimpleBeanPropertyFilter.filterOutAllExcept("comun1","comun2"));//只包含comun1和comun2字段;//FilterProvider fp = new SimpleFilterProvide().addFilter("beanFilter", SimpleBeanPropertyFilter.serializeAllExcept("comun1","comun2"));//不包含comun1和comun2字段;
mapper.setFilters(fp);String json = mapper.writeValueAsString(beanList);

struts2框架ajax开发使用response相应数据:

在struts2框架中获取HttpServletResponse对象,就可以通过response来完成将数据响应到浏览器;

浏览器端:

  绑定事件,向服务器发送ajax请求(jquery完成)

服务器端:

  action中可以通过response来直接写回数据,设置无返回值,或者返回null即可。

  js中eval(String str)函数可以将一个字符串转换成对象;在使用ajax时,$.post()异步请求函数后面一定要加上"json"参数告诉浏览器这是json格式的数据,再者可以使用eval函数将字符串转为json对象;

struts2框架ajax开发使用json插件来完成操作:

  首先要导入插件包:struts2-json-plugin-版本号.jar

  使用struts2提供的json插件三部曲:

    struts加载配置文件的顺序,会先加载插件包之后才会加载我们自己的struts.xml;

    1.将我们自己配置文件中的<package extends = "json-default"/> ;(json-default这个包在struts2-json-plugin.jar包中有)

    2.Action的返回视图<result name = "success" type = "json">;

    3.因为我们配置了上面两步,那么struts2框架就会将valueStack中栈顶元素转换成json响应到浏览器,所以说我们只需要将需要响应的数据 存入valueStack栈顶即可;

关于响应的json处理:

  忽略属性:

    方法1:在需要忽略的属性的get方法上面添加注解:@JSON(serialize=false)即可;

      上面的方案有弊端,当不同的action需要响应不同的过滤数据时这样就不通用了;

    方法2:

      在org.apache.struts2.json.JSONResult类中有两个属性:

        private List<Pattern> includeProperties;

        private List<Pattern> excludeProperties;

      他们可以设置响应的数据中是否包含或者不包含属性:

    <result name = "success" type = "json">

       <param name = "excludeProperties">ps\[\d+\].属性名,ps\[\d+\].属性名...</param>

       <!-- <param name = "includeProperties">ps\[\d+\].属性名,ps\[\d+\].属性名...</param> -->

    </result>

    设置root:

      没有设置root前返回的json结构 ps:[{},{}]

      设置root它的根为ps后的返回的json结构  [{},{}]

    <result name = "success" type = "json">

      <param name = "ps">ps</param>

       <param name = "excludeProperties">\[\d+\].属性名,ps\[\d+\].属性名...</param>

       <!-- <param name = "includeProperties">\[\d+\].属性名,ps\[\d+\].属性名...</param> -->

    </result>

    这样响应到客户端就是一个数组那么取值可以使用循环;

Struts2中配置文件struts.xml可以分解各个模块的xml文件,然后在struts.xml中使用<include>标签引入即可,方便struts.xml的管理和阅读。

Struts2.0注解开发:

struts2.0注解时在struts2的2.1版本后引入的,注解的作用就是用来替代原来struts.xml中的一些配置,如<package><action><result>.....等标签;

使用注解开发首先需要导入struts2-convention-plugin-版本号.jar包;

为何能识别到注解呢?

  因为StrutsParparedAndExecuteFilter过滤器中在加载配置文件的时候会加载struts-plugin.xml插件配置文件,该配置文件中定义了一个名为[struts.convention.package.Locators]的常量,它的值为[action,actions,struts,struts2],也就是说系统会扫描符合的包名进行解析;如果需要更改这种命名规范的话,只需要在struts.xml文件中更改该常量值即可;

对于action可以加如下注解来替代配置文件

注解位置 注解名称 对应的配置文件 释义
class @Namespace("/") <package namespace="/">  
class @ParentPackage("struts-default") <package extends="struts-default">  
class @Results({@Result(name="",type="",location=""),@Result(name="",type="",location="")......}) <global-results><result></global-results> 全局result
class    @InterceptorRefs({@InterceptorRef("interceptor-1"),@InterceptorRef("defaultStack")})    
method  @Action(value="path",results={@Result(name="",type="",location=""),@Result(name="",type="",location="")......}) <action name="path" class="" method=""><result>  
method @Action(value="",interceptorRefs=@InterceptorRef("validation"))   它时用于处理拦截器的
method @Actions(@Action(),@Action(),@Action()......)   可以通过多个路径来访问同一个action

使用注解开发完成自定义拦截器对页面的权限控制

1.创建一个类来实现Interceptor接口或者继承MethodFilterInterceptor;

2.在struts.xml文件中声明;

eg:  

  <package name="base" namespace="/" extends="struts-default">
    <interceptors>

      <interceptor name="自定义拦截器name" class = ""></interceptor>

      <interceptor-stack name="myStack">

        <interceptor-ref name = "自定义拦截器name"/>

        <interceptor-ref name = "defaultStack"/>

      </interceptor-stack>

    </interceptors>
  </package>

3.在action的配置中引用(使用注解)

eg:

  @Namespace("/")

  @ParentPackage("base")

  public class ProductAction extends ActionSupport{

    @Action(value="showProduct",interceptorRefs={@InterceptorRef("myStack")})

    public void showProduct(){

      ......

    }

  }

注意@ParentPackage注解中的包名需要同配置文件中定义拦截器的包名相同。(如上两个红色标注)。

转载于:https://www.cnblogs.com/laodang/p/9570577.html

Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发)相关推荐

  1. Asp.net MVC 1.0 RTM中实现文件上传

    Asp.net MVC 1.0 RTM中实现文件上传 在我们开始之前,你需要知道一个form以post方式上传文件的方式,你将要增加一个特别的enctype attribute到form标签上,为了这 ...

  2. 处理文件上传后返回json数据在IE出现文件下载问题(框架是spring boot)

    处理文件上传后返回json数据在IE出现文件下载问题(框架是spring boot) 最近做了一个上传xml文件的功能,在谷歌浏览上传没有问题,可以返回正确的结果,但在ie浏览器上上传成功以后,一直提 ...

  3. struts2教程(8)--文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

  4. ThinkPHP5.0+七牛云SDK文件上传

    一.问:为什么建议大家使用对象存储 对象存储可以简单理解为用来存储图片.音频.视频等非结构化数据的数据池.相对于主机服务器,具有读写速度快,利于分享的特点.我为什么建议大家使用对象存储?我总结了这六点 ...

  5. 第十二章 文件上传和下载

    目录 如何实现文件上传 文件上传的相关API 实现文件上传 实现文件下载 一.如何实现文件上传 要实现Web开发中的文件上传功能,通常需完成两步操作:一是在Web页面中添加上传输入项:二是在Servl ...

  6. Netty(三)文件上传下载、心跳检测

    文件上传 Http服务 //http服务 public final class HttpServer {static final boolean SSL = System.getProperty(&q ...

  7. Asp.net2.0下的大文件上传服务器控件

    最近本来准备在Alisoft上做点东西玩,做的过程中,涉及到了文件上传.刚开始,准备在网上找几个用,发现国外好用的要钱,而国内的,开源的又不好用,所以决定自己也写一个,顺便以后赚点外快.我看了一下,这 ...

  8. [网络安全自学篇] 三十三.文件上传之绕狗一句话原理和绕过安全狗(六)

    这是作者的系列网络安全自学教程,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文详细讲解了Upload-labs靶场及文件上传漏洞20道CTF题目,并结合C ...

  9. [网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)

    这是作者的系列网络安全自学教程,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了文件上传漏洞和IIS6.0解析漏洞,包括PHP345文件绕过上传.Win ...

最新文章

  1. linux正则表达式sed
  2. 为什么有的项目不能打断点_《街霸:对决》:有效利用“打断”机制,让玩家在战斗中越级战斗...
  3. 算法工程师和算法框架开发,谁会代表未来?
  4. STM32F103单片机系统时钟部分归纳
  5. 【Java】5.1 类和对象
  6. 复习日记-validate表单校验插件/菜单管理dTree
  7. MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.
  8. 苏宁大数据怎么运营_运营商大数据精准获客
  9. 易语言python1.1模块_易语言之编写模块与引入模块
  10. 酒店居然用大数据赚你钱?
  11. ubuntu 安装 最新 PyMOL [源码安装][免费]
  12. zepto tap “点透”研究
  13. No module named MYSQLdb 问题解决
  14. 超宽带 DWM1000模块 校准
  15. 软件工程实验报告三--需求分析及文档编写
  16. 什么是外汇EA?外汇EA有什么风险?
  17. 国家药品不良反应监测中心 ADR 电子传输EDI解决方案
  18. 自然语言处理基于java实现(1) 之 中文分词
  19. 自制的MATLAB拼图游戏GUI界面版详解(下篇)
  20. P1146 硬币翻转 python题解

热门文章

  1. Codeforces 1479A. Searching Local Minimum(注意输入+二分)
  2. mysql5.7.17版本介绍_mysql5.7.17版本升级源码方式及恢复主主复制
  3. iOS Hacker 使用Theos开发tweak
  4. ADO连接ACCESS数据库
  5. CF B. Working out
  6. undefined reference to `sqrt‘ 问题
  7. x265-确定slice type-3
  8. linux脚本提示,linux开机提示信息脚本
  9. HLS Pargmas(2) interface
  10. linux可执行文件格式