1.常用 常量
(1)<constant name="struts.i18n.encoding" value="UTF-8"></constant> (2)name="struts.custom.i18n.resources" value="资源文件名" (3)name="struts.devMode" value="true" 自动刷新XML文件 (4)name="struts.ui.theme" value="simple"
2.redirect重定向; dispatcher转发; chain拼接; redirectAction重定向Action;
interceptor拦截器; 继承:Interceptor 或 AbstractInterceptor (1)getProxy().getMethod()获得所拦截的方法名; invoke()放行,继续; getAction()获得被拦截的Acion (2)继承MethodFilterInterceptor抽象类,重写doIntercept方法 --拦截器方法过滤 (3)includeMethods拦截 excludeMethods不拦截 +方法名
3.标签库OGNL(一)
(1)struts访问静态方法 <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>--配置XML <s:property value="#attr.对象.普通方法('参数')"/> <s:property value="@com.web.entity.对象.静态方法('参数')"/>
(2)%{...}转义符 (3)生成集合 List: {e1,e2,e3,e...} Map : {key1:e1,key2:e2,key3:e3,.....} (4)'?','^'和'$' Session中有名称是stuList的集合,集合中有多个Stu对象.Stu类中有age属性 #session.stuList.{?#this.age>20} 取 age大于20的子集合 #session.stuList.{^#this.age>20} 取 第一个age大于20的Stu对象 #session.stuList.{$#this.age>20} 取 最后一个age大于20的Stu对象
(5)常用标签库 ①数据访问标签: action:在JSP页面直接调用一个Action executeResult属性:是否将Action的处理结果包含到当前页面,默认false即不包含 namespace属性:命名空间 include:在JSP页面中包含其他页面资源--value property:输出某个变量 set:设置新变量 text:输出国际化消息 url:生成一个URL地址 date:格式化输出日期 ②action标签 namespace:指定所调用action所在的命名空间 executeResult:是否将action的处理结果包含到当前页面中, 默认:false 不包含 ③property标签 value:要输出的 属性 或 OGNL表达式 default:当值为null时输出的内容 escape: 默认为true --正常输出 false--作为html代码输出 ④set标签: id:变量名;value:值;scope:作用域 ⑤date标签 name:日期 formate:指定日期输出格式"yyyy-MM-dd hh:mm:ss" nice:指定是否输出指定日期与当前时刻之间的时差。可以设为true或者false, 该标签默认是英语显示时间 如 10 minutes ago 可用国际化资源文件了配置为中文 ⑥逻辑控制标签 if/elseif/else generator:将一个字符串按指定分隔符拆分为一个集合 id:指定生成的集合的name,且放入pageContext count:所生成的集合中元素的总数 separator:指定分隔符 converter:转换器 将集合中的每个字符串转化为对象 iterator:迭代器 迭代输出集合 id:别名 value:被迭代的集合 status: count:返回当前迭代了几个元素 index:返回当前迭代元素在集合中的索引 even:迭代输出下标索引为 偶数 的元素 odd:下标索引为 奇数 的元素 first:当前迭代是否是第一个元素 last:当前迭代是否是最后一个元素
4.Struts2标签库(二)
(1).表单元素的name与value属性 (name映射Action的属性)name有输出的效果,无需指定value 例:<s:textfield name="person.name" value="${person.name}"/>等效于 <s:textfield name="person.name"/> (2).常用表单标签 ①.<s:form action="" namespace=""/> ②.<s:textfield/>文本框 <s:password/>密码框 <s:textarea name="" label="" cols="" rows=""/>文本区域 ③.复选框:checkboxlist <s:checkboxlist name="" label="你的爱好" list="#{'java':'JAVA','.net':'.NET','ajax':'AJAX'}" listKey="key" listValue="value"/> listKey:(用Map的key做)复选框的value listValue:(用Map的value做)复选框的文本 ④.单选按钮:radio value="按钮的值":默认选中项 ⑤.下拉列表框:select multiple="true"--多选列表框 value:指定默认选中项 (3).非表单标签(导入:struts2-dojo-plugin-2.2.1.jar) ①.tree/treenode树形标签 jsp中引入 uri="/struts-dojo-tags" <title>上面 <sdt:head parseContent="true"/>
<sdt:tree lable="" id=""> 一级
<sdt:treenode name id> 二级
<sdt:treenode name id/> 三级
<sdt:treenode name id/>
<sdt:treenode name id/>
</sdt:treenode>
</sdt:tree>
②.Datetimepicker日历标签 <sx:datetimepicker name="某个具体日期"/> displayFormat:指定日期的显示格式 displayWeeks:是否显示星期 toggleDuration:指定日期选择框出现,隐藏的时间差 toggletype: plain/wipe/explode/fade 指定出现,隐藏的方式 type: date/time 日期选择框的类型 日期选择框/时间选择框 value:指定文本框的日期,时间 today:当前时间 weekStartsOn:指定一周的第一天;0.周日; 6.周六
5.表单重复提交token
<s:token/> <s:actionerror/> 错误信息 资源文件名称自定义 内容:struts.message.invalid.token=自定义提示信息 native2Ascii命令进行转换Asii码 在XML中导入资源文件name="struts.custom.i18n.resources" value="资源文件名" 定义token拦截器<interceptor-ref name="token"/> 重复提交时转向的页面:<result name="invalid.token"/>
6.自定义类型转换器
struts2的四种主题:simple/xhtml(默认)/css_xhtml/Ajax (1)转换器类必须继承StrutsTypeConverter抽象类, 实现convertFromString()--字符串转成符合类型 与convertToString()--符合类型转为字符串 (2)局部转换器配置 名称:Action名-conversion.properties 位置:与action同一个包 内容:Action属性名=包名+转换器类名 全局转换器配置 名称:xwork-conversion.properties 位置:src根目录下 内容:Action属性所在的包名+类名=包名+转换器类名 (3)input类型转换错误信息 Action必须继承ActionSupport xml中配置input结果映射 局部错误信息: 名称:与Action 同名 位置:与Acting 同一个包 内容:invalid.fieldvalue.操作的属性名=自定义错误信息 全局错误信息: 名称:无要求 位置:src 内容:xwork.default.invalid.fieldvalue=字段{0}的值无效 在xml中引入错误信息资源文件
7.自定义数据校验
(1)Action必须继承ActionSupport (重写validate方法)this.addFieldError("被校验的属性名","错误信息");在JSP页面提示错误信息
(2)使用validateXxx()方法 (对某一个方法进行针对校验)
xxx:方法名,首字母要变大写. 例:regist方法 用validateRegist方法校验
对于方法名为doxxx的方法应去掉do后首字母大写
public class MathAction extends BaseAction{
private static final long serialVersionUID = 1L;
private Digit dig;//被除数
//数据校验
public void validateChu(){
flag="index";
if(dig.getB()==0){
this.addFieldError("dig", "被除数不能为0");
}
}
}
(3)xml中配置input结果映射
未通过校验则提示错误信息并返回input结果,终止action
8.内置校验器
(1)添加校验配置文件: 名称:Action类名-validation.xml 位置:与被校验的Action同一个包 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> ---------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="admin.aid"><!-- 被验证的属性名 --> <field-validator type="required" short-circuit="true"> <message>账号不能为空</message> </field-validator> </field> <field name="admin.pwd"><!-- 被验证的属性名 --> <field-validator type="requiredstring" short-circuit="true"> <message>密码不能为空</message> </field-validator> <field-validator type="stringlength" short-circuit="true"> <param name="maxLength">18</param> <param name="minLength">6</param> <message>密码长度应在${minLength}-${maxLength}位之间</message> </field-validator> </field> </validators>
<pre>(2)无需被校验拦截的方法 <interceptor-ref name="defaultStack"> <param name="workflow.excludeMethods">queryAllAdmin,delAdmin</param> </interceptor-ref>
<!-- 登陆方法拦截器栈 -->
<interceptors>
<interceptor name="loginInter" class="com.web.interceptor.LoginInterceptor"></interceptor>
<interceptor-stack name="loginStack">
<interceptor-ref name="loginInter">
<param name="excludeMethods">adminLogin</param><!-- 无需拦截登陆方法 -->
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>