Struts2_8_用DomainModel接收参数

来源:互联网 发布:淘宝私人定制怎么进 编辑:程序博客网 时间:2024/05/22 15:28

8_用DomainModel接收参数

刚刚了忘了给大家演示一下效果 了,我们在UserAction.java

里面的add()方法是这样写的 ,System.out.println(“name=” + name) ; 我们并没有调用什么 setName()方法,这是因为 Struts 2 已经帮助我们完成了 setter和getter方法的调用,我们就不用调用了,直接访问你会看到后台的输出  name = a  age=8 如下图所示

8_用DomainModel接收参数

当然你可以再地址栏 输入不同的值,这个大家自己可以做实验,

下面我们讲第二种接受参数的方法,使用DomainModel 的方式,DomainModel这个词以前给大家解释过,叫做域模型,所谓的域模型就是在我们的项目里面,在这个问题域里面,真正存在的那些个实体的概念,比如说最简单的写一个BBS系统,真正存在的实体的概念就会包括 版块(category) ,帖子(article)  等等这一类的,这就是实体概念,平时我们用Action接受到一个参数,大家可以想想看,我们用它干嘛了?就是接收到一个参数之后将其赋到某一个对象上,让后将其存到数据库里面,就是这样的,这是经常用的。既然name和age到时候,总是要交给某个 user对象,那么我们是不是可以这样来用了,

我们来看第二种接收参数的方法,部署好 08 项目,访问

http://localhost:8080/Struts2_0800_DomainModelParamInput/

结果如下

8_用DomainModel接收参数

第二种是使用 Domain  Model 接受参数,大家注意看 我这里点击 添加用户后的 地址栏,如下图所示:

8_用DomainModel接收参数

它的参数是怎么传的了?它仍然是调用了user下面的user.action ,去找 ,打开 struts.xml

如下图所示:

8_用DomainModel接收参数

这个处理类仍然叫 UserAction.java ,调用了它的add()方法,

8_用DomainModel接收参数

在这个方法里面我们直接输出的是user.getName 和user.getAge()这个是什么意思了?在UserAction.java 这个Action里面,它存在的就不是直接的属性了,存在的是一个user,这个user来源于我们的另外一个包,叫做model包,model当然指的就是我们的域模型,这个域模型很简单,如下图所示:

8_用DomainModel接收参数

它里面定义了 name和 age 属性, 这样了我们在 UserAction.java处理类中就不用 存 那么多属性了,如果一个域模型里面有200多个属性,当然有点夸张了,那你是不是要在这个UserAction里面写上200多个属性,然后还要写setter和getter方法啊,然后你本身另外的那个model里面还需要写 这些属性,这样太麻烦了,所以了我们干脆用 域模型,直接我们写 User 的一个对象 user,当然不要忘了 提供setter和getter方法,也不要去new User 对象,因为Struts 2 会帮助我们new的,所以你不用管了,当我们这样写的时候,就可以直接往user里面赋值了,就是在地址栏中 user.name = a &user.age=8  这样来写,就可以完成属性的赋值了,相当于调用了setUser().setName() ,先setUser()把user的值设好,再调用setName(),将其name的值设好,同样的看一下 后台,我们依然可以接受到name和age的值,如下图所示:

8_用DomainModel接收参数

index.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 'index.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/csshref="styles.css">
    -->
  </head>
  
  <body>
    <form action="User_add">
        姓名:<input name="user.name"/><br/>
        密码:<input name="user.pwd"/><br/>
        <input type="submit" value="确定">
        <input type="reset" value="重填">
    </form>
    <a href="User_add?user.name=awei&user.pwd=456">添加用户</a>
  </body>
</html>

这就是用域模型直接来接受这个参数,关于域模型这里头了还有一点深入的概念,试带着大家说一下,现在问大家这么一个问题,就是说一般的你的输入是不是正好可以跟域模型匹配在一起?我输入了三个参数,我的域模型就正好有三个属性,一定是这样吗?不一定,举个最常见的例子,我们写用户注册的时候,一般都这么写,用户名,用户密码,还有一个叫密码确认,如果站在域模型的角度,也就是说站在我们真正分析业务实体的角度,user这个类,它应该就有两个属性,一个是username,一个是password,它没有什么密码确认这一项,能理解这个意思吧。所以了这个时候,麻烦事就出来了,大家这个时候用域模型可以用上吗?是用不上的。此时

第一种方式就是直接用属性接收,接收完了之后,你如果有 user,你就new 一个,把这些属性传给他这是一种方式,

还有一种方式是我们可以使用 vo ,或者有的人叫它do ,还有人叫它dto ,vo叫ValueObject ,do叫DataObject(数据对象),dto叫datatransferObject(数据传输对象)

严格来讲这几个还是有一点细小的区别的,好假如说我们有这么一个对象,叫UserDTO,其实了你可以这么来写,它除了name和password之外,它还可以有一个confirmingPassword,如下图所示:

8_用DomainModel接收参数

然后我们在Action里面接收的时候就不再写 DomainModel了,将其写成

private UserDTO userDTO ;

 

大家想想看,这个时候我们前台输入进来的参数是不是又跟它相匹配了,在相应的处理方法里面处理完了之后了,再根据相应的 UserDTO生成一个user对象,怎么生成 了?是不是从DTO里面拿出相应的参数来填充到user里面去,就可以了。

画个图,

8_用DomainModel接收参数

我就从Action开始画,就是action在调用它的execute()方法的时候,注意了,这个时候大家是知道的它里面有一个DTO对象,它其实会首先把DTO对象给填充好,会调用它的setter方法,setter完之后,这个DTO对象就完成了,接下来你还可以把这个DTO了整体的交到我们的DomainModel里面去,而这个里面很可能有这样一个方法,就是这个时候我可以new它的一个DomainModel出来了,new 它的时候,很可能是这样一个方法,这个方法就是newDomainModel(DTO),但是了我把DTO交给你,如果我们写的更加直白一点,就是我要new 一个User()出来,然后了把UserDTO 传进去,即 new User (UserDTO dto) ,大家想想看,对应的这个user会不会new 出来?当然会了,为什么了?因为UserDTO里面的那些个属性,你在这个方法里面完全可以全都复制到我们的User里面去,所以这个User对象就产生了,为什么这个对象叫DataTransferObject ,叫数据传输对象,因为大家可以看看,它干了什么了?他就是把这个参数接受过来,然后在new DomainModel的时候,在吧这个参数交给 DomainModel,相对应的参数,有些参数一一不对应,这个时候你就需要在这个方法里面作出相应的处理,所以这个DTO的作用就是接收了一下,传递了一下,这个就叫DTO 。什么时候用?只能是你的参数传过来的时候跟我们的DomainModel匹配不上,这个时候可以有两种方式,第一种是用属性接收过来,再给DomainModel,第二种方式就是使用DTO。

用DomainModel来接收参数,做法就是你有一个DomainModel在里面的话,你往里面传参数的时候就直接带上DomainModel的名字(如 user),就是什么什么点什么,就可以了。

来源: <http://blog.sina.com.cn/s/blog_5e3c5e230100fcr2.html>

 

0 0
原创粉丝点击