[关闭]
@MrXiao 2017-12-21T14:06:25.000000Z 字数 4166 阅读 793

Struts2(4)——数据封装和类型转换

Struts2


数据封装

数据封装

静态参数封装

  1. 静态参数即在action中固定不变的参数,在struts.xml中配置action时赋值。

    1. <package name="login" namespace="/" extends="struts-default">
    2. <action name="loginTest" class="com.topvision.s2sm.login.action.LoginAction" method="loginTest">
    3. <param name="username">xiaoyue</param>
    4. <param name="password">123456</param>
    5. <result>/WEB-INF/jsp/login/login.jsp</result>
    6. </action>
    7. </package>
  2. 在action中创建对应属性,提供getter和setter方法。

    1. @Controller
    2. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    3. public class LoginAction extends BaseAction{
    4. private static final long serialVersionUID = -4442251270114214406L;
    5. private String username;
    6. private String password;
    7. public String loginTest() {
    8. System.out.println(username);
    9. System.out.println(password);
    10. return SUCCESS;
    11. }
    12. public String getUsername() {
    13. return username;
    14. }
    15. public void setUsername(String username) {
    16. this.username = username;
    17. }
    18. public String getPassword() {
    19. return password;
    20. }
    21. public void setPassword(String password) {
    22. this.password = password;
    23. }
    24. }

    输出结果

    1. xiaoyue
    2. 123456

静态参数封装依赖的是静态参数拦截器staticParams。
staticParams
该拦截器会将静态参数放入值栈中,而action就在值栈中的栈顶,自然就会找到该action中的对应属性,然后进行赋值了。想查看源码,参考该篇博文:struts2 18拦截器详解(十四) --- StaticParametersInterceptor

动态参数封装

属性驱动和模型驱动都非常重要,都需要掌握,如果还不会ognl表达式,那么可以在学完ognl表达后在回过头来看即可。

属性驱动

  1. 基本属性驱动

    表单:

    1. <form action="aaa/loginTest.tv" method="post">
    2. <input type="text" name="username">
    3. <button type="submit">提交</button>
    4. </form>

    action:提供对应属性及getter和setter方法

    1. private String username;
    2. public String getUsername() {
    3. return username;
    4. }
    5. public void setUsername(String username) {
    6. this.username = username;
    7. }

    依赖params拦截器注入数据
    params
    该拦截器做的事有两件,一是对提交的参数进行数据校验,判断是否合法,判断是否合法的标准就是拦截器中的excludeParams参数的正则表达式的值。二是将其封装到值栈中的栈顶元素中去,而当前action就在栈顶,所以能够将参数放入action中。通过查看struts2 18拦截器详解(十五) --- ParametersInterceptor来了解其源码 。

  2. ognl属性驱动

    表单,封装对象

    1. <form action="aaa/loginTest.tv" method="post">
    2. 姓名:<input type="text" name="user.username"><br>
    3. 年龄:<input type="text" name="user.age"><br>
    4. <button type="submit">提交</button>
    5. </form>

    创建JavaBean对象

    1. public class User implements Serializable {
    2. private static final long serialVersionUID = 4340332295972232437L;
    3. private String username;
    4. private int age;
    5. public String getUsername() {
    6. return username;
    7. }
    8. public void setUsername(String username) {
    9. this.username = username;
    10. }
    11. public int getAge() {
    12. return age;
    13. }
    14. public void setAge(int age) {
    15. this.age = age;
    16. }
    17. }

    Action接收:创建对象,提供getter和setter

    1. private User user = new User();
    2. public User getUser() {
    3. return user;
    4. }
    5. public void setUser(User user) {
    6. this.user = user;
    7. }

    在jsp页面中的user.username和user.age其实就是ognl表达式,代表着往根(root,值栈valueStack)中存放值,而值栈中的栈顶元素也就是为当前action,我们在action中设置user的get、set属性,即可以让存进来的值匹配到,进而将对应属性赋值成功。

模型驱动

实现ModelDriven接口,提供一个方法getModel(),编写对象实例。

jsp表单:

  1. <form action="aaa/loginTest.tv" method="post">
  2. 姓名:<input type="text" name="user.username"><br>
  3. 年龄:<input type="text" name="user.age"><br>
  4. <button type="submit">提交</button>
  5. </form>

Action类实现ModelDriven接口,提供getModel()方法

  1. private User user = new User();
  2. @Override
  3. public User getModel() {
  4. return null;
  5. }

分析:这有一个专门的拦截器,叫做modelDriven。
modelDriven
源码分析:struts2 18拦截器详解(十) --- ModelDrivenInterceptor
其实原理就是,该拦截器将getModel方法返回的结果压入值栈,而我们的表单参数会从值栈中从上往下进行查找,自然就直接将参数封装到User对象中了。

类型转换

从表单元素提交过来的都是String类型的,而我们在servlet中获取到表单元素后,得到的是Object类型,也就是需要我们自己手动转型,但是在struts2中,我们却不需要,是因为有这么一个机制,参数类型自动转型,获取过来的参数都是String类型的,但是如果我们需要int型,double型等,都会帮我们自己转换。

这里需要注意一点,在使用struts2中的日期自动转型时,表单中的日期字符串的格式是固定的,必须是2014-12-06,也就是yyyy-mm-dd这样的格式,其他格式的话,不能够转型成功,这对有些人来说,就有些不舒服,使用习惯不一样,但是没关系,struts2能够让我们自定义类型转换器,格式让我们自己来决定。

例如:表单输入2013-12-23,接收date为Tue Dec 23 00:00:00 CST 2014

自定义类型转换器(几乎用不到)

  1. 编写转换器类继承StrutsTypeConverter,实现两个抽象方法

    1. public class DateConverter extends StrutsTypeConverter{
    2. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    3. /*
    4. * context:struts2的数据中心
    5. * values:输入的数据
    6. * toClass:要转换成的类型
    7. */
    8. @Override
    9. public Object convertFromString(Map context, String[] values, Class toClass) {
    10. if (values != null && values.length > 0) {
    11. String value = values[0];
    12. if (toClass == Date.class) {
    13. try {
    14. return sdf.parse(value);
    15. } catch (ParseException e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. }
    20. return null;
    21. }
    22. @Override
    23. public String convertToString(Map context, Object o) {
    24. if (o != null && o.getClass() == Date.class) {
    25. return sdf.format(o);
    26. }
    27. return null;
    28. }
    29. }
  2. 注册类型转换器

    转换器位置说明

    2.1 注册局部转换器

    在需要转换的Action同级目录,创建一个properties.
    位置:action类同包
    名称:actionClass-conversion.properties
    actionClass:action类的类名
    conversion.properties:固定名

    文件内容:

    1. date = com.topvision.s2sm.plantform.converter.DateConverter

    2.2 注册全局转换

    在src下创建一个properties。
    位置:src
    名称:xwork-conversion.properties 固定写法
    文件内容:

    1. java.util.date = com.topvision.s2sm.plantform.converter.DateConverter
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注