文章标题
2016-06-22 23:07
363 查看
一、 配置文件运行的过程
二、文件上传加强
1、当上传文件大小超过界限时,会报 no result input异常 通过在struts.xml文件中配置常量可以设置上传文件大小 * struts.multipart.maxSize=2097152 默认上传文件总大小 2MB * 超过文件总大小,跳转input 视图, 通过 <s:actionError /> 回显错误信息 2、在struts.xml 设置上传总大小 <constant name="struts.multipart.maxSize" value="20000000"></constant> 设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性 FileUpload 拦截器有 3 个属性可以设置. * maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB * allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔 image/jpeg,text/html * allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔 如果针对fileUpload 进行参数设置,当出错时,在页面通过 <s:fieldError /> 回显错误信息 3、配置input结果视图,用于处理提示上传文件大小,超限时的提示信息。 因为在内部有个拦截器workflow,当出现错误时,会返回input结果视图 4、在进入input结果视图后,提示相应的错误信息。 fileUpload拦截器在上传文件时,如果出现错误,会记录错误信息 页面中引入struts2标签 <%@ taglib uri="/struts-tags" prefix="s" %> <s:actionError /> 显示action乱码信息 <s:fieldError /> 显示上传错误信息 5、错误信息国际化 国际化,一个软件根据本地语言环境的设置,可以表现出不同的语言界面。 错误信息,框架本身就是采用国家化实现的 配置国际化资源文件 struts.messages.upload.error.SizeLimitExceededException= struts.messages.error.content.type.not.allowed= struts.messages.error.file.too.large=三个属性 加载资源配置文件文件 <!-- 加载国际化配置文件 --> <constant name="struts.custom.i18n.resources" value="uploadError" /> value写的是文件的基名,不包括扩展名 当有两个限制文件大小的配置同时存在时,需要先满足struts.xml文件中配置的常量文件大小,再满足action中配置的文件大小 6、解决文件扩展名问题 在action中配置拦截器属性 <action name="customerAction_*" class="customerAction" method="{1}"> <!--引入拦截器 --> <interceptor-ref name="myInterceptorStack"> <!-- 设置上传文件的类型 MIME类型之间可以用,隔开--> <param name="fileUpload.allowedTypes">image/jpeg</param> <!--设置上传文件大小 --> <param name="fileUpload.maximumSize">1000000</param> </interceptor-ref> </action>
三、Struts2支持下的文件下载
3.1 web文件下载步骤
一个流: 使用response向浏览器输出文件所对应的流 两个头 设置文件格式 Response.setHeader(“content-type”,”image/jpeg”); 设置文件以下载方式,并指定文件名称 Response.setheader(“content-disposition”,”attachment;filename=”+filename);
3.2 struts2文件下载步骤
Action类中 /** * 处理文件下载的问题 * */ * 文件名 String picName = null; public String download() throws Exception { //查询客户详情 CstCustomerDetail customerDetail = customerDetailService.findById(customer.getCustId()); if(customerDetail != null){ picName = customerDetail.getCustPic(); } return "download"; } /**获取文件输入流 * @return * @throws Exception */ public InputStream getInputStream() throws Exception { String path = ServletActionContext.getServletContext().getRealPath("/"); //获取文件 File file = new File(path+"/WEB-INF/upload/"+picName); if(file.exists()){ //如果文件存在,就返回文件输入流 return new FileInputStream(file); } return null; } /**获取MIME类型 * @return * @throws Exception */ public String getContentType() throws Exception { // TODO Auto-generated method stub //通过文件名,返回文件MIME类型 return ServletActionContext.getServletContext().getMimeType(picName); } /**弹出框,实现文件下载 * @return * @throws Exception */ public String getContentDisposition() throws Exception { //得到请求的这个浏览器的版本 String agent = ServletActionContext.getRequest().getHeader("user-agent"); //以下载的方式 return "attachment;filename="+encodeDownloadFilename(picName,agent); //return "inline"; 浏览器直接打开图片 } /** * 下载文件时,针对不同浏览器,进行附件名的编码 * @param filename 下载文件名 * @param agent 客户端浏览器 * @return 编码后的下载附件名 * @throws IOException */ public String encodeDownloadFilename(String filename, String agent) throws IOException{ if(agent.contains("Firefox")){ // 火狐浏览器 filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?="; }else{ // IE及其他浏览器 filename = URLEncoder.encode(filename,"utf-8"); } return filename; } 配置文件中 struts-customer.xml <!--下载文件 --> <result name="download" type="stream"> <!--获取文件MIME类型 --> <param name="contentType">${contentType}</param> <!--以下载方式返回图片 ${contentDisposition} ngel表达式,可以调用action中对应的方法 --> <param name="contentDisposition">${contentDisposition}</param> </result>
四、Fastjson的使用
导入jar包fastjson.jar 常用API String jsonStr = JSON.toJSONString(Object obj); FastJson默认解决对象依赖,循环引用问题,可以手动取消 JSON.toJSONString(customer,SerializerFeature.DisableCircularReferenceDetect) 使用注解@JSONField(serialize=false)可以将设置指定的属性不转换为json,可以解决对象依赖问题 优点: 解决了对象依赖的问题,循环引用的问题 提高了效率
相关文章推荐
- 【BZOJ-1218】激光炸弹 前缀和 + 枚举
- 清除浮动——clearfix
- 我的数组类
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
- putty 无密码ssh linux
- opencv学习笔记(五)镜像对称
- PHP 常量
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。
- 2016-6-22 知识点总结
- final关键字
- 邮件主题、别名中文乱码问题
- RecyclerView中itemDecoration
- LeetCode--No.22--Generate Parentheses--hold
- JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
- JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
- Android中的内存储、外存储概念
- 测试基础之网站测试
- 让 百度 谷歌更快搜到你网站