记笔记,尤其是在 Blog 里记,实则是浪费时间。让学习、阅读的速度以数量级的下降,收获时当时掌握的更细,却并不代表着真记得牢。一小段时间不用它,同样可以忘得很干净,也就是方便于以后能由此泛起些涟漪,如能抛砖引玉就更幸运了。入正题:
1. 记得 Struts1 的 struts-config.xml 通常是放在 WEB-INF 目录下的,Struts2 的 struts.xml 却要放到 WEB-INF/classes 下的,傻眼了吧,反正我是。没看仔细之前,总给我报 There is no Action mapped for namespace / and action name Login. - [unknown location] 错误。因未在 web.xml 指定 struts.xml,所以用 ClassLoader 来加载它了。
2. 最简单的 Struts2 应用都要用到 freemarker-xxx.jar 包,因为 UI 标签要用到 FreeMarker ftl 的模板。
3. FilterDispatcher 要处理所有的 Web 请求,所以它的 url-pattern 是 /*,并自动对 *.action 转给业务 Action 处理。
4. struts.xml 中引入一个 <package> 节点来包裹 <action>,必须指定 <package> 的 name 属性,自定义命名即可,与 class 所在包无多大关系。
5. 把 ActionContext.getContext().getSession() 这个 Map 当 HttpSession 用即可,它与 HttSession 之间的转换 Struts2 的拦截器帮你完成。
6. 在 Action 接受客户端请求的数据,并且还可存放送给客户端的数据,这种做法个人觉得不怎么清爽,数据与控制器杂揉一块,也许是受 Struts1 的 ActionForm 的影响。Action 中的属性值会存放在类型为 ValueStack、名为 struts.valueStack 的属性中。
7. Struts2 的标签更是与 Struts1 的千差万别,只有 <s:xxx 的标签了,所以只需在 jsp 前加 < %@taglib prefix="s" uri="/struts-tags" % >,哪用 Struts1 那么分门别5类,但功能更强,这个吗,谁用谁知道。
8. 国际化支持要先在 struts.properties 中指定资源束名,如 struts.custom.i18n.resources=messageResource,则在 classpath 下找 messageResource_语言代码_国家代码.properties。用 <s:text name="key"> 或 <s:property value='%{getText("key")}'/> 输出国际化消息。
9. Struts2 支持在 JSP 页面中临时加载资源文件,也支持通过全局属来加载资源文件,上一条就是全局的方式。
10. Action 中增加数据校验功能,可能它继承 ActionSupport 类,并实现 validate() 方法,产生的错误放到 ActionSupport 类的 fieldErrors 域中,由 OGNL 负责输出。有错误请求将转发到 input 逻辑视图。Struts2 的 <s:form .../> 默认已提供了输出校验错误的能力。是否觉得这种校验忒不尽人情了,别急,Struts2 可让你完全用配置来校验表单的,让你的 Action 还是那个 Action (继承 ActionSupport,无须实现 validate() 方法),只需写一个 ActionName-validattion.xml 文件扔在与 Action 同位置的目录中即可,这实质就是用的基于 XWork 的验证框架。
本文链接 https://yanbin.blog/unmi-study-struts2-2/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。