The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          1.Struts2的屬性驅動.

          Struts2的屬性驅動指的是在action中JSP頁面的每一個form中的name都對應在action中有一個屬性與之對應。看下面代碼片段:

           


          <form action="register.do" name="RegisterForm" method="post">

                      Username:<input type="text" name="uname"><br>
                      Password:<input type="password" name="upass"><br>
                      Confirm: <input type="password" name="rpass"><br>
                      <input type="submit" value="Submit">

          </form>

           


          這是一個最基本的用戶注冊的表單,它有三個數據要提交: uname、upass、rpass,那么對應的Action也要有三個屬性(其實是三個屬性的setter),看register.do實際的Action定義類:

           


          package org.abu.csdn.action.user;

          import com.opensymphony.xwork2.ActionSupport;

          /**
           * Struts2屬性驅動演示用的Action
           * @author 阿布
           *
           */
          public class RegisterAction extends ActionSupport {

              private String uname;
              private String upass;
              private String rpass;

              public String getUname() {
                  return uname;
              }

              public void setUname(String uname) {
                  this.uname = uname;
              }

              public String getUpass() {
                  return upass;
              }

              public void setUpass(String upass) {
                  this.upass = upass;
              }

              public String getRpass() {
                  return rpass;
              }

              public void setRpass(String rpass) {
                  this.rpass = rpass;
              }
             
              @Override
              public String execute() throws Exception {       
                  return ActionSupport.SUCCESS;
              }

          }

           

           

          你會看到RegisterAction中的三個屬性和RegisterForm表單中的name屬性名字一模一樣,沒錯,這就是Struts2的屬性驅動,當表單提交到RegisterAction后,Struts2將會自動將根據表單的name屬性調用Action中相應的屬性setter,去自動賦值。

           


          2.Struts2的模型驅動

          Struts2的模型驅動其實和Struts1.x中的ActionForm有點類似,在Struts1.x中每一個Action都必須有一個ActionForm與之對應,而Struts2.0中,每一個Action同樣需要提供一個POJO對象,用來封裝表單屬性,看代碼:

           


          <form action="register.do" name="RegisterForm" method="post">

                      Username:<input type="text" name="uname"><br>
                      Password:<input type="password" name="upass"><br>
                      Confirm: <input type="password" name="rpass"><br>
                      <input type="submit" value="Submit">

          </form>

           


          這段表單的代碼和上面的一模一樣,就不贅述了。接下來看POJO的代碼,其實就是普通的Java Bean:

           


          package org.abu.csdn.action.user;

          import com.opensymphony.xwork2.ActionSupport;

          /**
           * Struts2屬性驅動演示用的Java Bean
           * @author 阿布
           *
           */
          public class User {

              private String uname;
              private String upass;
              private String rpass;

              public String getUname() {
                  return uname;
              }

              public void setUname(String uname) {
                  this.uname = uname;
              }

              public String getUpass() {
                  return upass;
              }

              public void setUpass(String upass) {
                  this.upass = upass;
              }

              public String getRpass() {
                  return rpass;
              }

              public void setRpass(String rpass) {
                  this.rpass = rpass;
              }
            
          }

           


          對不起,也是和屬性驅動中的例子一樣,很簡單,因為演示的都是同一個例子,只是方法不同而已,但是接下來就不一樣了,看RegisterAction代碼:

           


          package org.abu.csdn.action.user;

          import org.abu.csdn.dto.User;

          import com.opensymphony.xwork2.ActionSupport;
          import com.opensymphony.xwork2.ModelDriven;

          /**
           * Struts2模型驅動演示用的Action
           * 
           * @author 阿布
           *
           */
          public class RegisterAction extends ActionSupport implements ModelDriven<User> {

              private User user;
             
              public User getUser() {
                  return user;
              }

              public void setUser(User user) {
                  this.user = user;
              }

              @Override
              public String execute() throws Exception {       
                  return ActionSupport.SUCCESS;
              }

              // 模型驅動必須實現的方法,也是ModelDriven接口中唯一的方法
              public User getModel() {
                 
                  return user;
              }

          }

           

           

          看到沒有,和屬性驅動的Action有很大的區別,下面一一列舉:

          (1)模型驅動的Action必須實現ModelDriven接口,而且要提供相應的泛型,這里當然就是具體使用的Java Bean了。

          (2)實現ModelDriven的getModel方法,其實就是簡單的返回泛型的一個對象。

          (3)在Action提供一個泛型的私有對象,這里就是定義一個User的user對象,并提供相應的getter與setter。

          好了,上面的三件事做完之后,Action就會去自動調用User的setter將表單中的name屬性的值賦給User中的屬性。而Action的后續處理的Jsp頁面后者是Servlet就可以使用user對象了。

           

           

           

          3.到底是用屬性驅動和是模型驅動呢?

           

           

          這個問題困擾了很多Struts2的初學者,我這里提供一些建議:

          (1)請你統一整個系統中的Action使用的驅動模型,即要么都是用屬性驅動,要么都是用模型驅動。

          (2)如果你的DB中的持久層的對象與表單中的屬性都是一一對應的話,那么就使用模型驅動吧,畢竟看起來代碼要整潔得多。

          (3)如果表單的屬性不是一一對應的話,那么就應該使用屬性驅動,否則,你的系統就必須提供兩個Bean,一個對應表單提交的數據,另一個用與持久層。

           


          看上面的例子,其實密碼確認rpass是不需要放到DB中去的,而僅僅是用于校驗密碼的,不是嗎?那么如果使用模型驅動的話,就存在這個問題了,而使用屬性驅動的話又有些繁瑣,現在我們就來調整一個看我的解決方法:

           


          4.完整的例子

          (1)表單提交的JSP頁面index.jsp

          <%@ page language="java" contentType="text/html; charset=UTF-8"
              pageEncoding="UTF-8"%>
          <%@ taglib uri="/struts-tags" prefix="s"%>
          <%
              String path = request.getContextPath();
              String basePath = request.getScheme() + "://"
                      + request.getServerName() + ":" + request.getServerPort()
                      + path + "/";
          %>

          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
              <head>
                  <base href="<%=basePath%>">
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                  <title>CSDN首頁</title>
              </head>
              <body>
                  <s:a href="userManager/userRegister.jsp">用戶注冊</s:a>
                 
                  <form action="register.do" name="SampleForm" method="post">
                      Username:<input type="text" name="uname"><br>
                      Password:<input type="password" name="upass"><br>
                      Confirm: <input type="password" name="rpass"><br>
                      <input type="submit" value="Submit">
                  </form>
              </body>
          </html>

           


          (2)User的定義

           


          package org.abu.csdn.action.user;

          import com.opensymphony.xwork2.ActionSupport;

          /**
           * Struts2屬性驅動演示用的Java Bean
           * @author 阿布
           *
           */
          public class User {

              private String uname;
              private String upass; 

              public String getUname() {
                  return uname;
              }

              public void setUname(String uname) {
                  this.uname = uname;
              }

              public String getUpass() {
                  return upass;
              }

              public void setUpass(String upass) {
                  this.upass = upass;
              }  
            
          }

           


          (3)RegisterAction的定義

           


          package org.abu.csdn.action.user;

          import com.opensymphony.xwork2.ActionSupport;

          /**
           * Struts2屬性驅動演示用的Action
           * @author 阿布
           *
           */
          public class RegisterAction extends ActionSupport {

           

           

              // 用來給spring注入,及屬性拷貝


              private User user;

           

           

              private String uname;
              private String upass;
              private String rpass;

              public String getUname() {
                  return uname;
              }

              public void setUname(String uname) {
                  this.uname = uname;
              }

              public String getUpass() {
                  return upass;
              }

              public void setUpass(String upass) {
                  this.upass = upass;
              }

              public String getRpass() {
                  return rpass;
              }

              public void setRpass(String rpass) {
                  this.rpass = rpass;
              }
             
              @Override
              public String execute() throws Exception {

                  // 調用方法將屬性copy到user中去,便于后續的service方法


                  copyAttribute();

                  // TODO:編寫自己的user業務代碼
                  return ActionSupport.SUCCESS;
              }

           


              /**
               * 注意這是一個action全局的校驗
               */
              @Override
              public void validate() {
                  // 進行密碼的校驗
                  if (!(upass.trim()).equals((rpass.trim()))) {
                      // 注意這里addFieldError的fieldName參數必須用引號引起來,
                      // 不能這樣使用addFieldError(rpass,"XXXXXX"),而必須是addFieldError("rpass","XXXXX")
                      this.addFieldError("rpass", this
                              .getText("csdn.action.user.register.validate.verify"));
                  }
              }

           

           

           


              /**
               * 將表單屬性中需要持久化的屬性拷貝到user中去
               * @author 阿布
               *
              */
              private void copyAttributes () {

                      user.setUname(uname);

                      user.setUpass(upass);


              }


          }

           

           

           

          (4)Struts.xml配置

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
              "http://struts.apache.org/dtds/struts-2.1.dtd">
          <struts>
              <package name="root" extends="struts-default" namespace="/userManager">
                  <action name="userRegister" class="org.abu.csdn.action.user.RegisterAction">
                      <result name="success">/index.jsp</result>
                      <result name="input">/userManager/userRegister.jsp</result>
                  </action>               
              </package>
          </struts>

           

           

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/csuliky/archive/2009/05/30/4226917.aspx

          posted on 2010-06-17 21:05 Eric_jiang 閱讀(9214) 評論(1)  編輯  收藏 所屬分類: struts2

          Feedback

          # re: Struts2的屬性驅動與模型驅動的區別 2015-08-10 16:11 一樣
          同樣try同人女  回復  更多評論
            

          主站蜘蛛池模板: 醴陵市| 衡阳市| 高邮市| 德格县| 德阳市| 建平县| 陆丰市| 滕州市| 马关县| 依安县| 清河县| 泸水县| 巴里| 西青区| 嘉禾县| 榕江县| 庄河市| 博客| 车险| 广安市| 龙游县| 图们市| 和顺县| 防城港市| 华坪县| 璧山县| 浑源县| 庆阳市| 株洲市| 司法| 遂宁市| 安平县| 临湘市| 兰州市| 文成县| 崇仁县| 富宁县| 昭苏县| 大名县| 通辽市| 罗源县|