Struts2 Day02

本节内容:

1.结果页面配置

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

3.Struts2提供获取表单数据的方式

4.Struts2获取数据封装到集合

5.扩展-表达式封装和模型驱动比较

一、结果页面配置

 1.全局结果页面

 在struts.xml中我们的package标签中有一个标签叫做<global-results>  全局结果集

    <package name="login" namespace="/" extends="struts-default" >
        <!--全局结果页面只能在一个package中有效 package中的所有的action都有作用-->
        <global-results>
            <result name="success">/index.jsp</result>
        </global-results>
        
        
    </package>

 

 

 2.局部结果页面

    <package name="login" namespace="/" extends="struts-default" >
        <!--全局结果页面只能在一个package中有效 package中的所有的action都有作用-->
        <global-results>
            <result name="success">/index.jsp</result>
        </global-results>
        
        <action name="userLogin" class="com.struts.action.HelloWordAction" >
            <!--局部结果页面配置:如果有全局结果页面,同时又局部结果页面,已局部结果页面为准-->
            <result name="success" >/index.jsp</result>
            
        </action>


    </package>

 

 

 3.result标签中的type属性

1.result标签中除了name属性还有一个属性type属性

type属性:如何到路径页面(转发还是重定向)

type属性值:

默认值:转发操作 值是:dispatcher  :转发到页面

redirect:重定向到一个页面
redirectAction:重定向到一个action
chain:用于转发到action:一般不用
stream:向浏览器发送InputStream对象通常用来处理文件下载

 

二、Action中获取表单提交数据

我们在servlet中知道我们获取表单的数据直接使用request对象调用方法来获取。在struts2中我们需要在action中获取,但是我们action中没有request对象

1.使用ActionContext类获取

 

    public String login(){
//        使用ActionContext获取表单数据
     ActionContext  actionContext = ActionContext.getContext ();

     HttpParameters httpParameters = actionContext.getParameters ();

     Parameter parameter = httpParameters.get ("username");

     String username =   parameter.getValue ();
     System.out.println (username);

        return "success";
    }

 

2.使用ServletActionContext获取

通过servletActionContext类调用方法可以获取request对象

  

//        使用ServletActionContext获取表单数据

          HttpServletRequest request =  ServletActionContext.getRequest ();

        String username =   request.getParameter ("username");
        System.out.println (username);

 

3.使用接口注入方式获取

在这里我们需要我们的action类来实现一个接口ServletRequestAware来实现方法:setServletRequest

public class LoginAction implements ServletRequestAware{

    private HttpServletRequest request;

    @Override
    public void setServletRequest(HttpServletRequest httpServletRequest) {
        request = httpServletRequest;
    }

    public String login(){
        String username =   request.getParameter ("username");
        System.out.println (username);
 }
}

这种方式不常用,大家只需要知道就可以了

 

在Action中操作域对象:request、session、application

在action中使用ServletActionContext来获取域对象:

//       获取域对象
     HttpServletRequest request =   ServletActionContext.getRequest ();
     request.setAttribute ("request","request");

     HttpSession httpSession = request.getSession ();

     httpSession.setAttribute ("httpSession","httpSession");

     ServletContext servletContext = ServletActionContext.getServletContext ();
      
     servletContext.setAttribute ("application","application");

 

三、Struts2提供获取表单数据方式

1.属性封装

直接把表单数据Action的属性中

实现步骤:

1.Action类中的成员变量位置定义变量

--变量名称与表单输入项的name属性值一样

生成变量的set与get方法

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="register" method="post">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="pwd"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="date" name="birthday"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>
package com.struts.action;

import java.util.Date;

/**
 * 使用属性封装获取表单数据
 */
public class RegisterAction {
//   属性名与表单中输入项的name值一样
  private String username;

  private String pwd;

  private int age;

  private Date birthday;
//  提供get与set方法

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String register(){

        System.out.println (username);
        System.out.println (pwd);
        System.out.println (age);
        System.out.println (birthday);

        return "success";
    }
}

使用属性封装只是获取数据到属性中,不能把数据直接封装到对象中。

2.模型驱动封装

可以直接把表单的数据封装到实体类中

实现步骤:

