• Action处理请求参数


    第一种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )

    第一种方式:<br>
    <form action="${pageContext.request.contextPath}/MyAction1" method="post">
      username:<input type="text" name="username"><br>
      password:<input type="password" name="password"><br>
      <input type="submit"><hr>
    </form>
    public class MyAction1 extends ActionSupport{
        private String username;
        private String password;
        public void setUsername(String username) {
            this.username = username;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String execute() throws Exception {
            System.out.println(username+" "+password);
            return null;
        }
    }

      问题: Action封装数据,会不会有线程问题 ?
        struts2 Action 是多实例 ,为了在Action封装数据 (struts1 Action 是单例的 )

      缺点:需要单独定义javaBean,将action中属性copy到javaBean中。
      优点:简单。

    第二种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)

    第二种方式:<br>
    <form action="${pageContext.request.contextPath}/MyAction2" method="post">
           username:<input type="text" name="user.username"><br>
           password:<input type="password" name="user.password"><br>
           <input type="submit"><hr>
    </form>
    public class MyAction2 extends ActionSupport{
        private User user;
        public void setUser(User user) {
            this.user = user;
        }
        public User getUser() {//不写这个密码获取不到?不懂..希望知道的人留言告知,感谢
            return user;
        }
        public String execute() throws Exception {
            System.out.println(user.getUsername()+" "+user.getPassword());
            return null;
        }
    }

      问题: 谁来完成的参数封装
        <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

      优点:简单,解决了第一种封装的问题
      缺点:在页面上使用了ognl表达式,页面不通用了

    第三种 :使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) ----- 主流,最常用

     第三种方式:<br>
     <form action="${pageContext.request.contextPath}/MyAction3" method="post">
           username:<input type="text" name="username"><br>
           password:<input type="password" name="password"><br>
           <input type="submit"><hr>
     </form>
    public class MyAction3 extends ActionSupport implements ModelDriven<User>{
        private User user=new User();
        public String execute() throws Exception {
            System.out.println(user.getUsername()+" "+user.getPassword());
            return null;
        }
        @Override
        public User getModel() {
            return user;
        }
    }

      优点:解决了属性驱动存在的问题
      缺点:一次只能封装一个model对象.

      struts2 有很多围绕模型驱动的特性
        <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 为模型驱动提供了更多特性

      对比第二种、第三种 : 第三种只能在Action中指定一个model对象,第二种可以在Action中定义多个model对象

    <input type="text" name="user.username" /> 
    <input type="text" name="product.info" />
     1 public class StrutsFilter implements Filter {
     2 
     3     public void init(FilterConfig filterConfig) throws ServletException {}
     4     public void doFilter(ServletRequest req, ServletResponse resp,
     5             FilterChain chain) throws IOException, ServletException {
     6         // 1.强转
     7         HttpServletRequest request = (HttpServletRequest) req;
     8         HttpServletResponse response = (HttpServletResponse) resp;
     9         // 2.操作
    10         // 2.1 得到请求资源路径
    11         String uri = request.getRequestURI();
    12         String contextPath = request.getContextPath();
    13         String path = uri.substring(contextPath.length() + 1);
    14         // 2.2 使用path去struts.xml文件中查找某一个<action name=path>这个标签
    15         SAXReader reader = new SAXReader();
    16         try {
    17             // 得到struts.xml文件的document对象。
    18             Document document = reader.read(new File(this.getClass().getResource("/struts.xml").getPath()));
    19             Element actionElement = (Element) document
    20                     .selectSingleNode("//action[@name='" + path + "']"); // 查找<action
    21                                                                             // name='hello'>这样的标签
    22             if (actionElement != null) {
    23                 // 得到<action>标签上的class属性以及method属性
    24                 String className = actionElement.attributeValue("class"); // 得到了action类的名称
    25                 String methodName = actionElement.attributeValue("method");// 得到action类中的方法名称。
    26                 // 2.3通过反射,得到Class对象,得到Method对象
    27                 Class actionClass = Class.forName(className);
    28                 Method method = actionClass.getDeclaredMethod(methodName);
    29                 
    30             
    31                 
    32                 // 处理请求参数封装:
    33                 Object actionObj = actionClass.newInstance();
    34                 // 模型驱动
    35                 if (actionObj instanceof MyModelDriven) {
    36                     MyModelDriven mmd = (MyModelDriven) actionObj;
    37                     BeanUtils.populate(mmd.getModel(),request.getParameterMap());
    38                 } else {
    39                     // 属性驱动
    40                     BeanUtils.populate(actionObj, request.getParameterMap());//
    41                 }
    42                 // 2.4 让method执行.
    43                 String returnValue = (String) method.invoke(actionObj); // 是让action类中的方法执行,并获取方法的返回值。
    44 
    45                 
    46                 
    47                 
    48                 // 2.5
    49                 // 使用returnValue去action下查找其子元素result的name属性值,与returnValue做对比。
    50                 Element resultElement = actionElement.element("result");
    51                 String nameValue = resultElement.attributeValue("name");
    52                 if (returnValue.equals(nameValue)) {
    53                     // 2.6得到了要跳转的路径。
    54                     String skipPath = resultElement.getText();
    55                     request.getRequestDispatcher(skipPath).forward(request,response);
    56                     return;
    57                 }
    58             }
    59         } catch (Exception e) {
    60             e.printStackTrace();
    61         } 
    62         // 3.放行
    63         chain.doFilter(request, response);
    64     }
    65     public void destroy() {}
    66 }
    模拟Struts2属性驱动和模型驱动
    1 public interface MyModelDriven<T> {
    2     public T getModel();
    3 }
    MyModelDriven

    封装数据到Collection和Map
      1) 封装数据到Collection 对象

     第四种方式(list):<br>
     <form action="${pageContext.request.contextPath}/MyAction4" method="post">
           username:<input type="text" name="users[0].username"><br>
           password:<input type="password" name="users[0].password"><br>
           username:<input type="text" name="users[1].username"><br>
           password:<input type="password" name="users[1].password"><br>
           <input type="submit"><hr>
     </form>
    public class MyAction4 extends ActionSupport{
        private List<User>users;
        public List<User> getUsers() {
            return users;
        }
        public void setUsers(List<User> users) {
            this.users = users;
        }
        public String execute() throws Exception {
            System.out.println(users);
            return null;
        }
    }

      2) 封装数据到Map 对象

     第五种方式(map):<br>
     <form action="${pageContext.request.contextPath}/MyAction5" method="post">
          username:<input type="text" name="users['zs'].username"><br>
          password:<input type="password" name="users['zs'].password"><br>
          username:<input type="text" name="users['ls'].username"><br>
          password:<input type="password" name="users['ls'].password"><br>
          <input type="submit"><hr>
     </form>
    public class MyAction5 extends ActionSupport{
        private Map<String, User>users;
        public Map<String, User> getUsers() {
            return users;
        }
        public void setUsers(Map<String, User> users) {
            this.users = users;
        }
        public String execute() throws Exception {
            System.out.println(users);
            return null;
        }
    }
  • 相关阅读:
    C++字符串转数字,数字转字符串
    [转]基础知识整理
    POJ 3071 Football
    POJ 3744 Scout YYF I
    2013成都Regional:一块木板,几个气球
    HDOJ 4497 GCD and LCM
    POJ 1185 炮兵阵地
    POJ 2031 Building a Space Station
    HDOJ 4717 The Moving Points
    CSU 1328: 近似回文词
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6139451.html
Copyright © 2020-2023  润新知