Struts2数据操作

 

结果页面配置,局部优先于全局

如果有多个action, 它们的返回值相同、配置的页面也相同,可以使用全局参数

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <package name="dp" extends="struts-default" namespace="/ehome">
        <!--<global-allowed-methods>regex:.*</global-allowed-methods>-->
        <global-results>
            <!--全局结果配置-->
            <result name="success">/hello.jsp
            </result>
        </global-results>
        <action name="demo1" class="com.bj169.action.Demo1Action" method="execute">
            <!--局部结果配置-->
            <!--局部结果配置优先全局结果配置-->
            <result name="success">/hello.jsp</result>
        </action>
        <action name="demo2" class="com.bj169.action.Demo2Action">
        </action>
        <action name="register" class="com.bj169.action.Register">
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>

在action中获取表单提交数据

1.使用ActionContext获取(非重点),使用这种方法要熟练对集合的遍历

        //通过ActionContext获取表单提交的数据
        //通过静态方法获取上下文对象
        ActionContext context = ActionContext.getContext();
        HttpParameters parameters = context.getParameters();
        // 通过getParameters获取参数map集合
        Set<Map.Entry<String, Parameter>> entries = parameters.entrySet();
        Iterator<Map.Entry<String, Parameter>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Parameter> next = iterator.next();
            System.out.println("key" + next.getKey());
            Parameter value = next.getValue();
            for (String s : value.getMultipleValues()) {
                System.out.println("value:" + s);
            }
        }

2.使用ServletActionContext获取数据

 核心: 通过一系列静态方法,包括获取request对象,通过request对象调用getParameter()方法

        //获得request对象
        HttpServletRequest request = ServletActionContext.getRequest();
        //获得session对象
        HttpSession session = request.getSession();
        //获得servletContext对象
        ServletContext servletContext = ServletActionContext.getServletContext();
        request.setAttribute("value", "request");
        session.setAttribute("value", "session");
        servletContext.setAttribute("value", "servletContext");

3.使用接口注入的方式

核心: 实现ServletRequestAware接口

重写setServletRequest方法,一旦被调用,就可以获取request对象

把该对象赋值给Action自己定义的request对象(传递引用) 

在action中操作域对象

request、session、servletContext 三种作用域的传值

核心:使用ServletActionContext

       //获得request对象
        HttpServletRequest request = ServletActionContext.getRequest();
        //获得session对象
        HttpSession session = request.getSession();
        //获得servletContext对象
        ServletContext servletContext = ServletActionContext.getServletContext();
        request.setAttribute("value", "request");
        session.setAttribute("value", "session");
        servletContext.setAttribute("value", "servletContext");
        return SUCCESS;

  在jsp中通过域对象获取数据

<body>
request${requestScope.value}<br>
session${sessionScope.value}<br>
servletContext${applicationScope.value}
</body>

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

1.使用request分别获取属性,并调用bean方法(原始)。

2. 属性封装,在action中声明表单项对应的字段,并指定bean方法。就是set()方法

但它仅仅能把值封装到属性中,并不能封装到实体对象中。

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

核心:action实现ModelDriven接口,并重写getModel方法

在action中声明实体类对象并实例化

在getModel方法中返回该实体对象,完成

package com.bj169.action;

import com.bj169.entity.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import java.util.Arrays;


/**
 * @ClassName Register
 * @Description TODO
 * @Author Administrator
 * @Date 2018/11/29 0029 10:58
 * @Version 1.0
 **/
public class Register1 extends ActionSupport implements ModelDriven<User> {
    public String execute() {
        System.out.println(user.getUser());
        System.out.println(user.getPassword());
        System.out.println(Arrays.toString(user.getHobit()));
        return NONE;
    }

    private User user = new User();

    @Override
    public User getModel() {
        return user;
    }
}

 4.表达式封装:非重点

核心:

      把表单数据封装到实体类对象中,只需创建对象不需实例化,

      为该对象声明get和set方法  

      在表单输入项中写表达式: user.username

表达式封装和模型驱动封装对比:都可以把数据封装到实体类对象中去,但是模型驱动封装只能封装到一个实体类对象中,而表达式封装可以封装到多个不同的对象中

表单数据封装到List/Map中

package com.bj169.action;

import com.bj169.entity.Good;
import com.bj169.entity.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import java.util.Arrays;
import java.util.List;
import java.util.Map;


/**
 * @ClassName Register
 * @Description TODO
 * @Author Administrator
 * @Date 2018/11/29 0029 10:58
 * @Version 1.0
 **/
public class Register2 extends ActionSupport {
    private List<User> users;
    private Map<String, Good> map;

    public Map<String, Good> getMap() {
        return map;
    }

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

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    private User user;
    private Good good;

    public Good getGood() {
        return good;
    }

    public void setGood(Good good) {
        this.good = good;
    }

    public User getUser() {
        return user;
    }

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

    public String execute() {
        System.out.println(users.get(0).getUser());
        System.out.println(users.get(0).getPassword());
        System.out.println(Arrays.toString(users.get(0).getHobit()));
        System.out.println(map.get("one").getName());
        return NONE;
    }


}
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/11/29 0029
  Time: 10:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" action="/ehome/register2.action">
    用户名:<input type="text" name="users[0].user"/><br>
    密码:<input type="password" name="users[0].password"/><br>
    爱好:<input type="checkbox" name="users[0].hobit" value="java"/>java
    <input type="checkbox" name="users[0].hobit" value="c++"/>c++
    <input type="checkbox" name="users[0].hobit" value="c#"/>c#<br>
    商品名称<input type="text" name="map['one'].name"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值