还是通过一些步骤例子说明
首先建立Struts工程的时候要启动验证框架。
它称为Validator验证框架

主要依赖与两个.jar文件
Jakarta-oro.jar
Commons-validator.jar

这个是在struts-config.xml文件中如下加入配置之后即代表该工程已经使用验证框架的插件了

Xml代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cplug-in%20className%3D%22org.apache.struts.validator.ValidatorPlugIn%22%3E%20%0A%20%20%20%20%20%20%20%20%3Cset-property%20property%3D%22pathnames%22%20value%3D%22%2FWEB-INF%2Fvalidator-rules.xml%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2FWEB-INF%2Fvalidation.xml%22%2F%3E%20%0A%3C%2Fplug-in%3E"></embed>
  1. <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  2. <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
  3. /WEB-INF/validation.xml"/>
  4. </plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
</plug-in>

完成好了之后以注册的例子说明它的主要使用方法
1.建立一个注册的页面;包含用户名: 密码: 年龄: 邮箱:都不能为空。密码长度必须大于或等于8位,邮箱格式验证等
显示方式一:使用错误消息显示在相应的控件后面。
2.建立注册页相对应的表单Bean(ActionForm),重点在这里,因为要使用验证框架的话该表单类需要修改
1)修改该类的继承

Java代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%20%20import%20org.apache.struts.validator.ValidatorForm%3B%2F%2F%20%E5%AF%BC%E5%85%A5%E8%A6%81%E7%BB%A7%E6%89%BF%E7%9A%84%E7%B1%BB%20%0A%20%20public%20class%20%E8%A1%A8%E5%8D%95%E7%B1%BB%20extends%20ValidatorForm%20%2F%2F%E4%BF%AE%E6%94%B9%E7%BB%A7%E6%89%BF%E7%B1%BB"></embed>
  1. import org.apache.struts.validator.ValidatorForm;// 导入要继承的类
  2. public class 表单类 extends ValidatorForm //修改继承类
  import org.apache.struts.validator.ValidatorForm;// 导入要继承的类 public class 表单类 extends ValidatorForm //修改继承类

2) //修改该类且不包含validate()方法.
3、在validation.xml 中配置验证规则
  这个验证规则依赖与validator-rules.xml此文件已经配置好的验证类
  大概介绍几种规则吧{}中的为参数
   errors.required={0} is required.      必须的,或者不能为空的
   errors.minlength={0} can not be less than {1} characters. {某某}不能小于{多少}位
   errors.maxlength={0} can not be greater than {1} characters.{ 某某}不能大于{多少}位
  errors.range={0} is not in the range {1} through {2}.{0}是不能在{1}与{2}之间

