这个笔记做的不错.摘自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.