<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    ?? 通過王濤完成的項目練習,發現了struts中的表單校驗失敗后重顯的一個問題:假設ActionForm Bean中有一個整數類型的屬性,如果將其類型定義為int,這個屬性的默認值是0;在表單頁面中用一個文本框來輸入這個屬性的值,當文本框中沒有填寫任何內容時,發送到WEB服務器的參數值為一空字符串"";當ActionForm Bean中的其它屬性校驗失敗時,回到表單頁面重新顯示,這時,與整數字段對應的文本框中顯示的內容為0,而不是最初的那樣(沒有任何內容)。
    ? 為此,我們想到了在Spring MVC中所采用的辦法:將整數類型的屬性定義為Integer類型,這樣,該屬性的默認值為null,借助<html:property>可將null顯示為空字符串,但是,實際運行發現,ActionForm Bean中的其它屬性校驗失敗回到表單頁面重新顯示時,與Integer類型的屬性對應的文本框中顯示的內容仍然為0。這說明struts在將請求參數組裝進ActionForm Bean對象中時、它也會將內容為空字符串""的請求參數(文本框中不填寫任何內容時即會出現這種情況)裝配到ActionForm Bean中,并且將空字符串""轉變成0值的Integer數據。對于這種情況,我們想到了將原本屬于整數的屬性設計成String類型的妥協解決辦法,但覺得不是很理想,想知道各位有經驗的朋友對這種情況是如何處理的?特向各位朋友請教。

    下面是問題的完整描述:
    假設有一個注冊課程的表單,其中包含有“課程名”、“學分”等字段信息,顯然“課程名”是String類型,“學分”是整數類型,與這個表單對應的ActionForm可以設計成如下形式:
    public class RegisterCourseForm extends ActionForm
    {
    ??? private String name;

    ??? public String getName()
    ??? {??????? return name;
    ??? }

    ??? public void setName(String name) {
    ?????? this.name = name;
    ??? }
    ???
    ??? private Integer score;

    ??? public Integer getScore()
    ??? {
    ?????? return score;
    ??? }
    ??? public void setScore(Integer score)
    ??? {
    ?????? this.score = score;
    ??? }

    ??? public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
    ??? {
    ??????? if("".equals(name))
    ??????? {
    ??????????? ActionErrors errors = new ActionErrors();
    ??????????? errors.add("name",new ActionMessage("required.name"));
    ??????????? return errors;
    ??????? }
    ??????? return null;
    ??? }
    ???
    }
    注冊課程的表單頁面的主要內容如下:
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
    <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
    ?
    <html:form action="/registerCourse">
    ???? name : <html:text property="name"/><html:errors property="name"/><br/>
    ???? score : <html:text property="score"/><html:errors property="score"/><br/>
    ???? <html:submit/>
    </html:form>

    為了讓這個用例能夠運行,同時又簡化整個程序的代碼,我們直接使用Struts提供的ForwardAction,大家也可以使用MyEclipse自動為我們創建的沒有任何業務邏輯的Action。在struts-config.xml文件中的配置片段如下:
    ?? <form-bean name="registerCourseForm" type="cn.itcast.form.RegisterCourseForm" />
    ......
    ??? <action parameter="/WEB-INF/jsp/registerCourse.jsp"
    ??????????? path="/index" type="org.apache.struts.actions.ForwardAction"/>
    ?
    ??? <action
    ????? input="/WEB-INF/jsp/registerCourse.jsp"
    ????? name="registerCourseForm"
    ????? path="/registerCourse"
    ????? scope="request"
    ????? type="org.apache.struts.actions.ForwardAction"
    ?????? parameter="/WEB-INF/jsp/registerCourse.jsp"???
    ??? />

    (1)首先在瀏覽器地址欄中輸入http://localhost:8080/CourseManager/index.do,請求交給第一個Action處理,瀏覽器中顯示出registerCourse.jsp頁面;
    (2)在注冊課程的表單頁面不填寫任何內容,直接提交表單,這時候表單校驗失敗(即RegisterCourseForm.validate方法返回ActionErrors對象),瀏覽器重新顯示registerCourse.jsp頁面。registerCourse.jsp頁面除了顯示出錯誤描述信息之外,還在表單中顯示出上次輸入的內容,現在遇到的問題是:我們上次提交表單時,并沒有在學分(score)文本框中輸入任何內容,但這次重顯表單時,在學分(score)文本框中添入了一個0。
    ? 我猜想這是因為struts在將請求參數組裝進RegisterCourseForm對象中時、將空字符串""的請求參數(文本框中不填寫任何內容時即會出現這種情況)轉變成了0值的Integer數據。查看struts的源代碼,了解到請求參數組裝到FormBean中的方法調用過程如下:
    ActionServlet.doGet/doPost-->ActionServlet.process-->RequestProcessor.process-->
    RequestProcessor.processActionForm,RequestProcessor.processPopulate-->RequestUtils.populate-->
    BeanUtils.populate-->BeanUtilsBean.setProperty(Object bean, String name, Object value)

    可見,將請求參數組裝成FormBean的屬性時,最終調用的是BeanUtilsBean.setProperty方法,可能的原因就是BeanUtilsBean.setProperty方法在為JavaBean的整數類型的屬性進行賦值時,會將空字符串""轉換成0。BeanUtilsBean類位于apache的commons-beanutils包中,大家從struts安裝包的lib目錄中能夠找到commons-beanutils.jar包及相關的依賴包。我安排王濤寫了一個程序,來驗證這種效果:

    package com.tony;
    public class TestInteger {

    ?public static void main(String[] args) {
    ??
    ??Student student = new Student();
    ??try {
    ???BeanUtilsBean.getInstance().setProperty(student,"name","Tony");
    ???BeanUtilsBean.getInstance().setProperty(student,"age","");
    ???System.out.print(student);
    ??} catch (Exception e) {
    ???// TODO Auto-generated catch block
    ???e.printStackTrace();
    ??}
    ?}
    }

    package com.tony;
    public class Student {
    ?private String name;
    ?private Integer age;
    ?public Integer getAge() {
    ??return age;
    ?}
    ?public void setAge(Integer age) {
    ??this.age = age;
    ?}
    ?public String getName() {
    ??return name;
    ?}
    ?public void setName(String name) {
    ??this.name = name;
    ?}
    ?public String toString()
    ?{
    ??return this.name + ":" + this.age;
    ?}
    }
    程序最后打印出來的結果為Tony:0,這說明BeanUtilsBean.setProperty方法確實將空字符串""轉換成了整數類型的0。?



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1429695

    posted on 2006-12-05 14:55 蘆葦 閱讀(318) 評論(0)  編輯  收藏 所屬分類: Struts
    主站蜘蛛池模板: 日韩免费码中文在线观看| 免费观看黄色的网站| 久久久亚洲欧洲日产国码农村| 曰批全过程免费视频网址| 精品亚洲国产成人av| 亚洲Av熟妇高潮30p| 精品国产一区二区三区免费看| 国产高潮流白浆喷水免费A片 | 亚洲美女精品视频| 又粗又大又猛又爽免费视频| 亚洲视频在线观看免费| 亚洲欧美日韩一区二区三区| 亚洲综合精品香蕉久久网| 中文字幕人成无码免费视频| 一级成人a免费视频| 亚洲一区二区三区在线网站| 久久久久亚洲av毛片大| 免费A级毛片无码免费视| a级毛片毛片免费观看久潮| 亚洲成a人片在线观看天堂无码 | 国产日韩在线视频免费播放| 亚洲人成7777| 久久99国产亚洲精品观看| 免费一级特黄特色大片在线| 在线观看H网址免费入口| 亚州**色毛片免费观看| 亚洲中文字幕AV每天更新| 亚洲视频免费一区| 国产亚洲精品xxx| 亚洲精品成人网久久久久久| 四虎www成人影院免费观看| 91精品啪在线观看国产线免费| 亚美影视免费在线观看| 亚洲jizzjizz少妇| 亚洲youjizz| 亚洲狠狠狠一区二区三区| 亚洲国产成人高清在线观看| 国产啪亚洲国产精品无码 | 永久亚洲成a人片777777| 国产麻豆免费观看91| 一二三四免费观看在线视频中文版 |