Xml代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cform-validation%3E%20%20%20%3C!--%E4%BB%A5%E4%B8%8B%E6%98%AF%E9%85%8D%E7%BD%AE%E4%B8%80%E4%BA%9B%E5%B8%B8%E7%94%A8%E7%9A%84%E9%AA%8C%E8%AF%81%E8%A7%84%E5%88%99%20--%3E%0A%20%20%3Cformset%3E%20%0A%3Cform%20name%3D%22regActionForm%22%3E%20%20%0A%3C!--%E8%A1%A8%E5%8D%95%E5%90%8D%EF%BC%8C%E4%B8%BA%E9%AA%8C%E8%AF%81%E5%93%AA%E4%B8%AA%E8%A1%A8%E5%8D%95%E8%80%8C%E9%85%8D%E7%BD%AE%EF%BC%8C%E8%BF%99%E9%87%8C%E7%9A%84name%E6%8C%87%E5%AE%9Astruts%E4%B8%ADform-bean%E7%9A%84%E5%88%AB%E5%90%8D%20--%3E%0A%20%20%20%20%3Cfield%20property%3D%22username%22%20depends%3D%22required%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.username%22%2F%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%20%20%20%20%20%20%20%20arg0%E6%8C%87%E8%A6%81%E4%B8%BA%E8%AF%A5%E8%A7%84%E5%88%99%E4%BC%A0%E5%85%A5%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%20%0A%3C!--property%E4%B8%BA%E8%A1%A8%E5%8D%95%E4%B8%AD%E7%9A%84%E5%B1%9E%E6%80%A7%EF%BC%8Cdepends%E4%B8%BA%E8%A6%81%E9%AA%8C%E8%AF%81%E7%9A%84%E8%A7%84%E5%88%99key%E4%B8%BA%E6%B6%88%E6%81%AF%E8%B5%84%E6%96%99%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E9%85%8D%E7%BD%AE%E9%94%AE%20--%3E%0A%3C!--%20%E9%AA%8C%E8%AF%81%E5%AF%86%E7%A0%81%E6%9C%80%E5%B0%8F%E9%95%BF%E5%BA%A6%E4%B8%8D%E5%B0%8F%E4%BA%8E8%E4%BD%8D%20%E8%A6%81%E4%B8%80%E4%B8%AA%E6%8E%A7%E4%BB%B6%E5%B1%9E%E6%80%A7%E9%AA%8C%E8%AF%81%E4%B8%A4%E4%B8%AA%E8%A7%84%E5%88%99%E7%9A%84%E8%AF%9D%E7%9C%9F%E6%AD%A3%E4%BB%A5%E9%80%97%E5%8F%B7%E5%88%86%E5%BC%80%2C%20--%3E%20%0A%0A%3Cfield%20property%3D%22userpass%22%20depends%3D%22required%2Cminlength%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.userpass%22%2F%3E%20%0A%20%20%20%20%20%20%3Carg1%20key%3D%22%24%7Bvar%3Aminlength%7D%22%20name%3D%22minlength%22%20resource%3D%22false%22%2F%3E%20%0A%20%20%20%20%20%20%3Cvar%3E%20%0A%20%20%20%20%20%20%20%20%3Cvar-name%3Eminlength%3C%2Fvar-name%3E%20%0A%20%20%20%20%20%20%20%20%3Cvar-value%3E8%3C%2Fvar-value%3E%20%0A%20%20%20%20%20%20%3C%2Fvar%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%0A%20%0A%20%20%20%20%3C!--%E7%BB%BF%E8%89%B2%E7%9A%84%E4%B8%BA%E5%8F%98%E9%87%8F%E5%90%8D%2C%E5%A5%BD%E5%83%8F%E5%AE%9A%E4%B9%89%E4%B9%9F%E6%9C%89%E8%A7%84%E5%88%99%EF%BC%8C%E5%BF%85%E9%A1%BB%E6%98%AF%E9%82%A3%E6%A0%B7%E8%80%8Cresource%20%E5%88%99%E6%98%AF%E9%85%8D%E7%BD%AE%E6%98%AF%E5%90%A6%E4%BB%8E%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BEkey%20--%3E%0A%20%20%20%20%0A%0A%3Cfield%20property%3D%22email%22%20depends%3D%22required%2Cemail%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.email%22%2F%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%0A%20%0A%3C!--%20%E9%AA%8C%E8%AF%81%E5%B9%B4%E9%BE%84%E5%9C%A8%E4%B8%80%E5%AE%9A%E8%8C%83%E5%9B%B4%E4%B9%8B%E5%86%85%20--%3E%0A%20%20%20%20%3Cfield%20property%3D%22age%22%20depends%3D%22required%2CintRange%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.age%22%2F%3E%20%0A%20%20%20%20%20%20%3Carg1%20key%3D%22%24%7Bvar%3Amin%7D%22%20name%3D%22intRange%22%20resource%3D%22false%22%2F%3E%20%0A%20%20%20%20%20%20%3Carg2%20key%3D%22%24%7Bvar%3Amax%7D%22%20name%3D%22intRange%22%20resource%3D%22false%22%2F%3E%20%0A%20%20%20%20%20%20%20%3Cvar%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-name%3Emin%3C%2Fvar-name%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-value%3E1%3C%2Fvar-value%3E%20%0A%20%20%20%20%20%20%20%3C%2Fvar%3E%20%0A%20%20%20%20%20%20%20%3Cvar%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-name%3Emax%3C%2Fvar-name%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-value%3E100%3C%2Fvar-value%3E%20%0A%20%20%20%20%20%20%20%3C%2Fvar%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%0A%20%20%20%20%3C%2Fform%3E%20%0A%20%20%3C%2Fformset%3E%20%0A%3C%2Fform-validation%3E%20%0A%0A"></embed>
  1. <form-validation>   <!--以下是配置一些常用的验证规则 -->
  2. <formset>
  3. <form name="regActionForm">
  4. <!--表单名,为验证哪个表单而配置,这里的name指定struts中form-bean的别名 -->
  5. <field property="username" depends="required">
  6. <arg0 key="tip.username"/>
  7. </field>         arg0指要为该规则传入的第一个参数
  8. <!--property为表单中的属性,depends为要验证的规则key为消息资料文件中的配置键 -->
  9. <!-- 验证密码最小长度不小于8位 要一个控件属性验证两个规则的话真正以逗号分开, -->
  10. <field property="userpass" depends="required,minlength">
  11. <arg0 key="tip.userpass"/>
  12. <arg1 key="${var:minlength}" name="minlength" resource="false"/>
  13. <var>
  14. <var-name>minlength</var-name>
  15. <var-value>8</var-value>
  16. </var>
  17. </field>
  18. <!--绿色的为变量名,好像定义也有规则,必须是那样而resource 则是配置是否从资源文件中查找key -->
  19. <field property="email" depends="required,email">
  20. <arg0 key="tip.email"/>
  21. </field>
  22. <!-- 验证年龄在一定范围之内 -->
  23. <field property="age" depends="required,intRange">
  24. <arg0 key="tip.age"/>
  25. <arg1 key="${var:min}" name="intRange" resource="false"/>
  26. <arg2 key="${var:max}" name="intRange" resource="false"/>
  27. <var>
  28. <var-name>min</var-name>
  29. <var-value>1</var-value>
  30. </var>
  31. <var>
  32. <var-name>max</var-name>
  33. <var-value>100</var-value>
  34. </var>
  35. </field>
  36. </form>
  37. </formset>
  38. </form-validation>
