這個(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.