美文网首页
Struts2_day02

Struts2_day02

作者: 暖熊熊 | 来源:发表于2017-10-28 12:31 被阅读0次

    Struts2_day02

    Struts2课程安排

    第一天 struts2 入门 2017年10月27日

    第二天 struts2 数据 2017年10月28日

    第三天 struts2 值栈 2017年10月29日

    第四天 struts2拦截器 2017年10月30日

    1.结果页面配置

    1.1全局结果页面

    1. result标签配置action方法的返回值到不同的路径里面

    2. 创建两个action,执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个页面里面

      public class BookAction extends ActionSupport {
       public String execute() throws Exception {
           return "success";
       }
      }
      public class OrdersAction extends ActionSupport {
       public String execute() throws Exception {
           return "success";
       }
      }
      

      (1)如果多个action,方法里面返回值相同的,到页面也是相同的,这个时候可以使用全局结果页面配置

      (2)在package标签里面配置

      <package name="action1" extends="struts-default" namespace="/">
       <action name="book" class="com.ghw.action.BookAction">
           <result name="success" type="redirect">/hello.jsp</result>
       </action>
       <action name="order" class="com.ghw.action.OrdersAction">
           <result name="success">/hello.jsp</result>
       </action>
      </package>
      

    1.2局部结果页面

    <package name="action1" extends="struts-default" namespace="/">
        <global-results>
            <result name="success">/hello.jsp</result>
        </global-results>
        <action name="book" class="com.ghw.action.BookAction">
            <result name="success">/world.jsp</result>
        </action>
        <action name="order" class="com.ghw.action.OrdersAction"></action>
    </package>
    
    • 配置全局页面,也配置了局部页面,最终以局部配置为准,比如上面配置,执行book.action会跳转到world.jsp页面

    1.3result标签type属性

    • 默认值dispatcher做转发,转发地址不变,内容变
    • redirect做重定向,重定向地址和内容都变
    • 上面两个值dispatcher、redirect,这两个值一般针对到页面中配置
    • 配置到其他的action里面
    • chain:转发到action
    • redirectAction:重定向到action
    <action name="book" class="com.ghw.action.BookAction">
        <result name="success" type="redirectAction">order</result>
    </action>
    
    <action name="book" class="com.ghw.action.BookAction">
        <result name="success" type="chain">order</result>
    </action>
    

    2.在action获取表单提交数据

    1. 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap
    2. 提交表单到action,但是action没有request对象,不能直接使用request对象

    2.1使用ActionContext类获取


    (1)因为方法不是静态的方法,需要创建ActionContext类的对象
    (2)这个ActionContext类对象不是new出来的,


    1. 具体演示
      (1)创建表单,提交表单到action里面
    <form action="${pageContext.request.contextPath }/form4.action" method="post">
      username:<input type="text" name="username"/>
      <br/>
      password:<input type="text" name="password"/>
      <br/>
      address:<input type="text" name="address"/>
      <br/>
      <input type="submit" value="submit"/>
    </form>
    

    (2)在action使用ActionContext获取数据

    public class FormAction extends ActionSupport {
      public String execute() throws Exception {
          ActionContext context = ActionContext.getContext();
          Map<String, Object> map = context.getParameters();
          Set<String> keys = map.keySet();
          for (String key : keys) {
              Object[] obj = (Object[]) map.get(key);
              System.out.println(Arrays.toString(obj));
          }
          return "success";
      }
    }
    

    2.2使用ServletActionContext类获取

    public class FormAction extends ActionSupport {
        public String execute() throws Exception {
            // 1.使用Servlet类获取request对象
            HttpServletRequest httpServletRequest = ServletActionContext.getRequest();
            // 2.使用request里面的方法得到结果
            String username = httpServletRequest.getParameter("username");
            String password = httpServletRequest.getParameter("password");
            String address = httpServletRequest.getParameter("address");
            System.out.println("username:" + username + " password:" + password + " address" + address);
            return "success";
        }
    }
    

    2.3使用接口注入方式获取(了解)

    让action实现ServletRequestAware接口,得到request对象

    package com.ghw.action;
    
    import javax.servlet.http.HttpServletRequest;
    import org.apache.struts2.interceptor.ServletRequestAware;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class FormAction extends ActionSupport implements ServletRequestAware {
    
        private HttpServletRequest request;
    
        public HttpServletRequest getRequest() {
            return request;
        }
    
        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
        }
    
        public String execute() throws Exception {
            // 1.使用Servlet类获取request对象
            // 2.使用request里面的方法得到结果
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String address = request.getParameter("address");
            System.out.println("username:" + username + " password:" + password + " address" + address);
            return "success";
        }
    }
    

    2.4在action操作域对象

    1. request、session、servletContext域对象
    2. 使用ServletActionContext类操作

    3.获取表单数据方式

    3.1原始方式(了解)

    原始方式获取表单封装到实体类对象,2.1-2.3方法中只是把表单内容获取

    public String execute() throws Exception {
        // 1.获取表单数据
        HttpServletRequest request = ServletActionContext.getRequest();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String address = request.getParameter("address");
        // 2.封装到实体类中
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setAddress(address);
        System.out.println(
                "username:" + user.getUsername() + " password:" + user.getPassword() + " address:" + user.getAddress());
        return "success";
    }
    

    3.2属性封装(会用)

    直接把表单内容封装到action的属性里面,只能封装到类属性里面,不能封装到对象里面

    实现步骤:

    1. 在action中定义成员变量,变量名称和表单输入项name属性值一样
    2. 生成变量的get和set方法
    package com.ghw.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class FormAction extends ActionSupport {
        // 1.定义与表单name相同的变量名
        private String username;
        private String password;
        private String address;
        
        // 2.生成setter和getter方法
        public String getUsername() {
            return username;
        }
    
    
        public void setUsername(String username) {
            this.username = username;
        }
    
    
        public String getPassword() {
            return password;
        }
    
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    
        public String getAddress() {
            return address;
        }
    
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String execute() throws Exception {
            System.out.println("username:" + username + " password:" + password + " address" + address);
            return "success";
        }
    }
    

    3.3模型驱动封装(重点)

    1. 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面
    2. 要求:实体类里面的成员属性名和表单name名一样
    3. 实现步骤:

    (1)action实现接口ModelDriven

    public class FormAction extends ActionSupport implements ModelDriven<User>

    泛型要写封装数据的类的类型

    (2)实现接口里面的方法 getModel方法把创建对象返回

    // 返回创建的user对象
    public User getModel() {
      return user;
    }
    

    (3)在action里面创建实体类对象

    // 创建对象
    private User user = new User();
    
    1. 使用模型驱动和属性封装注意问题:
    • 在一个action中,获取表单数据可以属性封装,也可以使用模型驱动封装,但不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用,只会执行模型驱动

    3.4表达式封装(会用)

    1. 实现过程

    (1)使用表达式封装可以把表单数据封装到实体类对象里面

    (2)把表达式封装归类到属性封装里面

    第一步 在action里面声明实体类

    // 1.声明实体类
    private User user;
    

    第二步 生成实体类变量的set和get方法

    // 2.生成实体类的setter和getter方法
    public User getUser() {
        return user;
    }
    
    public void setUser(User user) {
        this.user = user;
    }
    

    第三步 在表单输入项的name属性值里面写表达式形式

    <form action="${pageContext.request.contextPath }/form4.action" method="post">
        <!-- 3.在表单输入项的name属性值里面写表达式形式 -->
        username:<input type="text" name="user.username"/>
        <br/>
        password:<input type="text" name="user.password"/>
        <br/>
        address:<input type="text" name="user.address"/>
        <br/>
        <input type="submit" value="submit"/>
    </form>
    

    3.5表达式封装和模型驱动封装比较

    • 相同点:

      可以把数据封装到实体类对象里面

    • 不同点:

      表达式封装可以封装到不同的实体类里面

      使用模型驱动只能把数据封装到一个实体类对象里面

      private User user;
      private Book book;
      public User getUser() {
        return user;
      }
      public Book getBook() {
        return book;
      }
      public void setBook(Book book) {
        this.book = book;
      }
      public void setUser(User user) {
        this.user = user;
      }
      
      username:<input type="text" name="user.username"/>
      <br/>
      password:<input type="text" name="book.password"/>
      <br/>
      address:<input type="text" name="user.address"/>
      <br/>
      

    4.数据封装到集合中(会用)

    4.1封装到list集合

    第一步 在action声明List

    第二步 生成list变量的set和get方法

    // 1.声明list变量
    private List<User> list;
    
    // 2.生成list的set,get方法
    public List<User> getList() {
        return list;
    }
    
    public void setList(List<User> list) {
        this.list = list;
    }
    

    第三步 在表单输入项里面写表达式

    <!-- 3.在表单输入项的name属性值里面写表达式形式 -->
    username:<input type="text" name="list[0].username"/>
    <br/>
    password:<input type="text" name="list[0].password"/>
    <br/>
    address:<input type="text" name="list[0].address"/>
    <br/>
    
    username:<input type="text" name="list[1].username"/>
    <br/>
    password:<input type="text" name="list[1].password"/>
    <br/>
    address:<input type="text" name="list[1].address"/>
    <br/>
    

    4.2封装到map集合

    第一步 在action声明Map

    // 1.声明map变量
    private Map<String, User> map;
    

    第二步 生成map变量的set和get方法

    // 2.生成map的set,get方法
    public Map<String, User> getMap() {
        return map;
    }
    
    public void setMap(Map<String, User> map) {
        this.map = map;
    }
    

    第三步 在表单输入项里面写表达式

    <!-- 3.在表单输入项的name属性值里面写表达式形式 -->
    username:<input type="text" name="map['one'].username"/>
    <br/>
    password:<input type="text" name="map['one'].password"/>
    <br/>
    address:<input type="text" name="map['one'].address"/>
    <br/>
    
    username:<input type="text" name="map['two'].username"/>
    <br/>
    password:<input type="text" name="map['two'].password"/>
    <br/>
    address:<input type="text" name="map['two'].address"/>
    <br/>
    <input type="submit" value="submit"/>
    

    5.案例-添加客户功能

    相关文章

      网友评论

          本文标题:Struts2_day02

          本文链接:https://www.haomeiwen.com/subject/ijojpxtx.html