<form-validation>   <!--以下是配置一些常用的验证规则 --><formset>
<form name="regActionForm">
<!--表单名,为验证哪个表单而配置,这里的name指定struts中form-bean的别名 --><field property="username" depends="required"> <arg0 key="tip.username"/> </field>         arg0指要为该规则传入的第一个参数
<!--property为表单中的属性,depends为要验证的规则key为消息资料文件中的配置键 -->
<!-- 验证密码最小长度不小于8位 要一个控件属性验证两个规则的话真正以逗号分开, --> <field property="userpass" depends="required,minlength"> <arg0 key="tip.userpass"/> <arg1 key="${var:minlength}" name="minlength" resource="false"/> <var> <var-name>minlength</var-name> <var-value>8</var-value> </var> </field> <!--绿色的为变量名,好像定义也有规则,必须是那样而resource 则是配置是否从资源文件中查找key --><field property="email" depends="required,email"> <arg0 key="tip.email"/> </field> <!-- 验证年龄在一定范围之内 --><field property="age" depends="required,intRange"> <arg0 key="tip.age"/> <arg1 key="${var:min}" name="intRange" resource="false"/> <arg2 key="${var:max}" name="intRange" resource="false"/> <var> <var-name>min</var-name> <var-value>1</var-value> </var> <var> <var-name>max</var-name> <var-value>100</var-value> </var> </field> </form> </formset>
</form-validation> 

4、编写消息资源文件

验证规则的配置文件中所用key的名字为该资源文件所配置

Python代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%23%20errors.required%3D%7B0%7D%E4%B8%8D%E8%83%BD%E4%B8%BA%E7%A9%BA.%20%0A%23%20tip.username%3D%E7%94%A8%E6%88%B7%E5%90%8D%20%0A%23%20tip.userpass%3D%E5%AF%86%E7%A0%81%20%0A%23%20errors.minlength%3D%7B0%7D%E4%B8%8D%E8%83%BD%E5%B0%91%E4%BA%8E%7B1%7D%E4%B8%AA%E5%AD%97%E7%AC%A6.%20%0A%23%20errors.email%3D%7B0%7D%20%E6%A0%BC%E5%BC%8F%E4%B8%8D%E5%90%88%E6%B3%95.%20%0A%23%20tip.email%3D%E9%82%AE%E7%AE%B1%20%0A%23%20tip.age%3D%E5%B9%B4%E9%BE%84%20%0A%23%20errors.range%3D%7B0%7D%20%E5%BF%85%E9%A1%BB%E5%9C%A8%20%7B1%7D%20-%20%7B2%7D%20%E4%B9%8B%E9%97%B4.%20%0A%0Aerrors.required%3D%7B0%7D%5Cu4e0d%5Cu80fd%5Cu4e3a%5Cu7a7a.%20%0Atip.username%3D%5Cu7528%5Cu6237%5Cu540d%20%0Atip.userpass%3D%5Cu5bc6%5Cu7801%20%0Aerrors.minlength%3D%7B0%7D%5Cu4e0d%5Cu80fd%5Cu5c11%5Cu4e8e%7B1%7D%5Cu4e2a%5Cu5b57%5Cu7b26.%20%0Aerrors.email%3D%7B0%7D%20%5Cu683c%5Cu5f0f%5Cu4e0d%5Cu5408%5Cu6cd5.%20%0Atip.email%3D%5Cu90ae%5Cu7bb1%20%0Atip.age%3D%5Cu5e74%5Cu9f84%20%0Aerrors.range%3D%7B0%7D%20%5Cu5fc5%5Cu987b%5Cu5728%20%7B1%7D%20-%20%7B2%7D%20%5Cu4e4b%5Cu95f4.%20%0A"></embed>
  1. # errors.required={0}不能为空.
  2. # tip.username=用户名
  3. # tip.userpass=密码
  4. # errors.minlength={0}不能少于{1}个字符.
  5. # errors.email={0} 格式不合法.
  6. # tip.email=邮箱
  7. # tip.age=年龄
  8. # errors.range={0} 必须在 {1} - {2} 之间.
  9. errors.required={0}\u4e0d\u80fd\u4e3a\u7a7a.
  10. tip.username=\u7528\u6237\u540d
  11. tip.userpass=\u5bc6\u7801
  12. errors.minlength={0}\u4e0d\u80fd\u5c11\u4e8e{1}\u4e2a\u5b57\u7b26.
  13. errors.email={0} \u683c\u5f0f\u4e0d\u5408\u6cd5.
  14. tip.email=\u90ae\u7bb1
  15. tip.age=\u5e74\u9f84
  16. errors.range={0} \u5fc5\u987b\u5728 {1} - {2} \u4e4b\u95f4.
# errors.required={0}不能为空.
# tip.username=用户名
# tip.userpass=密码
# errors.minlength={0}不能少于{1}个字符.
# errors.email={0} 格式不合法.
# tip.email=邮箱
# tip.age=年龄
# errors.range={0} 必须在 {1} - {2} 之间. errors.required={0}\u4e0d\u80fd\u4e3a\u7a7a.
tip.username=\u7528\u6237\u540d
tip.userpass=\u5bc6\u7801
errors.minlength={0}\u4e0d\u80fd\u5c11\u4e8e{1}\u4e2a\u5b57\u7b26.
errors.email={0} \u683c\u5f0f\u4e0d\u5408\u6cd5.
tip.email=\u90ae\u7bb1
tip.age=\u5e74\u9f84
errors.range={0} \u5fc5\u987b\u5728 {1} - {2} \u4e4b\u95f4.

5.在struts-config.xml中配置Action验证失败跳转页面,属性为input指向的地方

二、手工验证;
1、用户名、密码不能为空;
2、密码长度不能小于8位;

(1)验证代码写在哪儿?
ActionForm的validate()方法中,如果该方法返回的ActionErrors中没有包含错误消息,认为验证通过。

(2)错误集合存在哪儿?
由 RequestProcessor 将错误集合存储在 Request 中,键名为
Globas.ERROR_KEY;

(3)如何显示错误消息?

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Chtml%3Aerrors%2F%3E%20%3C!--%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89%E6%B6%88%E6%81%AF%20--%3E%0A%3Chtml%3Aerrors%20property%3D%22xx%22%2F%3E%20%3C!--%E6%98%BE%E7%A4%BA%E6%8C%87%E5%AE%9A%E7%9A%84%E6%B6%88%E6%81%AF--%3E"></embed>
  1. <html:errors/> <!--显示所有消息 -->
  2. <html:errors property="xx"/> <!--显示指定的消息-->
<html:errors/> <!--显示所有消息 -->
<html:errors property="xx"/> <!--显示指定的消息-->

三、生成JavaScript
(1)ActionForm继承 org.apache.struts.validator.ValidatorForm;
(2)ActionForm中无 validate() 方法;
(3)表单JSP页中加:
<html:form .... οnsubmit="return validateRegForm(this);">颜色字体一致,首字母大写
<html:javascript formName="regForm"/>
(4)在validation.xml中配置验证规则;

另外再说一个不怎么常用的标签,它的作用一般就是方便表单Bean对象的重复代码

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3C%25%40%20taglib%20uri%3D%22%2FWEB-INF%2Fstruts-nested.tld%22%20prefix%3D%22nested%22%20%25%3E%20%0A%3Ch1%3E%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%3C%2Fh1%3E%20%0A%3Chtml%3Aform%20action%3D%22reg.do%22%20method%3D%22post%22%3E%20%0A%20%20%3Cnested%3Anest%20property%3D%22user%22%3E%20%20%20%0A%20%20%20%20%E7%94%A8%E6%88%B7%E5%90%8D%3A%3Cnested%3Atext%20property%3D%22username%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%20%20%E5%AF%86%E7%A0%81%3A%3Cnested%3Atext%20property%3D%22userpass%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%3C%2Fnested%3Anest%3E%20%0A%20%20%3Chtml%3Asubmit%20value%3D%22%E6%8F%90%E4%BA%A4%22%2F%3E%20%0A%3C%2Fhtml%3Aform%3E%20%0A"></embed>
  1. <%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>
  2. <h1>用户注册</h1>
  3. <html:form action="reg.do" method="post">
  4. <nested:nest property="user">
  5. 用户名:<nested:text property="username"/><br/>
  6. 密码:<nested:text property="userpass"/><br/>
  7. </nested:nest>
  8. <html:submit value="提交"/>
  9. </html:form>
<%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>
<h1>用户注册</h1>
<html:form action="reg.do" method="post"> <nested:nest property="user">   用户名:<nested:text property="username"/><br/> 密码:<nested:text property="userpass"/><br/> </nested:nest> <html:submit value="提交"/>
</html:form>

要使用该配置,在ActionForm中要实例化一个user对象才可以通过以上配置使用对象中username的属性

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Chr%3E%20%0A%3Ch1%3E%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%3C%2Fh1%3E%20%0A%3Chtml%3Aform%20action%3D%22reg.do%22%20method%3D%22post%22%3E%20%0A%20%20%20%20%E7%94%A8%E6%88%B7%E5%90%8D%3A%3Chtml%3Atext%20property%3D%22user.username%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%20%20%E5%AF%86%E7%A0%81%3A%3Chtml%3Atext%20property%3D%22user.userpass%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%3Chtml%3Asubmit%20value%3D%22%E6%8F%90%E4%BA%A4%22%2F%3E%20%0A%3C%2Fhtml%3Aform%3E%20"></embed>
  1. <hr>
  2. <h1>用户注册</h1>
  3. <html:form action="reg.do" method="post">
  4. 用户名:<html:text property="user.username"/><br/>
  5. 密码:<html:text property="user.userpass"/><br/>
  6. <html:submit value="提交"/>
  7. </html:form>
<hr>
<h1>用户注册</h1>
<html:form action="reg.do" method="post"> 用户名:<html:text property="user.username"/><br/> 密码:<html:text property="user.userpass"/><br/> <html:submit value="提交"/>
</html:form> 

上面的代码也可以实现刚才的功能,但是在验证框架中就不能那么使用了

Tiles标签

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Ctiles%3Ainsert%20page%3D%22header.jsp%22%20flush%3D%22true%22%2F%3E%3C!--%E6%A0%87%E5%A4%B4%E5%86%85%E5%AE%B9%20--%3E"></embed>
  1. <tiles:insert page="header.jsp" flush="true"/><!--标头内容 -->
<tiles:insert page="header.jsp" flush="true"/><!--标头内容 -->

