📄 14. struts1.x note.txt
字号:
<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 (服务器端验证需要遵循的规范) (1) 自定义ActionForm 要继承 ValidatorForm 最好不要重写validate方法!如果重写validate方法,则必须显式调用 return super.validate(...)方法 (2) 动态form要使用org.apache.struts.validator.DynaValidatorForm 4)(服务器端验证需要遵循的规范) <action ..... validate="true" input="假如出错的页面" > 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.(采用客户端验证才需要这一步) <html:javascript formName="enrollForm"/> <html:form action="/enroll" onsubmit="return validateEnrollForm(this)" method="post">建议:(1) 客户端能做的验证,一般不要在服务器端验证。 一般输入格式等方面的验证 (2) 客户端实在没有能力进行验证的情况,发到服务器端做验证。
禁止表单重复提交:
1.客户端方案(Java Script)
使用js来实现禁止表单重复提交的方法很多,大体有如下几种:
1)提交时,使提交按钮不可用(disable),或者隐藏按钮,使用进度条
参考实现:
/*
函数名称:disableButtons
函数功能:提交前,将所有表单中的button,reset,submit禁用disabled;
如果是submit按钮,则添加与之相同隐藏文本框hidden对象,让提交的信息无一漏网
*/
function disableBtns()
{
for(k=0;k<document.all.length;k++ )
{
//当前节点对象
var obj = document.all(k)
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
obj.insertAdjacentElement("afterEnd",oNewNode);
}
}
}
}
/*
函数名称:disButtons2
函数功能:提交前,将所有表单中的button,reset,submit禁用disabled;
如果是submit按钮,则添加与之相同隐藏文本框hidden对象,让提交的信息无一漏网
函数说明:与上面的函数功能一样,但适用浏览器范围更广,推荐使用此函数。
*/
function disableBtns()
{
for(k=0;k<document.forms.length;k++ )
{
//获取当前表单
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);
}
}
}
}
}
/*
函数名称:hiddenForm
函数功能:提交时让表单自动隐藏,而不影响数据的提交
*/
function hideForm(form)
{
//waitStr 提交过程中出现的提示,可以自行设置
var waiting = "<center><img src='progress.jpg'>数据正在提交中,请等候</center>";
form.innerHTML = "<div style='display:none;'>"+form.innerHTML+"</div>"+waiting;
}
2)使用标识来实现控制客户端多次点击
<script type="text/javascript">
//控制标志
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.服务器端方案
原理:使用transaction token
1)jsp版
Day4:一、 文件上传
步骤:
1)定义表单
<html:form action="/fileupload" enctype="multipart/form-data">
<table>
<tr>
<td><b>请选择上传的文件:</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----强大的页面模板与页面布局技术
1.作用:Tiles框架提供模板机制,完成页面布局和内容展示逻辑的解耦
-------分离变与不变的元素:布局是不变的,而内容是变化的
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
变化的内容定义为:
<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可重用(被多个页面)
2) tiles的定义可以被"继承"和"覆盖"
3) 使用已定义的definition
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -