struts的OGNL
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,
它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库
OGNL相当 于EL表示式,从作用域取数据
s:property类型于JSP的表达式,把value的值直接输出到页面
jsp表达式:【<jsp:setProperty property="" name=""/>】
value的值就是一个OGNL表达式,它不是一个字符串
如果想把value的值当字符串输出,加单引号即可
OGNL的功能
访问对象方法
比如字符串的length方法
访问静态属性
访问静态方法
默认OGNL是禁止静态方法访问的,在default.properties中有个struts.ognl.allowStaticMethodAccess=false,如想使用,需要在struts.xml文件中配置允许访问静态方法
封装list数据
封装Map数据
struts.xml中写OGNL
前面的文件下载就是一个OGNL表达式
可以修改为利用OGNL表达式进行转码
contextMap
动作类的生命周期
明确:
动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。
与Struts1的区别是,struts1的动作类是单例的
请求数据的存放
明确:
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
这两个对象存储了整个动作访问期间用到的数据。
并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。
contextMap 存储数据
Struts2的官方文档对contextMap的说明
注意:
除了value stack之外,全是map,而contextMap也是一个map。
其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
使用s:debug查看contextMap的数据
测试存储数据
contextMap中的数据操作
存数据
利用ActionContext存数据
利用ValueStack存数据
掌握三种获取ValueStack的方法
取数据
用Struts2的标签(OGNL表达式)在JSP上(用的最多)
使用s:property取数据
取contextMap里面ValueStack中对象的属性:直接写属性名
取contextMap中的数据,需使用#
如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置
在JSP页面取值时,通过索引取
特殊说明:当s:property不给定value属性时,默认取栈顶对象
valueStack的其它方法
setValue方法
set方法
掌握压栈的顺序问题
findValue方法
在jsp页面上的调用的都是findValue方法
Struts中对EL取值顺序的改变
默认情况下EL查找顺序
表达式取值必须是servlet四大作用域 由小到大排列为
pageContext【page】 > request > session > servletContext【application】
在Struts中EL表达式的查找顺序的改变
OGNL表达式:page –> request -> valueStack(根中)-> contextMap -> session -> application
Struts标签与OGNL的配合使用
iterator标签
Action
jsp
OGNL投影(了解)
使用过滤条件投影
使用指定属性投影
Struts2中#,$,%符号的使用(重要)
#
取contextMap中key时使用,例如<s:property value="#name" />
OGNL中创建Map对象时使用,例如:<s:radio list="#{'male':'男','female':'女'}" />
%
在struts2中,有些标签的value属性取值就是一个OGNL表达式,例如<s:property value="OGNL Expression" />
还有一部分标签,value属性的取值就是普通字 符串,例如<s:textfield value="username"/>,如果想把一个普通的字符串强制看成时OGNL,就需要使用%{}把字符串套起来。
例如<s:textfield value="%{username}"/>
当然在<s:property value="%{OGNL Expression}" />也可以使用,但不会这么用
Struts的其它标签
s:set标签
s:action标签
s:if标签,s:elseif标签 s:else标签
相当于jstl中的c:choose c:wher c:otherwise
s:url和s:a标签
struts2中默认主题
默认主题的名称是XHTML,都是在struts的默认属性文件中定义着:default.properties
更改默认的主题方式
第一:在标签内加theme属性
第二:配置全局的theme
防止表单重复提交(拦截器)
Servelt的表单重复提交的一种解决方案:session存验证码
比如在登录时,可以通过验证码存在session中来解决
login.jsp
ValidateCodeServlet
LoginServlet
Struts的表单重复提交解决方案
使用重定向
使用<s:token/>生成令牌配合token拦截器
UserAction
jsp
Struts.xml
此种解决方式不太符合逻辑,它是产生了错误之后再告知用户,应该一直停留在当前界面
使用<s:token/>生成令牌配合tokensession拦截器