struts2学习之第二天

结果页面配置

一、全局结果页面

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

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

         (1)如果多个action,且方法里面返回值和跳转页面都是相同的,可以使用全局结果页面配置

         (2)在package标签中配置

<global-results>
  <result name="success">/index.jsp</result>
</global-results>

二、局部结果页面

1.action标签内部的result标签为局部

2.同时有全局、局部时,局部生效

<action name="book" class="com.bpf.action.BookAction">
  <result name="success" type="redirectAction">orders</result>
</action>

三、result标签中的type属性

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

         (1)type:如何到路径里(转发还是重定向)

2.type属性值

         (1)默认值,做转发操作 值是dispatcher 地址栏地址 不变

         (2)重定向: redirect地址栏地址改变

3.以上两个type属性值一般用于到页面。也可以到别的action

         (1)chain:转发到action 有缓存问题,一般不用

         (2)redirectAction:重定向到action

        

action获取表单

action获取request对象

一、在JSP/Servlet阶段,提交表单到servlet中,使用request对象的方法获取表单信息

二、现在提交表单到action中,不能直接使用request对象

三、action中获取request对象主要有三种方式

         (1)使用ActionContext类(直接获取数据)

         (2)使用ServletActionContext类

         (3)使用接口注入的方式

        

使用ActionContext类(直接获取数据)

Map<String,Object> getParameters()方法

(1)使用该方法需要创建ActionContext对象

(2)通过静态方法 getContext()来创建

过程:

(1)创建表单,提交到action

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

 

//1.获取ActionContext对象  
ActionContext context = ActionContext.getContext();
//2.调用方法得到表单数据
//map中的key是表单里的name值,  value是输入的值
Map<String,Object> map = context.getParameters(); 
//获得所有key
Set<String> keys = map.keySet();
for (String key : keys) {
    //遍历每个key的value 数组形式 因为可能存在复选框
    Object[] obj = (Object[]) map.get(key);
}

使用ServletActionContext类

有四种主要的静态方法: getRequest、getResponse、getServletContext、getPageContext

(1)调用类中的静态方法得到request对象

(2)和以前学的一样 用request对象的各种方法

 

//1.获取request
HttpServletRequest request = ServletActionContext.getRequest();
//2.调用request里面的方法
String username = request.getParameter("username");
String password = request.getParameter("password");

使用接口注入的方式(了解)

(1)让action实现接口 为了得到request对象

 

public class Form3DemoAction extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    @Override
    public String execute() throws Exception {
        //第三种方式 使用接口注入类
		return NONE;
    }
    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        // TODO Auto-generated method stub
        this.request = arg0;
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+" "+password);
    }

}

在action操作域对象

(1)servlet中的域对象:request sessionservletContext

(2)使用ServletActionContext类进行操作

 

//操作三个域对象
//1.request域
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqValue");
//2.session域
HttpSession session = request.getSession();
session.setAttribute("sess", "sessValue");
//3.servletContext域
ServletContext context = ServletActionContext.getServletContext();
context.setAttribute("cont", "contValue");


原始方式可以获取表单信息封装到实体类对象,但是代码比较繁多

 

struts2中提供了两种获取表单的方式

1.属性封装(会用)

         a.直接把表单提交数据封装到action的属性中

         b.步骤:(1)在action设置一些成员变量,这些变量名称与表单输入项的name属性值相同

                      (2)生成set get方法

    // 定义变量 变量名称和表单输入项name属性值一致
    private String username;
    private String password;
    // 生成get和set方法

    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;
    }

         c.使用属性封装能够获取表单数据到属性中,但是无法直接封装到实体类里所以提供了模型驱动方式

2.模型驱动封装(重点)

         a.使用模型驱动可以直接把表单数据封装到实体类里

         b.步骤:(1)action实现接口ModelDriven

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

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

public class DataDemo2Action extends ActionSupport implements ModelDriven<User> {

    // 创建实体类对象
    // 要求表单输入项name属性值和实体类内的成员变量名称一样
    private User user = new User();

    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println(user);
        return NONE;
    }
}

         c.使用模型驱动和属性封装的时候注意问题:

           在一个action中,获取表单数据可以属性封装,也可以模型驱动封装,但不可以同时使用这两种方式获取同一个表单的数据,

           如果同时使用,只会执行模型驱动

                     

3.表达式封装(可以归类到属性封装中 会用)

         a.使用表达式封装可以吧表单数据封装到实体类中去

         b.步骤:(1)在action里声明实体类

                       (2)生成实体类的get set方法

                       (3)在表单输入项的name属性值里面写表达式

      

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

    // 2.声明实体类的set get方法
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
<input type="text" name="user.username">
<input type="text" name="user.password">                 

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

1.相同点:

         都可以把数据封装到实体类中

2.不同点:

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

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

        

struts2获取数据封装到集合中(会用)

1.封装数据到list

步骤:a.在action中声明一个List

           b.生成list对象的set get方法

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

    // 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;
    }
<input type="text" name="list[0].username">
<input type="text" name="list[0].password">

2.封装数据到map

步骤:a.声明一个Map集合

           b.生成get set方法

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

 

    // 1.声明一个Map集合
    private Map<String, User> map;

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

    public void setMap(Map<String, User> map) {
        this.map = map;
    }
<input type="text" name="map['one'].username">
<input type="text" name="map['one'].password">

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值