您的位置:首页 > 其它

文章标题

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,可以解决对象依赖问题
优点:
解决了对象依赖的问题,循环引用的问题
提高了效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: