第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.
分享到:
相关推荐
webwork in action 第一部分:概貌 第二部分:核心内容 第三部分:内容的显示 第四部分:高级话题
- **实施WebWork动作**:第四章讲解了如何实现WebWork中的动作,包括动作的定义、参数传递、异常处理等内容。 - **使用拦截器增加功能**:第五章重点介绍了拦截器的作用及其配置方法,读者可以通过拦截器来增强动作...
webwork in action 第一部分:概貌 第二部分:核心内容 第三部分:内容的显示 第四部分:高级话题
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第四分卷,收点象征分 1分吧。找得挺费劲的。
### 第四部分:高级主题 #### 12. 类型转换 - **类型转换机制**:解释WebWork如何自动处理请求参数的类型转换。 - **自定义类型转换器**:演示如何实现自定义类型转换器,以适应更复杂的类型转换需求。 #### 13. ...
Spring是掠过Java大地的一阵... 中文版.part4.rar Spring in Action. 中文版.part5.rar Spring in Action. 中文版.part6.rar Spring in Action. 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring是掠过Java大地的一阵... 中文版.part4.rar Spring in Action. 中文版.part5.rar Spring in Action. 中文版.part6.rar Spring in Action. 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring是掠过Java大地的一阵... 中文版.part4.rar Spring in Action. 中文版.part5.rar Spring in Action. 中文版.part6.rar Spring in Action. 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring是掠过Java大地的一阵... 中文版.part4.rar Spring in Action. 中文版.part5.rar Spring in Action. 中文版.part6.rar Spring in Action. 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文版.part3.rar Spring in Action. 中文版.part4.rar Spring in Action. 中文版.part5.rar ...
第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动...
Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文版.part3.rar Spring in Action. 中文版.part4.rar Spring in Action. 中文版.part5.rar Spring in Action. 中文版....
本书最后4章描述了Spring是如何为Web层开发提供支持的,如果你是一位Web开发人员,你会发现本书的最后一部分特别有用。 编辑推荐 : Spring是掠过Java大地的一阵清风。Spring是以反向控制设计原理为基础,无需EJB而...
Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文版.part3.rar Spring in Action. 中文版.part4.rar Spring in Action. 中文版.part5.rar ...