struts中数据处理

数据处理方式

把数据保存到域中

方式1
    直接获取Servlet api
    核心类: ServletActionContext
//方式1: 直接拿到ServletApi, 执行操作
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
// 操作
request.setAttribute("request_data", "request_data1");
session.setAttribute("session_data", "session_data1");
application.setAttribute("application_data", "application_data1");
方式2 
    通过ActionContext获取不同(代表request、session、application)的map
// 【推荐:解耦的方式实现对数据的操作】
// Struts中对数据操作,方式2: 通过ActionContext类 
ActionContext ac = ActionContext.getContext();
// 得到Struts对HttpServletRequest对象进行了封装,封装为一个map
// 拿到表示request对象的map
Map<String,Object> request =  ac.getContextMap(); 
// 拿到表示session对象的map
Map<String, Object> session = ac.getSession();
// 拿到表示servletContext对象的map
Map<String, Object> application = ac.getApplication();
方式3 
    实现接口的方法: RequestAware/SessionAware/ApplicationAware
/**
 * 数据处理, 方式3: 实现接口的方法
 */
public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{

    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;

    // struts运行时候,会把代表request的map对象注入
    @Override
    public void setRequest(Map<String, Object> request) {
        this.request = request;
    }

    // 注入session
    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    // 注入application
    @Override
    public void setApplication(Map<String, Object> application) {
        this.application = application;
    }


    @Override
    public String execute() throws Exception {

        // 数据
        request.put("request_data", "request_data1_actionAware");
        session.put("session_data", "session_data1_actionAware");
        application.put("application_data", "application_data1_actionAware");
//      
        return SUCCESS;
    }

}

请求数据自动封装

方式1

jsp表单数据填充到action中的属性

register.jsp:

<body>
    <form action="${pageContext.request.contextPath }/user_register.action" method="post">
        用户名:<input type="text" name="name"><br/>
        密码:<input type="text" name="pwd"><br/>
        年龄:<input type="text" name="age"><br/>
        生日:<input type="text" name="birth"><br/>

        <input type="submit" value="注册">
    </form>
  </body>

UserAction:

/**
 * Struts核心业务: 请求数据自动封装以及类型转换
 */
public class UserAction {

    // 封装请求数据
    private String name;  // 必须给set / get可以不用给
    private String pwd;
    private int age;
    private Date birth;
    public void setName(String name) {
        this.name = name;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }

    // 处理注册请求
    public String register() {
        System.out.println(user.getName());
        System.out.println(user.getPwd());
        System.out.println(user.getAge());
        System.out.println(user.getBirth());
        return "success";
    }
}

方式2

jsp表单数据填充到action的对象中的属性

register.jsp:

<body>
    <form action="${pageContext.request.contextPath }/user_register.action" method="post">
        用户名:<input type="text" name="user.name"><br/>
        密码:<input type="text" name="user.pwd"><br/>
        年龄:<input type="text" name="user.age"><br/>
        生日:<input type="text" name="user.birth"><br/>

        <input type="submit" value="注册">
    </form>
  </body>

User、UserAction:

public class User {

    // 封装请求数据
    private String name;  // 必须给set / get可以不用给
    private String pwd;
    private int age;
    private Date birth;
    public void setName(String name) {
        this.name = name;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public String getName() {
        return name;
    }
    public String getPwd() {
        return pwd;
    }
    public int getAge() {
        return age;
    }
    public Date getBirth() {
        return birth;
    }

}
/**
 * Struts核心业务: 请求数据自动封装以及类型转换
 */
public class UserAction {

     // 对象类型,一定给get方法
    private User user; 
    public void setUser(User user) {
        this.user = user;
    }
    public User getUser() {
        return user;
    }

    // 处理注册请求
    public String register() {
        System.out.println(user.getName());
        System.out.println(user.getPwd());
        System.out.println(user.getAge());
        System.out.println(user.getBirth());
        return "success";
    }
}

类型转换

struts中jsp提交的数据,struts会自动转换为action中属性的类型;
对于基本数据类型以及日期类型会自动转换;
日期类型支持yyyy-MM-dd格式
如果是其他格式,需要自定义类型转换器:
    局部类型转换器
    全局类型转换器

struts转换器API
|-- TypeConverter                   转换器接口
    |-- DefaultTypeConverter        默认类型转换器类
        |-- StrutsTypeConverter     用户编写的转换器类,继承此类即可

局部类型转换器

转换器开发步骤

   1、自定义转换器继承StrutsTypeConverter
   2、重写convertFromString和convertToString方法
   3、注册转换器
         3.1 在Action所在包中建立一个properties文件
               命名规则: Action名-conversion.properties
               举   例: UserAction-conversion.properties
         3.2 在3.1文件中添加以下数据
               需要转换的字段名=自定义转换器类的权限定名
               user.birth=cn.itcast.d_type.MyConverter

总结: 转换器能否给其他Action用? 不能,以上的转换器注册时候是与Action的名字相
                               耦合的,因此只能在自己的Action中内部使用

全局类型转换器

   实现的接口和继承的类都是相同的,本质上就是配置的方式不同。

开发步骤

   1、自定义转换器继承StrutsTypeConverter
   2、重写convertFromString和convertToString方法
   3、注册转换器
         3.1 在项目src目录下建立以下固定文件 
                xwork-conversion.properties   
         3.2 在3.1文件中添加以下数据
                需要转换的类类型=转换器类的权限定名
                如:  java.util.Date= cn.itcast.converter.DateConverter

自定义的类型转换器类

/**
 * 自定义类型转换器类
 */
public class MyConverter extends StrutsTypeConverter {

    // 新需求: 要求项目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..

    // 先定义项目中支持的转换的格式
    DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyyMMdd"),
            new SimpleDateFormat("yyyy年MM月dd日") };

    /**
     * 把String转换为指定的类型 【String To Date】
     * 
     * @param context
     *            当前上下文环境
     * @param values
     *            jsp表单提交的字符串的值
     * @param toClass
     *            要转换为的目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {

        // 判断: 内容不能为空
        if (values == null || values.length == 0) {
            return null;
        }
        // 判断类型必须为Date
        if (Date.class != toClass) {
            return null;
        }

        // 迭代:转换失败继续下一个格式的转换; 转换成功就直接返回
        for (int i=0; i<df.length; i++) {
            try {
                return df[i].parse(values[0]);
            } catch (ParseException e) {
                continue;
            }
        }
        return null;
    }

    @Override
    public String convertToString(Map context, Object o) {
        return null;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值