1. Struts 2 标签库以 OGNL 表达式为基础对集合、对象访问功能更强了Struts 2 标签用统前缀般为 "s"不再像 Struts1 那样分 <html:.../>、<bean:.../>、<logic:.../> 等多个命名空间标签如果在 JSP 2.0 的前用过 JSTL也就知道什么是 OGNL 表达式
2. Struts2 提供了很多 Struts1 标签没有东西如日历、树型Control控件、Tab页等;同时可借助 DWR有标签支持 Ajax除此还提供了主题、模板还允许在页面中使用自定义组件Struts2 标签都定义在 URI 为 "/struts-tags" 命名空间下Struts2 标签库功能很强大使用起来却更简单
3. 同 Struts1 相比Struts2 标签库不依赖于作何表现层技术即大部分标签不光能在 JSP 中用还能在 Velocity 和 FreeMarker 等模板中用Struts1 中要支持 EL必须引入 struts-el.jar 和 JSTL 类库;而 Struts2 默认支持 OGNL、JSTL、Groovy 和 Velocity 表达式
4.Struts2 标签定义文件是在 Struts2-core-2.x.x.jar META-INF 目录中 struts-tags.tld相比 Struts1 标签定义是在 struts.jar META-INF/tld 目录下 struts-bean.tld、struts-html.tld等(Struts1 从 1.3 开始包也分成了 struts-core-1.3.x.jar 和 struts-taglib-1.3.x.jar所以 struts-bean.tld、struts-html.tld 等就在 struts-taglib-1.3.x.jar META-INF/tld 目录下)
5. Servlet 2.4 开始应用在启动时会递归搜索 path 下 tld 文件加载;Servlet 2.3 应用在启动时好像会自动搜索 WEB-INF 目录下 tld 文件加载再的前 Servlet 版本就必须在 web.xml 文件中加上 <taglib>来指定 tld
6. XWork 在原有 OGNL 基础上增加了对 ValueStack 支持Struts2 Stack Context 需要多个“根”对象其中 ValueStack 只是多个“根”对象其中的如果要访问属性属于根对象则可以直接访问该属性否则必须使用个命名空间如 #bar
ValueStack 是以属性名为 "struts.valueStack" com.opensymphony.xwork2.util.OgnlValueStack 对象存在于 request 中
7. Struts2 中系统 ValueStatck 是 OGNL 表达式第个根对象(key=com.opensymphony.xwork2.util.ValueStack.ValueStack)如果最近 Action 存在则 Action 上下文是第 2个根对象(key=com.opensymphony.xwork2.ActionContext.name只是 Action 名字而已)可以用 <s:debug/>显示出 Stack Contenxt 和Value Stack Contents
8. 标准 OGNL 表达式是:"#" 表示从根开始例如 request 是个根
<s:property value = "#request['struts.request_uri']" /> 输出当前请求 URI "struts.request_uri" 包含有 "."不然也可以用#request.xxx 形式
如果只写成属性名介绍说明是根对象 name 属性但 Struts2 会有多个根对象会不明确因此这个时候 <s:property value="${name}"/>就会访问 ValueStack 中对象属性 name-- ValueStack 是 OGNL 表达式个根对象
9. Struts2 提供了个特殊 OGNL 访问器对 ValueStack 从上至下搜索匹配例如ValueStack 中 有两个例子 Animal(name,species) 和 Login(name,salary)括号中表示所含属性如下 Action 类
public LoginActionimplements ModelDriven<Animal>{
privateAnimalanimal = Animal;
private Stringname ="Unmi";
privateString salary = "little";
public Animal getModel{
animal;
}
...............................................
}
就会在 ValueStack 中压入两个对象分别是 LoginAction 例子和animal 例子animal 在栈顶那么
<s:property value="species"/> 显示 animal species 属性
<s:property value="salary"/> 显示LoginAction 例子salary 属性
<s:property value="name"/> 显示 animal name 属性自栈顶向下先匹配到 animal name 属性
此时如果我需要获取 LoginAction 例子 name 谁能告诉我如何取如果已知 LoginAction 例子名话还能
<s:property value="?LoginAction?.name" /> 这里如何才能行得通呢?压栈也不带例子名称啊!
幸好还可以通过索引来访问 ValueStack 中对象
<s:property value="[1].name"/> 显示 LoginAction 例子 name 属性 "Unmi"这样写就会从栈第 2个位置找起首先找到就是 LoginAction 例子了
这部分还有些含混不清ValueStack 还能如何压入值
10. 最后Struts2 还在 Stack Context 中放了些命名对象parameters、request、session、application、attr 来访问对应属性如 request['name'] 或 request.name 访问请求 name 属性特别介绍说明下 attr 对象依次搜索 PageContext、HttpServletReqeust、HttpSession、ServletContext 中相应属性
最新评论