1.action实现一个接口ModelDriver

2.实现接口中的方法getModel方法

-把创建对象返回

3.在action类中创建实体类对象

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="registermodel" method="post">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="pwd"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="date" name="birthday"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>
package com.struts.action;

import com.opensymphony.xwork2.ModelDriven;

/**
 * 模型驱动封装
 */

public class RegisterModelAction implements ModelDriven<User>{
  //创建对象
    //使用模型封装的前提条件:表单输入项name的属性值和实体类中的属性名称一样
  private  User user = new User ();


    public String register(){

        System.out.println (user);

        return "success";
    }

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

实体类

package com.struts.action;

import java.util.Date;

public class User {

    private String username;

    private String pwd;

    private int age;

    private Date birthday;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", pwd='" + pwd + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}
View Code

使用模型驱动和属性封装注意问题:

在一个action中获取表单数据可以使用属性封装、也可以使用模型驱动封装,不能同时使用属性封装和模型驱动封装来获取同一个表单数据,如果同时使用只会执行模型驱动不会执行属性封装。

表达式封装(会用即可)

1.实现过程

  1.使用表达式封装可以把表单数据封装到实体类对象中

步骤:1.在action中声名实体类

          2.生成实体类的set与get

          3.在表单的输入项中name的值写成表达式形式

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="registermodel" method="post">
    用户名:<input type="text" name="user.username"/><br/>
    密码:<input type="password" name="user.pwd"/><br/>
    年龄:<input type="text" name="user.age"/><br/>
    出生日期:<input type="date" name="user.birthday"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>
package com.struts.action;

public class UserRegisterAction {
//    声名实体类
    private User user;
//    生成实体类变量的get与set方法

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }


    public  String register(){

        return "success";
    }
}

四、扩展-表达式封装和模型驱动比较

     1.使用表达式封装和模型驱动封装都可以吧数据封装到实体类对象中

     2.使用模型驱动只能吧数据封装到一个实体类中  在一个action中不能使用模型驱动把数据封装到不同的实体类对象中

     3.  使用表达式封装就可以吧数据封装到不同的实体类对象中

   

五、Struts2中获取数据封装到集合中(会用)

1.封装到List集合

步骤:1.在action中声明list

2.生成list变量的set与get方法

3.在表单输入项中使用表达式写法

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="registermodel" method="post">
    <%--list[0]表示list集合中第一个user对象--%>
    用户名:<input type="text" name="list[0].username"/><br/>
    密码:<input type="password" name="list[0].pwd"/><br/>
    年龄:<input type="text" name="list[0].age"/><br/>
    出生日期:<input type="date" name="list[0].birthday"/><br/>
    用户名:<input type="text" name="list[1].username"/><br/>
    密码:<input type="password" name="list[1].pwd"/><br/>
    年龄:<input type="text" name="list[1].age"/><br/>
    出生日期:<input type="date" name="list[1].birthday"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>
package com.struts.action;

import java.util.List;

//封装数据到list集合

public class RegisterListAction {

    //声明list集合
    private List<User> list;
    
//    提供get与set方法

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public String register(){
        return "success";
    }





}

 

2.封装到Map集合

实现步骤:

1.声明map集合

2.生成get与set方法

3,。在表单中的name属性写表达式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="registermodel" method="post">
    
    用户名:<input type="text" name="map['one'].username"/><br/>
    密码:<input type="password" name="map['one'].pwd"/><br/>
    年龄:<input type="text" name="map['one'].age"/><br/>
    出生日期:<input type="date" name="map['one'].birthday"/><br/>
    用户名:<input type="text" name="map['tow'].username"/><br/>
    密码:<input type="password" name="map['tow'].pwd"/><br/>
    年龄:<input type="text" name="map['tow'].age"/><br/>
    出生日期:<input type="date" name="map['tow'].birthday"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>
package com.struts.action;

import java.util.Map;

/**
 * Map集合封装
 */
public class MapAction {
     //声明map集合
    private Map<String,User> map;
    //生成get与set方法
    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    public String register(){

        return "success";
    }
}

 

posted @ 2018-11-07 17:04  龙之殇--疯狂者  阅读(217)  评论(0编辑  收藏  举报