作用与嵌套网页,可以定制好一个模板,然后在模板中使用相应的可编辑内容

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Ch1%3Et1.jsp%3C%2Fh1%3E%20%0A111111111111111%20%0A%3Chr%3E%20%0A%3C!--page%E8%A1%A8%E7%A4%BA%E6%89%80%E8%A6%81%E6%8F%92%E5%85%A5%E7%9A%84%E7%BD%91%E9%A1%B5%EF%BC%8Cflush%E6%98%AF%E5%90%A6%E5%8F%8A%E6%97%B6%E6%9B%B4%E6%96%B0%20--%3E%0A%3Ctiles%3Ainsert%20page%3D%22footer.jsp%22%20flush%3D%22true%22%2F%3E%3C!--%E6%9C%AB%E5%B0%BE%E5%86%85%E5%AE%B9%20--%3E"></embed>
  1. <h1>t1.jsp</h1>
  2. 111111111111111
  3. <hr>
  4. <!--page表示所要插入的网页,flush是否及时更新 -->
  5. <tiles:insert page="footer.jsp" flush="true"/><!--末尾内容 -->
<h1>t1.jsp</h1>
111111111111111
<hr>
<!--page表示所要插入的网页,flush是否及时更新 -->
<tiles:insert page="footer.jsp" flush="true"/><!--末尾内容 -->

第二种情况是以一个定制了的模板生成个新的网页

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Ctiles%3Ainsert%20attribute%3D%22header%22%2F%3E%20%0A%3Ctiles%3Ainsert%20attribute%3D%22footer%22%2F%3E%20%0A%0A%3Ctiles%3Ainsert%20page%3D%22template1.jsp%22%20flush%3D%22true%22%3E%20%20%20%3C!--%E5%B7%B2%E7%BB%8F%E5%AD%98%E5%9C%A8%E4%B8%80%E4%B8%AAtemplate1.jsp%E6%A8%A1%E6%9D%BF%20--%3E%0A%3Ctiles%3Aput%20name%3D%22header%22%20value%3D%22header.jsp%22%2F%3E%20%20%3C!--%E5%BE%80%E5%B1%9E%E6%80%A7header%E8%AE%BE%E7%BD%AE%E5%B5%8C%E5%85%A5%E9%A1%B5%E9%9D%A2%20--%3E%0A%3Ctiles%3Aput%20name%3D%22footer%22%20value%3D%22footer.jsp%22%2F%3E%20%20%20%20%3C!--%E5%BE%80%E5%B1%9E%E6%80%A7footer%E8%AE%BE%E7%BD%AE%E5%B5%8C%E5%85%A5%E9%A1%B5%E9%9D%A2%20--%3E%0A%3C%2Ftiles%3Ainsert%3E%20%0A"></embed>
  1. <tiles:insert attribute="header"/>
  2. <tiles:insert attribute="footer"/>
  3. <tiles:insert page="template1.jsp" flush="true">   <!--已经存在一个template1.jsp模板 -->
  4. <tiles:put name="header" value="header.jsp"/>  <!--往属性header设置嵌入页面 -->
  5. <tiles:put name="footer" value="footer.jsp"/>    <!--往属性footer设置嵌入页面 -->
  6. </tiles:insert>
<tiles:insert attribute="header"/>
<tiles:insert attribute="footer"/> <tiles:insert page="template1.jsp" flush="true">   <!--已经存在一个template1.jsp模板 -->
<tiles:put name="header" value="header.jsp"/>  <!--往属性header设置嵌入页面 -->
<tiles:put name="footer" value="footer.jsp"/>    <!--往属性footer设置嵌入页面 -->
</tiles:insert>

(1)防止重复提交;  Action
原理是通过在请求里面加入一些身份标记,在请求的时候判断是否事先存放的标记,如果不是则是第二次非正常提交

Java代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=this.saveToken(request)%3B%20%20%20%20%20%20%20%20%2F%2F%E5%9C%A8%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%82%B9%E5%87%BB%E8%AF%B7%E6%B1%82%E7%9A%84%E6%97%B6%E5%80%99%E5%AD%98%E5%85%A5%E7%84%B6%E5%90%8E%E5%AD%98%E8%BD%AC%E5%8F%91%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AAJSP%E9%A1%B5%E9%9D%A2%20%0A%2F%2F%E5%88%A4%E6%96%AD%E4%BB%A4%E7%89%8C%E6%98%AF%E5%90%A6%E6%9C%89%E6%95%88%EF%BC%9B%20%0Aif(!%20this.isTokenValid(request)%20)%7B%20%20%20%20%20%2F%2F%E5%A6%82%E6%9E%9C%E6%98%AF%E5%88%9A%E6%89%8D%E7%9A%84%E9%A1%B5%E9%9D%A2%E8%BD%AC%E5%8F%91%E8%BF%87%E6%9D%A5%E7%9A%84%E8%AF%9D%E5%88%99%E5%AE%83%E8%BF%94%E5%9B%9E%E7%9C%9F%20%0AsaveToken(request)%3B%20%0Areturn%20(%20new%20ActionForward(mapping.getInput())%20)%3B%20%20%0A%2F%2F%E8%B7%B3%E8%BD%AC%E5%88%B0Action%E9%85%8D%E7%BD%AE%E7%9A%84input%E4%B8%AD%E7%9A%84%E9%A1%B5%E9%9D%A2%20%0A%7D%20%0A%2F%2F%E6%9C%80%E5%90%8E%E6%AD%A3%E5%B8%B8%E6%89%A7%E8%A1%8C%E5%AE%8C%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E5%B0%B1%E6%8A%8A%E5%85%88%E5%89%8D%E5%AD%98%E7%9A%84Token%E5%88%A0%E9%99%A4%20%0Arequest.removeAttribute(mapping.getAttribute())%3B%20%0Athis.resetToken(request)%3B%20%0A"></embed>
  1. this.saveToken(request);        //在第一次点击请求的时候存入然后存转发到另一个JSP页面
  2. //判断令牌是否有效;
  3. if(! this.isTokenValid(request) ){     //如果是刚才的页面转发过来的话则它返回真
  4. saveToken(request);
  5. return ( new ActionForward(mapping.getInput()) );
  6. //跳转到Action配置的input中的页面
  7. }
  8. //最后正常执行完业务逻辑就把先前存的Token删除
  9. request.removeAttribute(mapping.getAttribute());
  10. this.resetToken(request);
this.saveToken(request);        //在第一次点击请求的时候存入然后存转发到另一个JSP页面
//判断令牌是否有效;
if(! this.isTokenValid(request) ){     //如果是刚才的页面转发过来的话则它返回真
saveToken(request);
return ( new ActionForward(mapping.getInput()) );
//跳转到Action配置的input中的页面
}
//最后正常执行完业务逻辑就把先前存的Token删除
request.removeAttribute(mapping.getAttribute());
this.resetToken(request);

(2)动态ActionForm(对应的JAVA类是动态产生的,JAVA类中的属性在struts-config.xml文件中动态配置)
1.配置Struts-config.xml中的 <form-bean/>,在其中声明
表单中要包含的字段元素;
----------------------------------------
例如页面上有以下一个表单 ,分别有属性username userage

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cform%20action%3D%22dynaReg.do%22%20method%3D%22post%22%3E%20%0Ausername%3A%3Cinput%20size%3D10%20name%3D%22username%22%3E%3Cbr%3E%20%0Auserage%3A%3Cinput%20size%3D10%20name%3D%22userage%22%3E%3Cbr%3E%20%0A%3Cinput%20type%3D%22submit%22%20value%3D%22%20OK%20%22%3E%20%0A%3C%2Fform%3E%20%0A"></embed>
  1. <form action="dynaReg.do" method="post">
  2. username:<input size=10 name="username"><br>
  3. userage:<input size=10 name="userage"><br>
  4. <input type="submit" value=" OK ">
  5. </form>
<form action="dynaReg.do" method="post">
username:<input size=10 name="username"><br>
userage:<input size=10 name="userage"><br>
<input type="submit" value=" OK ">
</form>

那么对应这个表单就要在Struts-config.xml中配置一个与其对应的form-bean

Xml代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cform-bean%20name%3D%22dynaRegForm%22%20dynamic%3D%22true%22%20type%3D%22org.apache.struts.action.DynaActionForm%22%3E%20%3C!--%E6%8C%87%E5%AE%9A%E8%AF%A5bean%E4%B8%BA%E5%8A%A8%E6%80%81%E7%9A%84%EF%BC%8C%E5%B9%B6%E7%B1%BB%E5%9E%8B%E6%98%AF%E8%AF%A5%E7%B1%BB%20%0A%E5%A6%82%E6%9E%9C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8A%A8%E6%80%81FORMBEAN%E4%B9%9F%E6%83%B3%E7%94%A8%E9%AA%8C%E8%AF%81%E6%A1%86%E6%9E%B6%E7%9A%84%E8%AF%9D%E8%BF%99%E9%87%8C%E7%9A%84TYPE%E5%B0%B1%E8%A6%81%E6%8C%87%E5%AE%9ADynaValidatorActionForm%20--%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%3Cform-property%20name%3D%22username%22%20type%3D%22java.lang.String%22%2F%3E%20%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%3Cform-property%20name%3D%22userage%22%20type%3D%22java.lang.Integer%22%20initial%3D%220%22%2F%3E%20%0A%3C%2Fform-bean%3E%20%0A%20%20"></embed>
  1. <form-bean name="dynaRegForm" dynamic="true" type="org.apache.struts.action.DynaActionForm"> <!--指定该bean为动态的,并类型是该类
  2. 如果使用了动态FORMBEAN也想用验证框架的话这里的TYPE就要指定DynaValidatorActionForm -->
  3. <form-property name="username" type="java.lang.String"/>
  4. <form-property name="userage" type="java.lang.Integer" initial="0"/>
  5. </form-bean>
<form-bean name="dynaRegForm" dynamic="true" type="org.apache.struts.action.DynaActionForm"> <!--指定该bean为动态的,并类型是该类
如果使用了动态FORMBEAN也想用验证框架的话这里的TYPE就要指定DynaValidatorActionForm --><form-property name="username" type="java.lang.String"/> <form-property name="userage" type="java.lang.Integer" initial="0"/>
</form-bean> 

----------------------------------------------------
2.配置Struts-config.xml中的 <action/>,将动态ActionForm
与某个Action结合起来;
只要name属性名称一致就可以了
在Action中的业务方法有些改动,因为它自动生成表单bean,所以取值的时候要像这样取,get中填写xml配置中的属性名字,把form强转换成DynaActionForm类对象,使用.get方法,返回Object,所以相应的再强转成想要的类型
String username=(String)((DynaActionForm)form).get("username");
Integer userage=(Integer)((DynaActionForm)form).get("userage");
3.客户使用表单,表单中名称与<form-bean>中声明的相同;

