struts中数据处理

来源:互联网 发布:js 工作流设计器 编辑:程序博客网 时间:2024/06/05 23:44

数据处理方式

把数据保存到域中

方式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对象的mapMap<String,Object> request =  ac.getContextMap(); // 拿到表示session对象的mapMap<String, Object> session = ac.getSession();// 拿到表示servletContext对象的mapMap<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 0