zoukankan      html  css  js  c++  java
  • struts2接收参数——域模型、DTO

    在开始介绍域模型之前我们要明白一点,为什么通过域模型我们可以把参数这么方便的在后台接收。

    那是因为

    通过参数拦截器(params interceptor)自动的把前台传过来的参数给域对象(domain object),其实也就是调用了域对象的set方法。前提是用struts2框架,并创建一个JavaBean属性的域对象(domain object)并生成相应的getter和setter方法。  域模型不仅方便了参数的传递、数据的持久化,同时,也可以在前台jsp中,动态显示、回填。如:

     <s:textfield name="user.name" label="User Name"  value="${user.name}" /> 可以回填name的值 

    一、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)数据传输对象。,由这个对象,再生成域对象。

    21

    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/csshref="styles.css">

        -->

     

      </head>

     

      <body>

        This is my JSP page. <br>

      </body>

    </html>

  • 相关阅读:
    如何选择硅谷的IT公司
    NSDateFormatter设定日期格式
    内存映射文件
    double 转 int 的精度损失问题
    #ifndef #define 的用法
    How to improve the performance of MB5B
    Vendor Evaluation Questionair弹出空白页
    接受报价后创建合同,却无法弹出相应的合同类型
    SRM税务代码的决定逻辑
    How to improve the performance of MB51
  • 原文地址:https://www.cnblogs.com/kaka-bing/p/3172088.html
Copyright © 2011-2022 走看看