最后在使用完表单bean之后要删除掉刚才生成的bean;方法如下
request.removeAttribute(mapping.getAttribute());//删除FormBean

(3)DispatchAction类,可以在一个Action中编写多个业务方法;
1、编写Action,要继承DispatchAction,且无execute()方法;
2、在Action类中提供多个业务方法;
3、在表单/超链接中生成请求时,用URL: xxxxx.do?method=XX
4、使用该类,可以节省Action的个数;

测试DispatchAction类(一个Action处理多种业务):
加math.do?method=add
减math.do?method=dec
乘math.do?method=mul

在Action类中要写入相应的方法。

Java代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=public%20ActionForward%20add(ActionMapping%20mapping%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ActionForm%20form%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletRequest%20request%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletResponse%20response)%20%0A%20%20%20%20throws%20Exception%20%7B%20%0A%20%20%20%20System.out.println(%22add....%22)%3B%20%0A%20%20%20%20request.setAttribute(%20%22mathresult%22%2C%22add....%22%20)%3B%20%0A%20%20%20%20return%20mapping.findForward(%20%22success%22%20)%3B%20%0A%20%20%20%20%7D%20"></embed>
  1. public ActionForward add(ActionMapping mapping,
  2. ActionForm form,
  3. HttpServletRequest request,
  4. HttpServletResponse response)
  5. throws Exception {
  6. System.out.println("add....");
  7. request.setAttribute( "mathresult","add...." );
  8. return mapping.findForward( "success" );
  9. }
public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("add...."); request.setAttribute( "mathresult","add...." ); return mapping.findForward( "success" ); } 

其他几个以此类推。。。。。。。。。。。。

(4)一个表单实现多种业务(计算器)----LookupDispatchAction;
LookupDispatchAction(一个表单对应多个处理方法):

1、编写Action,继承LookupDispatchAction类;
2、重写LookupDispatchAction类的getKeyMethodMap(),在该方法内对提交按钮文字“键名”和“业务方法名”进行映射;

Java代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=protected%20Map%20getKeyMethodMap()%7B%20%0AMap%20map%3Dnew%20HashMap()%3B%20%0Amap.put(%22%E9%A1%B5%E9%9D%A2%E6%98%BE%E7%A4%BA%E7%9A%84%E6%8C%89%E9%92%AE%22%2C%22%E6%9C%AC%E7%B1%BB%E4%B8%AD%E7%9A%84%E4%B8%9A%E5%8A%A1%E6%96%B9%E6%B3%95%E5%90%8D%22)%3B%20%0Amap.put(%22button.add%20%22%2C%22add%22)%3B%20%0Areturn%20map%3B%20%0A%7D%20"></embed>
  1. protected Map getKeyMethodMap(){
  2. Map map=new HashMap();
  3. map.put("页面显示的按钮","本类中的业务方法名");
  4. map.put("button.add ","add");
  5. return map;
  6. }
protected Map getKeyMethodMap(){
Map map=new HashMap();
map.put("页面显示的按钮","本类中的业务方法名");
map.put("button.add ","add");
return map;
} 

3、编写业务方法;

Java代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%2F%2Fadd%20%0A%20%20%20%20public%20ActionForward%20add(ActionMapping%20mapping%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ActionForm%20form%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletRequest%20request%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletResponse%20response)%20%0A%20%20%20%20throws%20Exception%20%0A%20%20%20%20%7B%20%0A%0A%20%20%20%20%20%20%20%20int%20num1%20%3D%20((Math2Form)%20form).getNum1()%3B%20%0A%20%20%20%20%20%20%20%20int%20num2%20%3D%20((Math2Form)%20form).getNum2()%3B%20%0Arequest.setAttribute(%20%22math2Result%22%2C%20%22%22%2B(num1%2Bnum2)%20)%3B%20%0A%20%20%20%20%20%20%20%20request.removeAttribute(mapping.getAttribute())%3B%20%0A%20%20%20%20%20%20%20%20return%20(mapping.findForward(%22success%22))%3B%20%0A%20%20%20%20%7D%20"></embed>
  1. //add
  2. public ActionForward add(ActionMapping mapping,
  3. ActionForm form,
  4. HttpServletRequest request,
  5. HttpServletResponse response)
  6. throws Exception
  7. {
  8. int num1 = ((Math2Form) form).getNum1();
  9. int num2 = ((Math2Form) form).getNum2();
  10. request.setAttribute( "math2Result"""+(num1+num2) );
  11. request.removeAttribute(mapping.getAttribute());
  12. return (mapping.findForward("success"));
  13. }
//add public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { int num1 = ((Math2Form) form).getNum1(); int num2 = ((Math2Form) form).getNum2();
request.setAttribute( "math2Result", ""+(num1+num2) ); request.removeAttribute(mapping.getAttribute()); return (mapping.findForward("success")); } 

4、表单中的提交按钮中,显示文字时使用

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cbean%3Amessage%20key%3D%22xxx%22%2F%3E"></embed>
  1. <bean:message key="xxx"/>
<bean:message key="xxx"/>

