1.文件上传
必要前提:
a.表单method必须是post;
b.enctype取值必须是multipart/form-data;
c.提供文件选择域。
<body>
<s:actionerror></s:actionerror>
<s:form action="upload.action" method="POST" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"></s:textfield>
<s:file name="photo" label="照片"/>
<s:submit value="上传"/>
</s:form>
</body>
动作类:
public class UploadAction extends ActionSupport {
//表单上提供的字段
private String username;
private File photo;
//Struts2在文件上传时提供的属性
private String photoFileName;//上传的文件名。上传字段名称+FileName
private String photoContentType; //上传文件的MINE类型。上传字段名称+contentType
public String upload() throws Exception {
//创建目录
ServletContext application = ServletActionContext.getServletContext();
String filePath = application.getRealPath("/WEB-INF/files");
File file = new File(filePath);
if (!file.exists()){
file.mkdirs();
}
//存photo
//拷贝:把photo的临时文件复制到指定位置,但是临时文件还在
// FileUtils.copyFile(photo, new File(file,photoFileName));
//剪切:吧临时文件剪切到指定位置,临时文件没有啦
photo.renameTo(new File(file, photoFileName));
return null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
}
2、文件上传的配置
2.1、文件上传大小限制(默认是2MB)
<constant name="struts.devMode" value="true"> </constant>
<!--第一种:struts.multipart.maxSize=2097152 默认最大2mb-->
<!--<constant name="struts.multipart.maxSize" value="5242880"></constant>-->
<package name="ppp" extends="struts-default">
<action name="upload" class="com.ljb.web.UploadAction" method="upload">
<!--第二种:通过fileUpload的拦截器注入参数,控制文件大小-->
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">
5242880
</param>
</interceptor-ref>
<result>/success.jsp</result>
<result name="input">/upload.jsp</result>
</action>
</package>
2.2、限制文件上传的类型
<package name="ppp" extends="struts-default">
<action name="upload" class="com.ljb.web.UploadAction" method="upload">
<!--第二种:通过fileUpload的拦截器注入参数,控制文件大小-->
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">
5242880
</param>
<!--a、通过限制上传文件的扩展名,多个用逗号分隔-->
<param name="fileUpload.allowedExtensions">
jpg,png,bmp
</param>
<!--b、通过限制上传文件的MIME类型-->
<param name="fileUpload.allowedTypes">
image/bmp,image/pjpeg,image/jpg
</param>
</interceptor-ref>
<result>/success.jsp</result>
<result name="input">/upload.jsp</result>
</action>
</package>
3.出错后的错误信息中文提示(Struts2中的所有文本提示都是基于国际化的)

解决办法:用国际化消息资源包,把对应的key取值改为中文即可
<constant name="struts.custom.i18n.resources" value="filepload_message"></constant>
struts.messages.error.content.type.not.allowed=上传文件类型不匹配: {0} "{1}" "{2}" {3}
4.文件下载:其实就是一种结果类型(Stream)
public class DownloadAction extends ActionSupport {
//注意:在给inputstream指定名字时,不能使用in!!!
public InputStream inputStream;
private String fileName;
public String download() throws Exception {
//找到文件路径
String path = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files/时机.png");
inputStream = new FileInputStream(path);
fileName = "照片.jpg";
//如果有中文,需要urlencoder进行编码
fileName = URLEncoder.encode(fileName,"UTF-8");
return "success";
//剩下的交给stream类型的结果去完成
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
配置文件
<action name="download" class="com.ljb.web.DownloadAction" method="download">
<result name="success" type="stream">
<!--inputName属性:配置输入流。其实就是把动作类的输入流字段名写进来-->
<param name="inputName">inputStream</param>
<!--contentDisposition:设置响应消息头,告知浏览器以下载的方式打开
使用ognl表达式动态获取文件名-->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!--contentType:设置响应消息头,告知浏览器,响应正文的MIME类型-->
<param name="contentType">application/octet-stream</param>
</result>
</action>
OGNL简介
1、什么是OGNL
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
2、OGNL的功能
前提:OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库
2.1、支持普通方法的调用
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ognl</title>
</head>
<body>
<s:property value="OGNL-Expresion"></s:property>这是一个OGNL表达式<br>
<s:property value="'OGNL-Expresion'"></s:property>这是一个普通的字符串<br>
<s:property value="'OGNL-Expresion'.length()"></s:property>使用普通字符串调用获取长度方法<br>
2.2、访问静态成员(静态属性,静态方法)
(EL表达式只能调用静态方法)
<%--访问静态属性的方式:@全类名@静态名--%>
<s:property value="@java.lang.Integer@MAX_VALUE"></s:property><br>
<%--访问静态方法,在struts2中,ognl默认禁用访问静态方法。--%>
<%--struts.ognl.allowStaticMethodAccess=false--%>
<%--我们通过在struts.xml中启用--%>
<s:property value="@java.lang.Math@random()"></s:property><br>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
2.3、操作集合对象
<%--创建list对象--%>
<s:radio name="gender" list="{'男','女'}"></s:radio><br>
<%--创建map对象 1,0是value --%>
<s:radio name="gender1" list="#{'1':'男','0':'女'}"></s:radio>
网友评论