这个笔记做的不错.摘自javaeye:
http://chineseoa.javaeye.com/blog/127282 作者chineseoa
---------------------------------------------------------------
第4章: 实现WebWork action
action是WebWork编程的核心部分,负责:
. 封装和传递数据;
. 逻辑处理
一. Action接口
要求action实现com.opensymphony.xwork.Action接口,该接口有一唯一方法需要实现:
String execute() throws Exception;
该接口内置很多静态属性,可作为execute()方法的返回值;
二. ActionSupport基类
该类包含了action能够提供的许多可选服务的默认实现(实现了很多可选的接口),让你更容易地开发自己的action类:
1. action验证:(com.opensymphony.xwork.Validateable接口)
该接口有一个唯一的方法,在该方法中可放入验证代码:
void validate()
该方法会被合适的intereceptor调用。调用过程如下:
. 执行validate()方法;
. 如校验action出错(有错误消息增加至action),返回INPUT,否则执行这个action;
示例:
@Override
public void validate() {
if(name==null||name.trim().length()<1) {
addFieldError("name","Invalid name, please input again!");
}
if(password==null||password.trim().length()<1) {
addFieldError("password","Invalid password, please input again!");
}
}
2. 显示错误信息:(com.opensymphony.xwork.ValidationAware接口)
收集错误信息并将这些信息显示给用户。错误信息能够依据class(action->actionErrors属性)级别
(放入一个Collection->fieldErrors属性)和字段级别(放入一个Map)进行收集。
一些常见方法:
void addActionError(String anErrorMessage)
Add an Action-level error message to this Action.
void addActionMessage(String aMessage)
Add an Action-level message to this Action.
void addFieldError(String fieldName, String errorMessage)
3. 获取用户的locale: (public interface LocaleProvider接口)
该接口中拥有唯一的一个方法:
Locale getLocale();
通过该方法获得客户端的语言和地区;
4. 显示本地化文本:(com.opensymphony.xwork.TextProvider接口)
该接口基本上由多个不同参数的getText()方法组成,getText()方法用于查找本地化信息文本。
默认情况下, 本地化信息存于和action同一个包下,同名的.properties结尾的文本。
示例:
cho4.LoginAction.java
---------------------------------------------------------------------------
@Override
public void validate() {
if(name==null||name.trim().length()<1) {
addFieldError("name",getText("invalid.name")); //通过getText获取本地化信息
}
if(password==null||password.trim().length()<1) {
addFieldError("password",getText("invalid.password"));
}
}
ch04/LoginAction.properties
---------------------------------------------------------------------------
invalid.name=Invalid name, please input again\!
invalid.password=Invalid password, please input again\!
三. 使用ModelDriven action
1. ???????????????????????/
四. 通过ActionContext访问数据
1. 获得HttpSession;
方法一:
Map session = ActionContext.getContext().getSession();
session.put("user",user);
方法二:(推荐使用)
public class Login extends ActionSupport implements SessionAware {
Map session;
public void setSession(Map session) {
this.session = session;
}
...
}
实现SessionAware接口,该接口告知WebWork在action执行之前需要设置session Map。
2. 访问request和response
方法一:
ActionContext ctx = ActionContext.getContext();
HttpServletRequest req = ctx.get(ServletActionContext.HTTP_REQUEST);
HttpSession sessio = req.getSession();
方法二:
HttpServletRequest req = ServletActionContext.getRequest();
HttpSession sessio = req.getSession();
方法三:(推荐使用)
public class Login extends ActionSupport implements ServletRequestAware {
HttpServletRequest req;
public void setServletRequest(HttpServletRequest req) {
this.req = req;
}
...
}
五. 处理文件上传
1. 使用request封装类访问上传文件
使用MultiPartRequestWrapper对象,该对象会从request的余下部分中把文件正确地解析出来。
a. JSP页面
b. action
public class FileUpload extends ActionSupport implements ServletRequestAware {
private HttpServletRequest req;
@Override
public String execute() {
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper)req;
File doc = null;
try {
//获得File对象
doc = wrapper.getFiles("doc")[0];
//获得内容类型
System.out.println("content type: "+ wrapper.getContentTypes("doc")[0]);
//获得初始文件名
System.out.println("name: "+wrapper.getFileSystemNames("doc")[0]);
}catch(Exception e) {
e.printStackTrace();
}finally {
doc.delete();
}
return SUCCESS;
}
public HttpServletRequest getReq() {
return req;
}
public void setServletRequest(HttpServletRequest req) {
this.req = req;
}
}
2. 自动文件上传
WebWork提供了一个interceptor: FileUploadInterceptor, 它封装了上传文件的获取和清理工作:
. 自动获得request对象;
. 自动获得request封装对象;
. 自动清除File对象;
FileUploadInterceptor在webwork-default.xml中自动设好。通过使用FileUploadInterceptor, 可以把
上传的文件(以及内容类型和文件名)看做是一般的表单参数。
html表单的input元素命名为doc, File字段也必须命名为doc,如多个文件则类型是 File[];
内容类型命名为[element]ContentType, 如多个文件则类型是 String[];
文件名命名为[element]FileName, 如多个文件则类型是 String[];
import java.io.File;
import com.opensymphony.xwork.ActionSupport;
public class FileUpload extends ActionSupport {
private File doc;
private String docContentType;
private String docFileName;
@Override
public String execute() {
System.out.println("doc: "+doc.getName());
System.out.println("docContentType: "+docContentType);
System.out.println("docFileName: "+docFileName);
return SUCCESS;
}
public void setDoc(File doc) {
this.doc = doc;
}
public void setDocContentType(String docContentType) {
this.docContentType = docContentType;
}
public void setDocFileName(String docFileName) {
this.docFileName = docFileName;
}
}
3. 配置设定
webwork.properties中有三个属性可以对上传文件的选项进行设定:
. webwork.multipart.parser: 定义底层的多部分 request 的解析器,可选值为 pell, cos和jakarta.
默认值为pell, 建议选用jakarta。
. webwork.multipart.saveDir: 上传文件WebWork临时保存目录。如没设定,则存于javax.servlet.context.tempdir
系统属性指定的目录中;
. webwork.multipart.maxSize: 上传文件的大小上限,以字节为单位。默认值为2097152.