一、使用struts表單驗證而不用struts標簽的方法:
使用struts標簽時:
<html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false" />
<html:form action="login" onsubmit="return validateLoginForm(this);">
?<input type="text" name="account.accountId"/>
?<input type="password" name="account.password"/>
?<INPUT type="submit" value="提交">
?<input type="reset" value="清空">
</html:form>
改成html標簽后:
<html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false" />
<form action="login.do" name="loginForm"?onsubmit="return validateLoginForm(this);">
<input type="text" name="account.accountId" size="16" style="width:120;height:23"/>
<input type="password" name="account.password" size="16" style="width:120;height:23" />
<INPUT type="submit" value="提交">
<input type="reset" value="清空">
</form>
二、動態表單知識
? <form-bean>的<form-property>子元素用來設置動態ActionForm的屬性。<form-property>元素的name屬性指定屬性名,type指定屬性類型,可以把動態ActionForm的屬性設為以下Java類型:
· java.lang.BigDecimal
· java.lang.BigInteger
· java.lang.Boolean
· java.lang.Byte
· java.lang.Character
· java.lang.Class
· java.lang.Double
· java.lang.Float
· java.lang.Integer
· java.lang.Long
· java.lang.Short
· java.lang.String
· java.sql.Data
· java.sql.Time
· java.sql.Timestamp
??????如果表單的字段值為Java基本類型,在配置時應該用響應的包裝類型來代替,例如int類型的包裝類型為Integer。如果屬性為Java基本類型,應該把屬性設置為相應的Java包裝類型。
??????DynaActionForm基類提供了initialize()方法,它把表單的所有屬性恢復為默認值。表單屬性默認值由<form-bean>的<form-property>子元素的initial屬性來決定。如果沒有設置initial屬性,則表單屬性的默認值由其Java類型來自動決定,例如對象類型的默認值為null,整數類型的默認值為0,boolean類型的默認值為false,date類型的默認值為當天。
三、用到spring框架后action都是繼承org.springframework.web.struts.DispatchActionSupport,DispatchActionSupport類里有
1)Log log,所以在action中可直接寫:log.info("Get a Bean named:Object");
2)protected void onInit(){};//創建action對象時先執行此方法。
3)protected void onDestroy(){};//回收action對象時先執行此方法
四、Tiles框架用法見《精通struts》第十六章。
詳細步驟:P397
當編譯Index.jsp時如果錯誤信息為: javax.servlet.jsp.JspException: ServletException in '/Layout.jsp': ServletException in
'common/CatalogsBar.jsp': null
其中Layout.jsp為模板,common/CatalogsBar.jsp為Index.jsp其中一部分,這個信息表名不是'common/CatalogsBar.jsp'找不到,而是它內部
有空引用異常,單獨編譯該文件得到具體錯誤信息:
java.lang.NullPointerException at _common._CatalogsBar_2e_jsp._jspService(CatalogsBar.jsp:11) [/common/CatalogsBar.jsp] 表名
在第11行有空引用。
五、國際化
1.開發和編譯代碼時指定字符集為UTF-8。JBuilder和Eclipse都可以在項目屬性中設置。
2.使用過濾器,如果所有請求都經過一個Servlet控制分配器,那么使用Servlet的filter執行語句,將所有來自瀏覽器的請求(request)轉換為UTF-8,因為瀏覽器發過來的請求包根據瀏覽器所在的操作系統編碼,可能是各種形式編碼。關鍵一句:
request.setCharacterEncoding("UTF-8")。
3.在JSP頭部聲明:<%@ page contentType="text/html;charset= UTF-8" %>。
在Jsp的html代碼中,聲明UTF-8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
4.設定數據庫連接方式是UTF-8。例如連接MYSQL時配置URL如下:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
注意,上述寫法是JBoss的mysql-ds.xml寫法,多虧網友提示,在tomcat中&要寫成&即可。一般其他數據庫都可以通過管理設置設定UTF-8
其他和外界交互時能夠設定編碼時就設定UTF-8,例如讀取文件,操作XML等。
?
六、表單驗證:
1、驗證的配置是在validation.xml中,驗證規則的配置是在validator-rules.xml與validator-rules-user.xml中.
七、action中轉url的方式:
1。轉到.jsp頁面:
return mapping.findForward("***");//***指struts-config中定義好的forward項。
forward項有兩個選項,默認都為false,說明如下:
contextRelative——是否是相對目錄。(如現頁面為business/input.jsp,轉到action后forward項到business/result.jsp,如果contextRelative為false,則轉到鏈接business/business/result.jsp,所以此選項最好勾上)
redirect——是否重定向,即是否包含request信息。
2。返回上頁顯示出錯信息:
this.saveErrors(request,errors);
return this.***(mapping,form,request,response);//***指本action的一個方法,為了轉到上個頁面顯示出錯信息
3。轉到本action的其他方法:
ActionForward forward = new ActionForward();
forward.setPath(mapping.getPath() + ".do?method=****&***);
forward.setRedirect(true););//用此方法則間接跳轉,即不帶request信息,不加此
//方法會保留request信息
return forward;
八、處理日期類型
struts使用日期包括將string自動轉化為日期fill到form中,以及將form中的日期按照指定格式顯示在html的textfield中。首先講第一種情況的解決方法:
創建如下類:
import?java.util.*;
import?org.apache.commons.beanutils.*;
import?java.text.SimpleDateFormat;
public?class?DateConvert?implements?Converter
{
??static?SimpleDateFormat?df?=?new?SimpleDateFormat("yyyy/MM/dd");
??public?DateConvert()
??{
??}
??public?Object?convert(Class?type,?Object?value)
??{
????
????if(value==null)return?null;
????if(((String)value).trim().length()==0)?return?null;
????if(value?instanceof?String)
????{
??????try
??????{
????????return?df.parse((String)value);
??????}
??????catch?(Exception?ex)
??????{
????????throw?new?ConversionException("輸入的日期類型不合乎yyyy/MM/dd"
??????????+?value.getClass());
??????}
????}
????else
????{
??????throw?new?ConversionException("輸入的不是字符類型"+value.getClass());
????}
??}
}
然后在你的系統某出使用如下(如web的init方法)
ConvertUtils.register(new?DateConvert(),java.util.Date.class);
參數用于表示DateConvert類負責處理java.util.Date類型的轉化
第二種情況是如何顯示form中日期類型到html:text中,我用的辦法是修改struts的代碼,重新生成一個新的struts.jar
org.apache.struts.taglib.html.BaseFieldTag的doStartTag的方法
找到?if?(value?!=?null)?{results.append(ResponseUtils.filter(value))代碼行下面的內容,需要修改此處代碼,以便輸出日期類型
如下:
if?(value?!=?null)?{
????????????results.append(ResponseUtils.filter(value));
????????}?else?if?(redisplay?||?!"password".equals(type))?{
????????????Object?value?=?RequestUtils.lookup(pageContext,?name,?property,?null);
????????????//System.out.println("lijz?"+value);
????????????if(value?instanceof?java.util.Date)
????????????{
???????????????//System.out.println("date="+value);
???????????????if?(value?==?null)
???????????????????value?=?"";
????????else
????????{
??????????java.util.Date?d=?(java.util.Date)value;
??????????try
???????????{
????????????results.append(ResponseUtils.filter(df.format(d)));
??????????}
??????????catch(Exception?ex)
??????????{
????????????System.out.println("form?error:"+ex.getMessage());
??????????}
??????????}
????????????}
???????????else
???????????{
???????????????if?(value?==?null)
????????????????value?=?"";
????????????????results.append(ResponseUtils.filter(value.toString()));
???????????}
???????????
???????}
????????results.append("\"");
????????results.append(prepareEventHandlers());
????????results.append(prepareStyles());
????????results.append(getElementClose());
????????//?Print?this?field?to?our?output?writer
????????ResponseUtils.write(pageContext,?results.toString());
????????//?Continue?processing?this?page
????????return?(EVAL_BODY_TAG);??????
?
?重新編譯struts成struts.jar.放到你需要的項目中
posted on 2006-07-07 11:00
保爾任 閱讀(757)
評論(0) 編輯 收藏