這個(gè)筆記做的不錯(cuò).摘自javaeye:
http://chineseoa.javaeye.com/blog/127282 作者chineseoa
---------------------------------------------------------------
第4章: 實(shí)現(xiàn)WebWork action
action是WebWork編程的核心部分,負(fù)責(zé):
. 封裝和傳遞數(shù)據(jù);
. 邏輯處理
一. Action接口
要求action實(shí)現(xiàn)com.opensymphony.xwork.Action接口,該接口有一唯一方法需要實(shí)現(xiàn):
String execute() throws Exception;
該接口內(nèi)置很多靜態(tài)屬性,可作為execute()方法的返回值;
二. ActionSupport基類
該類包含了action能夠提供的許多可選服務(wù)的默認(rèn)實(shí)現(xiàn)(實(shí)現(xiàn)了很多可選的接口),讓你更容易地開發(fā)自己的action類:
1. action驗(yàn)證:(com.opensymphony.xwork.Validateable接口)
該接口有一個(gè)唯一的方法,在該方法中可放入驗(yàn)證代碼:
void validate()
該方法會(huì)被合適的intereceptor調(diào)用。調(diào)用過程如下:
. 執(zhí)行validate()方法;
. 如校驗(yàn)action出錯(cuò)(有錯(cuò)誤消息增加至action),返回INPUT,否則執(zhí)行這個(gè)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. 顯示錯(cuò)誤信息:(com.opensymphony.xwork.ValidationAware接口)
收集錯(cuò)誤信息并將這些信息顯示給用戶。錯(cuò)誤信息能夠依據(jù)class(action->actionErrors屬性)級別
(放入一個(gè)Collection->fieldErrors屬性)和字段級別(放入一個(gè)Map)進(jìn)行收集。
一些常見方法:
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接口)
該接口中擁有唯一的一個(gè)方法:
Locale getLocale();
通過該方法獲得客戶端的語言和地區(qū);
4. 顯示本地化文本:(com.opensymphony.xwork.TextProvider接口)
該接口基本上由多個(gè)不同參數(shù)的getText()方法組成,getText()方法用于查找本地化信息文本。
默認(rèn)情況下, 本地化信息存于和action同一個(gè)包下,同名的.properties結(jié)尾的文本。
示例:
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訪問數(shù)據(jù)
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;
}
...
}
實(shí)現(xiàn)SessionAware接口,該接口告知WebWork在action執(zhí)行之前需要設(shè)置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對象,該對象會(huì)從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];
//獲得內(nèi)容類型
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. 自動(dòng)文件上傳
WebWork提供了一個(gè)interceptor: FileUploadInterceptor, 它封裝了上傳文件的獲取和清理工作:
. 自動(dòng)獲得request對象;
. 自動(dòng)獲得request封裝對象;
. 自動(dòng)清除File對象;
FileUploadInterceptor在webwork-default.xml中自動(dòng)設(shè)好。通過使用FileUploadInterceptor, 可以把
上傳的文件(以及內(nèi)容類型和文件名)看做是一般的表單參數(shù)。
html表單的input元素命名為doc, File字段也必須命名為doc,如多個(gè)文件則類型是 File[];
內(nèi)容類型命名為[element]ContentType, 如多個(gè)文件則類型是 String[];
文件名命名為[element]FileName, 如多個(gè)文件則類型是 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. 配置設(shè)定
webwork.properties中有三個(gè)屬性可以對上傳文件的選項(xiàng)進(jìn)行設(shè)定:
. webwork.multipart.parser: 定義底層的多部分 request 的解析器,可選值為 pell, cos和jakarta.
默認(rèn)值為pell, 建議選用jakarta。
. webwork.multipart.saveDir: 上傳文件WebWork臨時(shí)保存目錄。如沒設(shè)定,則存于javax.servlet.context.tempdir
系統(tǒng)屬性指定的目錄中;
. webwork.multipart.maxSize: 上傳文件的大小上限,以字節(jié)為單位。默認(rèn)值為2097152.