5、使用该类,可以出现许多避免重复性表单;(如下为前台表单显示的内容)

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Chtml%3Asubmit%20property%3D%22action%22%3E%20%0A%3Cbean%3Amessage%20key%3D%22button.add%22%2F%3E%20%0A%3C%2Fhtml%3Asubmit%3E%20%0A"></embed>
  1. <html:submit property="action">
  2. <bean:message key="button.add"/>
  3. </html:submit>
<html:submit property="action">
<bean:message key="button.add"/>
</html:submit>

(5)ForwardAction

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Caction%20%20%20%20%0Apath%20%3D%20%22%2Fjsp1%22%20%0Atype%20%3D%20%22org.apache.struts.actions.ForwardAction%22%20%0Aparameter%20%3D%22%2Fjsp1.jsp%22%20%0A%2F%3E%20%0A%0A%3Caction%20%20%20%20%0Apath%20%3D%20%22%2Fjsp1%22%20%0Aforward%3D%22%2Fjsp1.jsp%22%20%0A%2F%3E%20%0A"></embed>
  1. <action
  2. path = "/jsp1"
  3. type = "org.apache.struts.actions.ForwardAction"
  4. parameter ="/jsp1.jsp"
  5. />
  6. <action
  7. path = "/jsp1"
  8. forward="/jsp1.jsp"
  9. />
<action
path = "/jsp1"
type = "org.apache.struts.actions.ForwardAction"
parameter ="/jsp1.jsp"
/> <action
path = "/jsp1"
forward="/jsp1.jsp"
/>

Struts验证框架与一些技巧相关推荐

  1. struts验证框架失效

    今天在练习struts2框架时,因为只是在初步的学习,使用验证框架时总是没起到预期的作用,控制台报告错误是 java.io.FileNotFoundException:http://www.opens ...

  2. Struts 验证框架实现步骤

    1 FormAction应该为 import org.apache.struts.validator.ValidatorForm; public class LoginForm extends Val ...

  3. JS验证框架的使用方法

    今天着重介绍的是JS验证框架在Java Web项目中的应用, JSValidation要去http://cosoft.org.cn/projects/jsvalidation中下载最新版本. JSVa ...

  4. Struts+DAO框架搭建完成!(源码)

    今天做了这个Struts+DAO框架,可以说是又向SSH迈了一步.   做的过程中又发现了一些问题,但是在我和其他人的努力下一起解决了.这个问题是MyEclipse的Tomcat的启动问题.(已经解决 ...

  5. [JavaWeb基础] 015.Struts2 表单验证框架

    在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...

  6. Struts2(十二)使用验证框架验证数据较验

    一.数据验证 1.1.为什么要进行数据验证 对数据的合法性进行检查,只允许合法的数据进入应用程序 1.2.在哪里实现数据验证 客户端验证: 数据提交前在客户端验证 可使用JavaScript或者JQu ...

  7. struts2 验证框架DTD检校修改

    最近在struts2的验证框架部分知识的学习中,在编写xml验证配置时遇见了这样的一个问题 在上面的xml文件中,大家可以清楚的看到在第4行存在一个警告: 阅读很轻易找到警告原因. 经过一番资料查找发 ...

  8. Validator验证框架

     5.4  Validator验证框架 Struts1.1及以上版本,在提供了动态ActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架. ...

  9. Struts 2框架结构图

    网址:http://struts.apache.org/development/2.x/docs/the-struts-2-request-flow.html 核心控制器FilterDispatche ...

最新文章

  1. 不用高温也能搓出一颗玻璃球?Science最新研究让低温注塑玻璃成为可能
  2. OGG重复记录导致复制进程挂起
  3. 类的无参方法和Doc注释
  4. 基于JavaSpringMVC+Mybatis+Jquery高校毕业设计管理系统设计和实现
  5. appbarlayout 折叠后 不允许滑动_还在纠结要不要建阳光房?看看可折叠阳光房,或许你就能做选择了...
  6. Python 函数 -next()
  7. Mongodb亿级数据量的性能测试比较完整收藏一下
  8. 定制简单的404和403页面
  9. 利用Bootstrap Paginator插件和KnockoutJS完成分页功能
  10. Asp.Net MVC Web应用程序中的安全向量
  11. WINDOWS蓝屏照片
  12. 【JY】精彩仿真书籍推荐与投票~
  13. Admob激励视频广告(rewarded ad)的服务器端验证(server-side )的疑问
  14. Hadoop完全分布式搭建全过程
  15. MPB:南农韦中组-​根际细菌群落资源利用网络的研究方法
  16. EXCEL VBA 使用正则表达式清洗替换数据
  17. G - Gluttonous Goop
  18. MySQL快速生成大量测试数据(100万、1000万、1亿)
  19. N3-PEG3-NH2,Azide-PEG3-Amino,134179-38-7,叠氮-三聚乙二醇-氨基
  20. 「史上最全的 TCG 规范解读」TCG 工作组规范预览

热门文章

  1. Protel 2004 的PCB中整体修改元件的技巧
  2. maple 假设_maple 教程
  3. Java11 主要新特性
  4. Python——输出大写英文字母
  5. python数据类型的转换
  6. mysql InnoDB存储引擎的介绍
  7. linux 移除用户所在的组,Linux用户及用户组添加和删除操作
  8. js 事件(绑定、解绑、三个阶段、相关方法)
  9. 什么是特征点、特征描述、特征匹配
  10. ubuntu 终端常用命令大全