struts2接收参数——域模型、DTO
总是看见一些威武的哥们,把尚学堂马老师上课的每一句话每一个字都依次记录下来了确实佩服至极!! 转自 hibernate博客(哥们威武,基本上跟教程上一字不差!): http://blog.sina.com.cn/s/blog_5e2c3a010100pxk9.html 域模型详解:http://www.jdon.com/idea/strutsapp/04004.htm 一、DomainModel就是域模型。 1、所谓域模型就是在我们的实体域里面,真正存在的域的概念。 如一个BBS系统,真正存在的实体的概念就是:版块、帖子(Article)、话题(Topic),会员(User) 我们要接收参数,这个参数干嘛?还不是要接收到了之后,把它赋到某一个对象上。然后把它存在数据库里面。既然name与age总是要交给某一个user对象的。那么我们是不是可以这样用呢? 2、当在IE中调用了user.action时。在IE地址栏显示:http://localhost:8080/struts2_0800/user/user!add?user.name=a&user.age=8 它仍然是调用了user下面的user.action,它的类叫com.bjsxt.struts2.user.ation.UserAction.class,调用了它的add方法。在这个方法里面,直接输出的是user.getName()与user.getAge(). 二、新建项目 struts.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> <constant name="struts.devMode" value="true"/> <package name="user" extends="struts-default" namespace="/user"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package> </struts> 二、UserAction.class类的内容如下: package com.bjsxt.struts2.user.action; import com.bjsxt.struts2.user.model.User; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private User user; public String add(){ System.out.println("name="+user.getName()); System.out.println("age="+user.getAge()); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } 三、在上面的类中,有一个user属性,这个对象所属的类开源于另外一个包,就是model包。也就是域模型。 package com.bjsxt.struts2.user.model; public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 四、如果像项目struts_0700 那样,如果在域模型里面有200多个属性,那么是不是要在UserAction类里面写200多个相应的属性,还要写相应的get,set呢? 在根据域模型接收参数时,就不用了。 五、这样,如果想给user的属性赋值,则在IE地址栏写: http://localhost:8080/struts2_0800/user/user!add?user.name=a&user.age=8 就是user.name= user.age= 相当于调用了setUser.setName()。setUser.setAge() 五、这就是用域模型直接接收这个参数。 六、如何是用户登录,希望有一个用户名,一个密码,一个确认密码。可是我们的用户域模型通常只有两个属性:用户名,密码。 那么用域模型就不可以了。那么如何解决这个问题呢? 1、答:可以直接用属性接收,如果喜欢用域模型,则再建立一个user。 2、除了上面方法外,,还有一种方式,就是再定义一个DTO(data transfer object)数据传输对象。,由这个对象,再生成域对象。 2.1 package com.bjsxt.struts2.user.dto; public class UserDTO { private String name; private String password; private String confirmingpassword; 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 getConfirmingpassword() { return confirmingpassword; } public void setConfirmingpassword(String confirmingpassword) { this.confirmingpassword = confirmingpassword; } } 2.2在UserAction类中用UserDTO属性 package com.bjsxt.struts2.user.action; import com.bjsxt.struts2.user.model.User; import com.opensymphony.xwork2.ActionSupport; 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.getAge()); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } 2.3这样前台输入进来的参数,就与UserDTO相匹配了。 然后在UserAction里面处理完之后,再根据UserDTO ,生成User对象。 方法就是从UserDTO里面拿到相应的参数,添加到User里面。 UserDTO就是把参数传递过来,在new User时,再把参数传递给User对象。 3、那么什么时候用DTO对象呢?只能是当前台参数传递过来时,跟我们的域模型匹配不上。 这时有两种方式,一种方式是用属性接收过来,另外一种方式,就是用DTO对象。 七、jsp页面 1、index.jsp *********** <a href="user/user!add?user.name=a&user.age=8">添加用户 </a><br> ************ 2、user_add_success.jsp <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'user_add_success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> </body> </html>