zoukankan      html  css  js  c++  java
  • [转]webwork in action笔记4

        这个笔记做的不错.摘自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.
  • 相关阅读:
    选择排序
    插入排序
    洗牌算法
    访问性模式
    策略模式
    mysql EXPLAIN Join Types 手册解释 及数据实操
    Nginx Location和Rewrite总结
    json_decode 解析带BOM头文件错误
    laravel 集成 swagger插件
    php S3
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562443.html
Copyright © 2011-2022 走看看