是否应该用ModelDriven?

本文通过一个具体的示例,探讨了WebWork框架中ModelDriven特性的工作原理及其应用场景,并对比了一般方式与ModelDriven的区别。

初学WW,很好奇,不过也觉得有些地方不是很明白,比如ModelDriven。

下面一个例子:

input.jsp

html 代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="ww" uri="/webwork" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Input User Profile</title>  
  8. <style>  
  9.     body,td {   
  10.         font-size: 12px;   
  11.         font-family: simsun;   
  12.     }   
  13. </style>  
  14. </head>  
  15. <body>  
  16. <ww:form method="post" action="showUser.action">  
  17.     <ww:textfield name="user.name" label="名字" />  
  18.     <ww:textfield name="user.sex" label="性别" />  
  19.     <ww:textfield name="user.age" label="年龄" />  
  20.     <ww:submit value="提交" />  
  21. </ww:form>  
  22. </body>  
  23. </html>  

User.java

java 代码
  1. package ch04;   
  2.   
  3. public class User {   
  4.     private String name;   
  5.     private String sex;   
  6.     private int age;   
  7.        
  8.     public void setName(String name) {   
  9.         this.name = name;   
  10.     }   
  11.        
  12.     public String getName() {   
  13.         return name;   
  14.     }   
  15.        
  16.     public void setSex(String sex) {   
  17.         this.sex = sex;   
  18.     }   
  19.        
  20.     public String getSex() {   
  21.         return sex;   
  22.     }   
  23.        
  24.     public void setAge(int age) {   
  25.         this.age = age;   
  26.     }   
  27.        
  28.     public int getAge() {   
  29.         return age;   
  30.     }   
  31. }  

ShowUserAction.java

java 代码
  1. package ch04;   
  2.   
  3. import com.opensymphony.xwork.ActionSupport;   
  4. import ch04.User;   
  5.   
  6. public class ShowUserAction extends ActionSupport {   
  7.     private static final long serialVersionUID = -6765769688518023696L;   
  8.        
  9.     private User user;   
  10.        
  11.     public void setUser(User user) {   
  12.         this.user = user;   
  13.     }   
  14.        
  15.     public User getUser() {   
  16.         return user;   
  17.     }   
  18.        
  19.     public void validate() {   
  20.         if (user.getName() == null || "".equals(user.getName())) {   
  21.             addFieldError("user.name""用户名不能为空!!");   
  22.         }   
  23.         if (user.getSex() == null || "".equals(user.getSex()) || (!user.getSex().equals("man") && !user.getSex().equals("woman")) ){   
  24.             addFieldError("user.sex""性别填写不正确!");   
  25.         }   
  26.         if (user.getAge() <= 0) {   
  27.             addFieldError("user.age""年龄填写不正确!");   
  28.         }   
  29.     }   
  30.        
  31.     public String execute() {   
  32.         return SUCCESS;   
  33.     }   
  34.   
  35. }   

用上面的方式完全不用ModelDriven,而且可以同时填写多个model,由execute调用。

再说,modelDriven方式不赞成在execute时修改model的引用,修改了也没用-_-,总觉得这样是多余的。

个人认为modelDriven是在用于表单所有字段都是一个域中的字段那种方式,别的,一般方式(即上面的方式)就已经足够了,而且足够灵活。

在使用 ModelDriven 机制处理复杂对象封装时,可采用以下方法: #### 合理设计对象结构 将复杂对象拆分成多个子对象,每个子对象负责特定的数据和功能。例如,一个 `User` 对象可能包含 `Address`、`ContactInfo` 等子对象: ```java class Address { private String street; private String city; private String zipCode; // 省略 getter 和 setter 方法 } class ContactInfo { private String email; private String phone; // 省略 getter 和 setter 方法 } class User { private String name; private Address address; private ContactInfo contactInfo; // 省略 getter 和 setter 方法 } ``` 在 `Action` 中使用 `ModelDriven` 机制: ```java import com.opensymphony.xwork2.ModelDriven; public class UserAction implements ModelDriven<User> { private User user = new User(); @Override public User getModel() { return user; } public String execute() { // 处理业务逻辑 return "success"; } } ``` #### 利用嵌套属性进行数据绑定 在 JSP 页面中,通过嵌套属性的方式将数据绑定到复杂对象的子对象上。例如: ```jsp <form action="userAction" method="post"> <input type="text" name="name" placeholder="Name"> <input type="text" name="address.street" placeholder="Street"> <input type="text" name="address.city" placeholder="City"> <input type="text" name="address.zipCode" placeholder="Zip Code"> <input type="text" name="contactInfo.email" placeholder="Email"> <input type="text" name="contactInfo.phone" placeholder="Phone"> <input type="submit" value="Submit"> </form> ``` #### 处理集合和数组 如果复杂对象包含集合或数组,可使用索引或键来绑定数据。例如,`User` 对象包含一个 `List<Hobby>`: ```java import java.util.ArrayList; import java.util.List; class Hobby { private String name; // 省略 getter 和 setter 方法 } class User { private List<Hobby> hobbies = new ArrayList<>(); // 省略 getter 和 setter 方法 } ``` 在 JSP 页面中: ```jsp <form action="userAction" method="post"> <input type="text" name="hobbies[0].name" placeholder="Hobby 1"> <input type="text" name="hobbies[1].name" placeholder="Hobby 2"> <input type="submit" value="Submit"> </form> ``` #### 自定义类型转换器 对于一些特殊类型或复杂类型,可使用自定义类型转换器进行数据转换。例如,将字符串转换为日期类型: ```java import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; public class DateConverter extends DefaultTypeConverter { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); @Override public Object convertValue(Map<String, Object> context, Object value, Class toType) { if (toType == Date.class) { String[] strings = (String[]) value; try { return DATE_FORMAT.parse(strings[0]); } catch (ParseException e) { e.printStackTrace(); } } else if (toType == String.class) { Date date = (Date) value; return DATE_FORMAT.format(date); } return null; } } ``` 在 `xwork-conversion.properties` 中配置转换器: ```properties java.util.Date=com.example.DateConverter ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值