1.OGNL通过索引访问ValueStack中的对象。
[0].name
[1].name
上面使用的索引的方式并不是直接取得指定元素,而是从指定索引开始向下搜索。
访问ValueStack里的属性:${bar}
2.OGNL对非根对象属性的访问前要加#号
#foo.blash
Struts2的命名对象,他们与根对象无关,只是存在于Stack Context中,所以访问他们时需要使用#前缀来指明:
parameters对象:#parameters['foo'] 或 #parameters.foo
request对象:#request['foo'] 或 #request.foo
session对象:#session['foo'] 或 #session.foo
application对象
attr对象:按PageContext,request.session.ServletContext的顺序寻找对象
3.OGNL集合操作
生成List集合:{e1,e2,e2 ...}
生成Map集合:#{key1:value1,key2:value2 ...}
in 与 notin:
<s:if text="'foo' in {'foo','bar'}">...</s:if>
<s:if text="'foo' notin {'foo','bar'}">...</s:if>
获取集合子集:
person.relatives.{? #this.gender == 'male'} (问号可以替换为:^,$)
集合后紧跟.{}元素运算符用于取出集合的子集,而#this代表集合里的元素
4.如果为<s:iterator .../>标签指定status属性,即每次迭代时都会有一个IteratorStatus实例,该实例包含以下方法:getCount(),getIndex(),isEven(),isOdd(),isFirst(),isLast()
在OGNL表达式中可以通过 #st.odd, #st.count来访问,st为IteratorStatus的实例
5.使用iterator迭代Map对象:
<s:iterator value="集合对象" status="st">
<s:property value="key"/><s:property value="value">
</s:iterator>
6.使用append标签将多个集合拼接成一个新集合,然后使用iterator进行迭代
<s:append id="newList">
<s:param value="集合1"/>
<s:param value="集合2"/>
</s:append>
<s:iterator value="#newList">...</s:iterator>
7.generator标签:分割字符串,生成的集合存放在ValueStack栈顶,在标签体中使用iterator迭代,不使用values属性(默认迭代ValueStack栈顶集合),标签结束,此集合即被删除。如果指定了此标签的id,则将临时生成的集合放置到pageContext属性中
<s:generator val="字符串">
<s:iterator status="st">
<s:property/> 个人理解:每次迭代都会把迭代元素放到ValueStack栈顶,使用完后即删除,<s:property/>默认去栈顶元素,去完删除,然后迭代下一个
</s:iterator>
</s:generator>
8.做XXBean对象的编辑时,如医生编译,可以实例化一个医生对象,并设置相关属性,并将这个bean push到ValueStack中,跳转到相关页面。
9.struts2 token防止重复提交的原理:
首先,jsp页面在每次加载的时候都会生成一个新GUID,这个id会分别存放到页面隐藏域和Session中,当页面提交的时候,拦截器将对页面隐藏域中的id与session中的id进行对比,如果相同,则删除session中的id(等待再次请求页面时的再次创建),继续执行,完成后面的操作。但如果此时请求失败,用history.back(-1)返回时,页面中的id与session中已经不相同,再次提交就会出现重复提交的问题。这和F5刷新的道理一样,session中id被删除后,刷新页面,提交上来的id还是原来的id,而session中此时已没有id,判断提交失败!这才是token解决重复提交问题的原理。
10.struts2中ActionContext内置对象的作用(他们都是Map类型的集合):
parameters 包含当前Http请求参数的Map,也包含通过<s:param>标签传进的参数
#parameters.id[0]=request.getParameter("id")
request 包含当前HttpServletReqeust的属性(attribute)的Map
#reqeust.username=request.getAttribute("username");
session 包含当前HttpSession的属性的Map
#session.username=session.getAttribute("username");
application 包含当前ServletContext的属性的Map
#application.username=application.getAttribute("username");
attr 用于按request->session->application顺序访问其属性
11.在action中需要真正使用request,session,application对象是,action要实现ServletRequestAware, SessionAware, ServletContextAware接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述