Java框架之Struts2(五)
本文主要介绍Struts2 文件上传、Struts2 多文件上传、文件下载、上传文件的过滤、输入校验、输入校验的流程。
一、Struts2 文件上传
步骤:
1) 页面
<form action="FileUpAction" method="post" enctype="multipart/form-data" >
<input type="file" name="fileAAA" >
<input type="submit" value="上传">
</form>
2)
public class FileUpAction extends BaseAction{
private File fileAAA; //用来得到上传的文件,注意,它的名字必须和表单中的属性名相同
private String fileAAAContentType ; //得到文件的类型,名字必须这么叫 fileAAA + ContentType
private String fileAAAFileName; //得到文件名,必须这么叫 fileAAA+FileName
.. 一定不要忘了 get 和 set 方法
public String uploadFile() throws IOException{
String realpath=ServletActionContext.getServletContext().getRealPath("/up_images");
System.out.println(realpath);
File f=new File(realpath,fileAAAFileName); // c:/tomcat/xxx/up_images/dog.jpg
FileUtils.copyFile(fileAAA,f); //FileUtils 是 org.apache.commons.io 包中的
//msg="上传文件成功";
ActionContext ctx=ActionContext.getContext();
ctx.put("info", "文件上传成功");
ctx.put("fileAAAFileName", fileAAAFileName);
return "success";
}
}
3)配置文件
<package name="p_fileup" extends="struts-default" >
<action name="fileUpAction" class="cat.action.FileUpAction" method="uploadFile">
<result name="success">/file_up.jsp</result>
</action>
</package>
关键点总:
1) form 表单的 enctype 一定要写成 multipart/form-data
2) Action 中,要定义三个变量,而且命名有规则
3) 可以使用 FileUtils 这样的工具类,简化操作
4) 上传文件的大小,默认最大2m 如果想设置
<constant name="struts.multipart.maxSize" value="104857600"></constant> //这个value 是按字节算的
二、Struts2 多文件上传
1) multi_fileup.jsp
<form action="multiFileUpAction" method="post" enctype="multipart/form-data" >
<input type="file" name="fileAAA" >
<input type="file" name="fileAAA" >
<input type="file" name="fileAAA" >
<input type="submit" value="上传">
</form> ${info }
2)
public class MultiFileUpAction extends BaseAction{
private File [] fileAAA; //用来得到上传的文件,注意,它的名字必须和表单中的属性名相同
private String [] fileAAAContentType ; //得到文件的类型,名字必须这么叫 fileAAA + ContentType
private String [] fileAAAFileName; //得到文件名,必须这么叫 fileAAA+FileName
//要生成get set 方法
public String multiFileUp() throws IOException{
String realpath=ServletActionContext.getServletContext().getRealPath("/up_images");
for(int i=0;i<fileAAA.length;i++){
File f=new File(realpath,fileAAAFileName[i]);
FileUtils.copyFile(fileAAA[i], f);
//System.out.println(fileAAAContentType[i]); //image/pjpeg
}
ServletActionContext.getRequest().setAttribute("info", "多个文件上传成功");
以下几种方式也可以传送提示信息
/* msg="哈哈,文件上传成功";
request.setAttribute("msg", "上传成功");
ActionContext.getContext().put("msg", "文件上传成功");*/
return "success";
}
...
三、文件下载
1) 在 file_up.jsp中加上
<a href="downloadAction?fileName=${fileAAAFileName }"> 下载</a> // ${fileAAAFileName } 指的是文件名
2) action
public class DownloadAction {
private String fileName;
public String execute(){
return "success";
}
public InputStream getInputStream() throws FileNotFoundException{
String directory=ServletActionContext.getServletContext().getRealPath("/up_images");
String path=directory+"/"+fileName;
return new FileInputStream(path);
}
public String getFileName() {
//处理一下下载的时候,中文的问题
fileName = new String(fileName.getBytes(),"iso8859-1"); //这里要try catch
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
3)配置文件
<action name="downloadAction" class="cat.action.DownloadAction" >
<result name="success" type="stream" >
<param name="contentType">text/plain</param> //指定下载文件的类型,默认是 text/plain
<param name="inputName">inputSteam</param> //默认值是 inputSteam
<param name="bufferSize">2048</param> //缓冲区
<param name="contentDisposition">
attachment;filename="${fileName}" 动态的得到文件名,并指定
</param> </result>
</action>
需要注意的问题:
如果图片名含有中文,在页面显示将是不正常的,可以在 tomcat 的 server.xml加上
URIEncoding="utf-8" 这样的配置 如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
四、上传文件的过滤
== 用Struts2 带的拦截器过滤
Struts2提供了一个上传文件的拦截器,通过配置它可以实现文件过滤,Struts2 中的文件,上传过滤器是 FileUpload. 可以在Action 中配置该拦截器的引用。配置FileUpload 拦截器时,可以指定两个参数。
-- alowTypes 指定允许上传的文件类型,多个之间用逗号分隔
-- maxmumSize 允许文件大小,以字节为单位
== 手工过滤
如果要手动判断文件类型,则通过 xxxContentType 属性即可。如果要判断文件大小,则通过 File对象获取文件大小是否符合即可。
五、输入校验
在struts 中,有两种校验方式
1) 手工方式
2) 基于xml配置的方式
=== 1) 手工方式
验证的代码 写在 action 中
通过重写 validate() 或 validateXxx() 方法实现
//例一 验证action中的所有方法 在Action 中加入
public void validate(){
if("".equals(userName)||userName==null){
//addFieldError 是从 ActionSupport 继承来的
this.addFieldError("userName", "账号不能为空");
} if("".equals(phone)||phone==null){
this.addFieldError("phone", "电话不能为空");
}
else{
if(!phone.matches("1[3587]\\d{9}")){
this.addFieldError("phone", "电话格式不对");
}
}
}
2)在配置文件中
<action name="userAction_*" class="cat.action.UserAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="input">/user.jsp</result> //出错以后,会自动转到叫 input 的视图
</action>
说明 :上面的 validate 会验证所有的该Action 中的方法
3)页面
//要导入 标签库
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:fielderror/> //用来显示出错信息 <form action="userAction_update" method="post" >
<input type="text" name="userName">
<input type="text" name="phone">
<input type="submit" />
</form>
//例二 明确指定要验证哪个方法在action 中
public void validateAdd(){
if("".equals(userName)||userName==null){
//addFieldError 是从 ActionSupport 继承来的
this.addFieldError("userName", "账号不能为空");
}
} //这个方法,只验证update方法
public void validateUpdate(){
if("".equals(phone)||phone==null){
this.addFieldError("phone", "电话不能为空");
}
else{
if(!phone.matches("1[3587]\\d{9}")){
this.addFieldError("phone", "电话格式不对");
}
}
}
//其他部分不变,可以发现,访问哪个方法,哪个方法将会被校验
六、输入校验的流程
1) 类型转换器(如果我们不提供,它用的是系统内部的类型转换器)对请求参数进行类型转换,并把转换后的值传给Action 中的属性
2) 如果在执行类型转换的时候发生异常,系统会将异常信息保存到 ActionContext , conversionError 拦截器会把异常信息封装到fieldErrors里
3) 系统会通过反射技术,调用 action中的 validateXxx() 方法,Xxx是方法名,如果有错误信息,也往 fieldErrors里放
4) 调用 action中的 validate() 方法,如果有错误信息,也往 fieldErrors里放
5) 经过上面的四步,如果 fieldErrors 存在错误信息,即这个集合的size大于0,系统会自动的把请求转到一个叫 input 的视图上,
注意: 类型转换器转换时发生的异常,也会放到 fieldErrors里
&&错误信息的显示
1.el表达式法:
${errors.errMsg[0]}、${errors["user.id"][0]}
对于上例,可以这样取
${errors.userName[0]} //得到用户名不能为空
${errors.phone[0]} //得到电话不能为空
2.ognl表达式:
<s:property value="errors.errMsg[0]"/>、[s:property value="errors['syscode.code_id'][0]"/>
3.ognl表达式(数据requestk 中取):
<s:property value="#request.errors.errMsg[0]"/>、[s:property value="#request.errors['syscode.code_id'][0]"/>
如果 validate 和 validateXxx 这两个方法都存在,先调用 validateXxx,再调用 validate
附: 关于类型转换器出现的异常信息,如何自定义
1) 在src 下加一个 message.properties 文件,内容如下:
invalid.fieldvalue.age = 年龄不能是数字
2) 配置文件中,引入这个资源文件
<constant name="struts.custom.i18n.resources" value="message" />
Java框架之Struts2(五)的更多相关文章
- Java框架之Struts2(一)
在学习Struts2之前,我们要知道Java为什么要有反射机制呢?反射机制可以说是填补Java不能动态访问某一个类的空白.利用反射机制,动态的创建一个对象.动态的访问类的某个属性,而且访问哪一个属性自 ...
- java框架之Struts2(1)-简介及入门
简介 Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器 (Controller) 来建立模型与视 ...
- Java框架之Struts2(六)
一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为E ...
- Java框架之Struts2(二)
一.Action 配置说明 //请求的直接转发 <package name="packageUser" namespace="" extends=&quo ...
- Java - 框架之 Struts2
一. Package 标签 1. 标签属性:name : 包的名称,只有在一个项目中不重名即可.extends : 继承哪个包,默认为 struts-default.name ...
- java框架之Struts2(2)-访问Servlet API及请求数据封装
准备 为后面测试示例编写代码及配置如下: package com.zze.bean; import java.util.Date; public class User { private String ...
- java框架之Struts2(4)-拦截器&标签库
拦截器 概述 Interceptor (拦截器):起到拦截客户端对 Action 请求的作用. Filter:过滤器,过滤客户端向服务器发送的请求. Interceptor:拦截器,拦截的是客户端对 ...
- java框架篇---Struts2的处理流程
一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...
- java框架之struts2简介
一.Struts2简介 1.Struts2概述 Struts2是Apache发行的MVC开源框架.注意:它只是表现层(MVC)框架. M:model-----数据 ...
随机推荐
- visual studio 2017使用技巧
visual studio 2017使用技巧 批量删除代码中的空白行 Ctrl + H, 查找: ^(?([^\r\n])\s)*\r?$\r?\n 替换: 使用正则表达式 当前文档 常用快捷键 注释 ...
- 前端基于easyui的mvc扩展
背景 由于MVC的前端是基于jquery.validate和jquery.validate.unobtrusive来实现的,但是当我们要使用其他的ui组件且组件本身就带有完整的验证功能的话,那么要让它 ...
- mysql最基础命令
1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES;2:2.创建一个数据库MYSQLDATAmysql> Create DATABASE MY ...
- iOS 系统通知
iOS相当多一部分系统事件实际上都是通过通知来完成的,依赖于通知的广播形式,我们可以在AppDelegate中通过添加空通知来捕捉所有通知: static NSString *const MYNOTI ...
- 笔记:Activity的启动过程
Activity的创建特点 作为四大组件之一的Activity,它不像普通java对像那样,可以new出来,然后去使用.而是调用 startActivity()这样的方式启动.那么Android系统是 ...
- 牛客JS编程大题(一)
1.找出元素 item 在给定数组 arr 中的位置 function indexOf(arr,item){ return arr.indexOf(item);} 2.计算给定数组 arr 中所有元素 ...
- 使用广播-BroadcastReceiver最详细解析
女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和 ...
- scrapy Data flow
The data flow in Scrapy is controlled by the execution engine, and goes like this:1. The Engine gets ...
- ubuntu root默认密码(初始密码)
ubuntu安装好后,root初始密码(默认密码)不知道,需要设置. 1.先用安装时候的用户登录进入系统 2.输入:sudo passwd 按回车 3.输入新密码,重复输入密码,最后提示passwd ...
- maven 下载镜像文件卡,下载pom文件慢的问题
问题原因: maven默认的镜像库URL为 http://maven.net.cn/content/groups/public/ 由于网络原因,可能导致响应速度超级慢,或者无法效应: 解决方法: 配置 ...