在线制作flash的网站/网上国网推广
2012年12月29日
Struts2 第8part 使用Domain Model(域模型)接收参数
上一part讲了使用action属性来接收参数,是一种普遍的方法。但如果参数多了,这种方法就不敢苟同了。这时候,使用域模型是比较方便的,在给出实例之前,解释一下什么是域模型吧。
域模型:所谓域模型就是在我们的实体域里面,真正存在的域的概念。
我在网上看到有大牛总结的比较好,我稍微改了一下内容。如果想看原文,点击下面链接:
http://blog.sina.com.cn/s/blog_5e2c3a010100pxk9.html
实例:Struts2_DomainModelParamInput
strut.xml配置文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <package name="user" extends="struts-default" namespace="/user">
- <action name="user" class="com.wwj.struts2.user.action.UserAction">
- <result name="success">/user_add_success.jsp</result>
- </action>
- </package>
- </struts>
这个项目里,那部分是域模型?下面建立的模型类就是这里所说的域模型:User.java
- package com.wwj.struts2.user.model;
- public class User {
- private String name;
- private int password;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getPassword() {
- return password;
- }
- public void setPassword(int password) {
- this.password = password;
- }
- }
建立完这个域模型,怎么利用它来接收参数呢?
我们来看看Action类:UserAction.java
- package com.wwj.struts2.user.action;
- import com.opensymphony.xwork2.ActionSupport;
- import com.wwj.struts2.user.model.User;
- public class UserAction extends ActionSupport {
- private User user;
- //private UserDTO userDTO;
- public String add() {
- System.out.println("name=" + user.getName());
- System.out.println("age=" + user.getPassword());
- return SUCCESS;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
如果像项目跟第7part那个项目 那样,如果在域模型里面有200多个属性,那么是不是要在UserAction类里面写200多个相应的属性,还要写相应的get,set呢?
这下子就可以领会到域模型的好处了吧。
五、这样,如果想给user的属性赋值,则在IE地址栏写:
http://localhost:8080/Struts2_DomainModelParamInput/user/user!add?user.name=a&user.age=8
就是user.name= user.age=
相当于调用了setUser.setName()。setUser.setAge().这就是用域模型直接接收这个参数。
但是域模型也有不适用的时候:如何是用户登录,希望有一个用户名,一个密码,一个确认密码。可是我们的用户域模型通常只有两个属性:用户名,密码。
那么用域模型就不可以了。那么如何解决这个问题呢?
1、答:可以直接用属性接收,如果喜欢用域模型,则再建立一个user。
2、除了上面方法外,,还有一种方式,就是再定义一个DTO(data transfer object)数据传输对象。,由这个对象,再生成域对象。
使用DTO来解决这个方法:
创建UserDTO.java
- package com.wwj.struts2.user.dto;
- public class UserDTO {
- private String name;
- private String password;
- private String confirmingPasswrod;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getConfirmingPasswrod() {
- return confirmingPasswrod;
- }
- public void setConfirmingPasswrod(String confirmingPasswrod) {
- this.confirmingPasswrod = confirmingPasswrod;
- }
- }
在UserAction类中用UserDTO属性
- package com.wwj.struts2.user.action;
- import com.opensymphony.xwork2.ActionSupport;
- import com.wwj.struts2.user.model.User;
- public class UserAction extends ActionSupport {
- private User user;
- //private UserDTO userDTO;
- public String add() {
- System.out.println("name=" + user.getName());
- System.out.println("age=" + user.getPassword());
- return SUCCESS;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
这样前台输入进来的参数,就与UserDTO相匹配了。
然后在UserAction里面处理完之后,再根据UserDTO ,生成User对象。
方法就是从UserDTO里面拿到相应的参数,添加到User里面。
UserDTO就是把参数传递过来,在new User时,再把参数传递给User对象。
那么什么时候用DTO对象呢?只能是当前台参数传递过来时,跟我们的域模型匹配不上。
这时有两种方式,一种方式是用属性接收过来,另外一种方式,就是用DTO对象。
index.jsp页面的代码:
- <?xml version="1.0" encoding="GB18030" ?>
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <%
- String context = request.getContextPath();
- %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
- <title>Insert title here</title>
- </head>
- <body>
- 使用Domain Model接收参数
- <a href="user/user!add?user.name=a&user.age=8">添加用户</a>
- <br />
- </body>
- </html>
转载于:https://blog.51cto.com/wwj9520/1104344