柏杨在形容中国人不团结,喜欢窝里斗用了这样的话:每一个中国人都是一条龙,但是三个中国人加在一起──三条龙加在一起,就成了一条猪、一条虫,甚至连虫都不如--《丑陋的中国人》。可是他老人家走得走,要是能多有半个月的阳寿,不知作有何感想。
1. <s:optiontransferselect.../> 正是考虑到通常使用而新加的用于创建两个下拉框,可以来回移动列表项。有属性设置是否显示 "选定左移"、"全部左移"、"选定右移"、"全部右移" 按钮以及各按钮上的文本,其他的 list/listKey/listValue/doubleList/doubleKey/doubleValue 等属性同 <s:doubleselect.../> 的是一样的。还可设置 allowUpDownOnLeft/allowUpDownOnRight 是否出现相应框的上下移动选择的按钮(true/false)。
2. <s:radio.../> 的用法与 <s:checkboxlist.../> 完全一样,只页面表现不一样,一个多选,一个单选。
3. <s:optgroup.../> 要放在 <s:select.../> 中使用,选项分组,属性有 list/listKey/listValue,不再说明它们的意义了,参考前篇笔记对 <s:checkboxlist.../> 对应属性的描述,它生成 html 的 <optgroup> 标签。
4. <s:token/> 生成如下的内容:(struts.token.name 标识哪个隐藏域存了 token 值)
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="7GXL55LPSGU19SDC9D3VP54I20XT3BVA"/>
注意自定义的表单域别重名了。它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,不然后台会出现错误提示:
2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token' with value '[Ljava.lang.String;@1c2e163'
2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token.name' with value '[Ljava.lang.String;@abaf8c'
但不影响使用。不过如果只有 token-session 拦截器却是不行的。
token 和 token-session 拦截器的启用,是在 struts.xml 配置文件中,既可以为包启用,也可以单独为某个 action 启用:
1) 为包启用 token 和 token-session
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<package name="TestStruts" extends="struts-default"> <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="token"/> <interceptor-ref name="token-session"/> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack" /> <action name="Login" class="com.unmi.struts2.action.LoginAction"> <result name="input">/login.jsp</result> <result name="invalid.token">/exception.jsp</result> </action> ............................................................................ |
2) 为 Action 启用 token 和 token-session
1 2 3 4 5 6 7 |
<action name="Login" class="com.unmi.struts2.action.LoginAction"> <interceptor-ref name="token" /> <interceptor-ref name="token-session" /> <interceptor-ref name="defaultStack" /> <result name="input">/login.jsp</result> <result name="invalid.token">/exception.jsp</result> </action> |
注意 token、token-session 和 defaultStack 的顺序要保证,还需要加上名为 "invalid.token" 的 result,当发现重复提交时转向到这个逻辑页,如 /exception.jsp,在 /exception.jsp 加上 <s:actionerror /> 在出现重复提交时就会提示:The form has already been processed or no token was supplied, please try again.
5. 熟悉了 <s:optiontransferselect.../> 的话,<s:updownselect.../> 就很简单了,它不过就是能让选项上下移动的下拉框,可控制上移、下移、全选按钮是否显示及其文本。emptyOption="true" 能会列表框加一个空选项。6. 除前面的外还有一些非表单标签。<s:a.../> 生成一个超链接,<s:div.../> 生成一个 div 片段。
7. <s:actionerror/> 在 Action 实例的 getActionErrors() 返回不为 null 时输出该方法返回的系列错误。<s:actionmessage/> 在 Action 实例的 getActionMessages() 返回不为 null 时输出该方法返回的系列消息。在 Action 中可用 addActionError("错误"); addActionMessage("消息"); 加入错误或消息,或是捕获了重复提交是会执行 addActionError()。<s:fielderror/> 默认列表显示所有的类型转换错误或校验错误,如果用
8. <s:fielderror><s:param>username</s:param></s:fielderror> 则只显示对 username 输入框的转换或校验错误,用于 simple 主题,跟在每个输入框后只显示相应一条错误是很有用。
9. <s:component.../> 用于直接取用 ftl/jsp/vm 模板,theme/templateDir/template 分别指定主题、主题目录、主题名。用嵌套的 <s:param name="paramName" value="paramValue"/> 设置参数值,然后在模板中能用 $parameters.paramName 或 $parameters['paramName'] 取到这个值。例如 index.jsp 文件中:
1 2 3 4 |
<s:component theme="customTheme" templateDir="customTemplateDir" template="jspCustomTemplate.jsp"> <s:param name="list" value="{'one','two','three'}"/> </s:component> |
就会取用模板 web 目录/customTemplateDir/customTheme/jspCustomTemplate.jsp 文件,其他 ftl 和 vm 类似。jspCustomTemplate.jsp 的内容如下:
1 2 3 4 5 6 7 |
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <div style="background-color:#eeeeee;"> <b>JSP自定义模板<br> <s:select list="parameters.list"/> </div> |
这样在浏览 index.jsp 时会显示出一个下拉框来,<s:component.../> 对于相似内容的显示很有用处的。
10. <s:tree.../> 和 <s:treenode.../> 初步,先看一个例子:
1 2 3 4 5 6 7 8 |
<s:tree theme="ajax" label="中国" showGrid="true"> <s:treenode theme="ajax" label="江西"> <s:treenode theme="ajax" label="吉安"></s:treenode> </s:treenode> <s:treenode theme="ajax" label="广东"> <s:treenode theme="ajax" label="深圳"></s:treenode> </s:treenode> </s:tree> |
tree 和 treenode 有点像 menu 和 menuitem,但是 tree 下是 treenode,treenode 下不能有 tree,只要 treenode 下又有 treenode 则表示它为树枝节点,否则为叶子节点。因为默认主题 xhtml 下没有 tree-close.ftl 和 treenode-close.ftl 模板,所以必须为 tree 和 treenode 指定 ajax 主题,不然就会出问题。<s:tree.../> 还有更多的控制属性,如展开或收缩时图片,网格图片、nodeIdProperty、nodeTitleProperty 属性等,用到时再细究。
本文链接 https://yanbin.blog/unmi-study-struts2-13/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。