?? 14. struts1.x note.txt
字號(hào):
<form-validation> <formset> <form name="enrollForm"> <field property="name" depends="required"> <arg key="register.name"/> </field> <field property="age" depends="required, integer"> <arg key="register.age"/> </field> <field property="city" depends="required"> <arg key="register.city"/> </field> <field property="gender" depends="required"> <arg key="register.gender"/> </field> <field property="email" depends="required,email"> <arg key="register.email"/> </field> <field property="birthday" depends="required, date"> <arg key="register.birthday"/> <var> <var-name>datePattern</var-name> <var-value>yyyy-MM-dd</var-value> </var> </field> </form> </formset></form-validation> 注意:如果是使用1.3.x以上的版本,只需要引入: <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in> validation.xml為:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"><form-validation> <formset> <form name="enrollForm"> <field property="name" depends="required"> <arg key="register.name"/> </field> <field property="age" depends="required, integer"> <arg key="register.age"/> </field> <field property="city" depends="required"> <arg key="register.city"/> </field> <field property="gender" depends="required"> <arg key="register.gender"/> </field> <field property="email" depends="required,email"> <arg key="register.email"/> </field> <field property="birthday" depends="required, date"> <arg key="register.birthday"/> <var> <var-name>datePattern</var-name> <var-value>yyyy-MM-dd</var-value> </var> </field> </form> </formset></form-validation> 3)develop ur ActionForm (服務(wù)器端驗(yàn)證需要遵循的規(guī)范) (1) 自定義ActionForm 要繼承 ValidatorForm 最好不要重寫validate方法!如果重寫validate方法,則必須顯式調(diào)用 return super.validate(...)方法 (2) 動(dòng)態(tài)form要使用org.apache.struts.validator.DynaValidatorForm 4)(服務(wù)器端驗(yàn)證需要遵循的規(guī)范) <action ..... validate="true" input="假如出錯(cuò)的頁面" > 5)copy validation rules to ApplicationResources.properties
register.title=Super Boy Register Form register.name=Name: register.gender=Gender: register.age=Age: register.city=City: register.email=Email: register.birthday=Birthday: errors.required={0} is required. errors.integer={0} must be an integer. errors.date={0} is not a date. errors.email={0} is an invalid e-mail address. 6)active javaScript in Jsp page.(采用客戶端驗(yàn)證才需要這一步) <html:javascript formName="enrollForm"/> <html:form action="/enroll" onsubmit="return validateEnrollForm(this)" method="post">建議:(1) 客戶端能做的驗(yàn)證,一般不要在服務(wù)器端驗(yàn)證。 一般輸入格式等方面的驗(yàn)證 (2) 客戶端實(shí)在沒有能力進(jìn)行驗(yàn)證的情況,發(fā)到服務(wù)器端做驗(yàn)證。
禁止表單重復(fù)提交:
1.客戶端方案(Java Script)
使用js來實(shí)現(xiàn)禁止表單重復(fù)提交的方法很多,大體有如下幾種:
1)提交時(shí),使提交按鈕不可用(disable),或者隱藏按鈕,使用進(jìn)度條
參考實(shí)現(xiàn):
/*
函數(shù)名稱:disableButtons
函數(shù)功能:提交前,將所有表單中的button,reset,submit禁用disabled;
如果是submit按鈕,則添加與之相同隱藏文本框hidden對(duì)象,讓提交的信息無一漏網(wǎng)
*/
function disableBtns()
{
for(k=0;k<document.all.length;k++ )
{
//當(dāng)前節(jié)點(diǎn)對(duì)象
var obj = document.all(k)
if( obj.type=='button' || obj.type=='submit' || obj.type=='reset')
{
obj.disabled = true
if (obj.type=='submit')
{
//添加隱藏節(jié)點(diǎn)
var oNewNode = document.createElement("input");
oNewNode.type = "hidden"
oNewNode.name = obj.name
oNewNode.value = obj.value
obj.insertAdjacentElement("afterEnd",oNewNode);
}
}
}
}
/*
函數(shù)名稱:disButtons2
函數(shù)功能:提交前,將所有表單中的button,reset,submit禁用disabled;
如果是submit按鈕,則添加與之相同隱藏文本框hidden對(duì)象,讓提交的信息無一漏網(wǎng)
函數(shù)說明:與上面的函數(shù)功能一樣,但適用瀏覽器范圍更廣,推薦使用此函數(shù)。
*/
function disableBtns()
{
for(k=0;k<document.forms.length;k++ )
{
//獲取當(dāng)前表單
var frm = document.forms[k]
for(i=0;i<frm.length;i++)
{
var obj = frm.elements[i]
if ( obj.type=='button' || obj.type=='submit' || obj.type=='reset' )
{
obj.disabled = true
if (obj.type=='submit')
{
var oNewNode = document.createElement("input");
oNewNode.type = "hidden"
oNewNode.name = obj.name
oNewNode.value = obj.value
//frm.insertAdjacentElement("beforeEnd",oNewNode);
obj.insertAdjacentElement("afterEnd",oNewNode);
}
}
}
}
}
/*
函數(shù)名稱:hiddenForm
函數(shù)功能:提交時(shí)讓表單自動(dòng)隱藏,而不影響數(shù)據(jù)的提交
*/
function hideForm(form)
{
//waitStr 提交過程中出現(xiàn)的提示,可以自行設(shè)置
var waiting = "<center><img src='progress.jpg'>數(shù)據(jù)正在提交中,請(qǐng)等候</center>";
form.innerHTML = "<div style='display:none;'>"+form.innerHTML+"</div>"+waiting;
}
2)使用標(biāo)識(shí)來實(shí)現(xiàn)控制客戶端多次點(diǎn)擊
<script type="text/javascript">
//控制標(biāo)志
var submitted = false;
function checkSubmit() {
if(submitted == true) {
alert("submitted == true");
return false;
}
submitted = true;
return true;
}
//控制頁面雙擊行為
document.ondblclick = function docOnDblClick() {
window.event.returnValue = false;
}
//控制頁面單擊行為
document.onclick = function docOnClick() {
if(submitted) {
window.event.returnValue = false;
}
}
</script>
<html:form action="/logon" method="post" onsubmit="return checkSubmit();">
<html:text property="name"></html:text>
<html:submit value="login">
</html:submit>
</html:form>
2.服務(wù)器端方案
原理:使用transaction token
1)jsp版
Day4:一、 文件上傳
步驟:
1)定義表單
<html:form action="/fileupload" enctype="multipart/form-data">
<table>
<tr>
<td><b>請(qǐng)選擇上傳的文件:</b></td>
<td><html:file property="file"></html:file></td>
</tr>
<tr></tr>
<tr>
<td colspan=2 align=center>
<html:submit>上傳</html:submit>
</td>
</tr>
</table>
</html:form>
2)配置stuts-config.xml
*定義Form
*定制Action
a)form
public class FileUploadForm extends ActionForm {
private FormFile file;
public FormFile getFile() { return file; }
public void setFile(FormFile file) { this.file = file; }
}
b)action
//處理文件
FormFile file = fileUploadForm.getFile();
InputStream is = file.getInputStream();
OutputStream os = new FileOutputStream(path + filename);
輸出文件
二、Struts Tiles----強(qiáng)大的頁面模板與頁面布局技術(shù)
1.作用:Tiles框架提供模板機(jī)制,完成頁面布局和內(nèi)容展示邏輯的解耦
-------分離變與不變的元素:布局是不變的,而內(nèi)容是變化的
2.如何使用tiles框架
步驟:
1) 在struts-config.xml配置tiles插件
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config"
value="/WEB-INF/tiles-define.xml"/>
</plug-in>
2) 定義tiles:tiles-define.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN"
"http://struts.apache.org/dtds/tiles-config_1_3.dtd">
<tiles-definitions>
<definition name="definition1" page="/layout/baselayout.jsp">
<put name="title" value="mainspace"></put>
<put name="header" value="/layout/header.jsp"></put>
<put name="footer" value="/layout/footer.jsp"></put>
<put name="body" value="/layout/body.jsp"></put>
<put name="navigator" value="/layout/navigator.jsp"></put>
</definition>
<definition name="user" extends="definition1">
<put name="title" value="another mainspace"></put>
<put name="body" value="/usermanager/user.jsp"></put>
</definition>
</tiles-definitions>
3) 定義布局以及所有的組成部分
baselayout.jsp
header.jsp
footer.sjp
body.jsp
navigator.jsp
變化的內(nèi)容定義為:
<tiles:getAsString name="title"/>
<tiles:insert attribute="header">
baselayout.jsp參考代碼:
-------------------------------------------------------------------------------------------------------
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
<title><tiles:getAsString name="title"/></title>
</head>
<body>
<table border="0" width="100%" cellspacing="5">
<tr><td colspan=2 align=center>
<tiles:insert attribute="header"></tiles:insert></td></tr>
<tr><td width="15%" valign="top">
<tiles:insert attribute='navigator'></tiles:insert></td>
<td align="left">
<tiles:insert attribute='body'></tiles:insert></td></tr>
<tr><td colspan="2"><hr></td></tr>
<tr><td colspan=2 align=center>
<tiles:insert attribute="footer"></tiles:insert></td></tr>
</table>
</body>
</html>
-------------------------------------------------------------------------------------------------------
4) 在頁面中引用 tiles:
<tiles:insert definition="defall"/>
也可以覆蓋定義的屬性值
<tiles:insert definition="defall">
<tiles:put name="title" value="my page"/>
</tiles:insert>
3.使用tiles-define.xml定義tiles的好處:
1) tiles可重用(被多個(gè)頁面)
2) tiles的定義可以被"繼承"和"覆蓋"
3) 使用已定義的definition
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -