OGNL表达式详解
1,OGNL:Object Graph Navigation Language
2,OGNL不仅可以调用属性,还可以调用普通方法
<s:propertyvalue='"abcdefg".toCharArray()[0]'/><br/> <s:propertyvalue="#context['com.opensymphony.xwork2.ActionContext.locale']"/> <s:propertyvalue="11111111111111111H"/><br/> |
3:OGNL获取属性等
<% request.setAttribute("str"new"a","b","c"}); %> <s:debug></s:debug> <s:propertyvalue="#request.str.length"/><br/> <s:propertyvalue="#request.str['length']"/><br/> <s:propertyvalue="#request.str['len'+'gth']"/><br/> |
4.1链式表达式(Chained Subexpressions):
<s:propertyvalue="110H.intValue().(#this<112?#this*2:#this/2)"/><br/> |
*4.2访问静态资源:
取得静态常量,用@进行间隔,加小括号表示静态方法,不加小括号就是代表取get方法
<s:propertyvalue="@java.lang.Integer@MAX_VALUE"/><br/> <s:propertyvalue="@java.lang.System@currentTimeMillis()"/><hr/> |
*4.3集合对象的操作
创建集合并迭代:
a、表达式:{'a','b','c'}用于创建List集合
<s:iteratorvalue="{'a','b','c'}"> <s:property/><br/> </s:iterator> <s:propertyvalue="{'a','b','c'}.class"/><br/> |
b、表达式:#{'a':'aa','b':'bb','c':'cc'}用于创建Map集合
<s:iteratorvalue="#{'a':'aa','b':'bb'}"> <s:propertyvalue="key"/>:<s:propertyvalue="value"/><br/> </s:iterator> |
c、in表达式:注意复杂程度
选项有eat,sleep,study,key包含(in表达式)其中的sleep,study。
<s:iteratorvalue="#{'eat':'吃饭','sleep':'睡觉','study':'学习'}"> <inputtype="checkbox"name="hobby"<s:propertyvalue=/>value="${key}"/>${value} </s:iterator><br/> |
4.4投影查询:Projecting Across Collections PPT第27页
${name}=<s:propertyvalue="name"/><br/> <s:propertyvalue="{5,3,2,0}.{#this*2}"/> <s:propertyvalue="{5,3,2,0}.{?#this*2}"/> <s:propertyvalue="{5,3,2,0}.{^#this*2}"/> <s:propertyvalue="{5,3,2,0}.{$#this*2}"/><br/> |
5:类型的转换
<s:property value=”(5).{#this*2}”/>--->[0, 2, 4, 6, 8]
<s:propertyvalue="(5).{#this*2}"/><br/> |
<s:property value=”#{'name':'wzt','age':30,'gender':'male'}.{#key}”/>发现什么都没有输出
<s:property value="#{'name':'wzt','age':30,'gender':'male'}.{#this}"/>有输出。把Map转为了Value
<s:propertyvalue="#{'name':'wzt','age':30,'gender':'male'}.{#this}"/><br/> <s:propertyvalue=/> |
ONGL国际化
2.1JSP
2.1
2.2struts.xml
<constantname="struts.custom.i18n.resources"value="com.itheima.resources.msg"></constant> |
2.3JSP”key”/>
<s:textname="hello"></s:text><br/> <s:propertyvalue="getText('hello')"/><br/> <s:textname="hello1"></s:text><br/> |
3.1JSP
动作类名_zh_CN.properties
注意:如果动作类没有继承ActionSupportActionSupport
TextProvidergetTextActionSupportgetText
4.1JSP
5.1Guides-->Localization的说明
V2.1.8..\struts-2.1.8.1\docs\docs\localization.html
V2.3.14..\Users\wzhting\Desktop\struts-2.3.14.2\docs\WW\localization.html
包级别的资源包(在动作类继承actionsupport)
action动作消息资源包优先级最高
package消息资源包级别优先级次之
(package无论在哪里,优先级仍旧是次之)
全局优先级最低
原理:
a先自己的包,再找所有的父类的,一层层往上找
例如如下,就找到Int1的资源包

b找所有的包中,包级别的资源包
c找全局的资源文件
d打印本身(在这个列子里打印Hello1)
动作属性的设置
1、演示给动作类的属性赋值的三种方式(在执行动作的时候,会把当前这个动作类压入栈顶)
2.1在动作类中直接给字段赋初始值,并提供getter和setter方法。
privatename"fengjie"; |
2.2(静态参数值)在struts.xml
<actionname="test1"class="com.itheima.action.HelloAction1"method="test1"> <paramname="name">任敏</param> <result>/1.jsp</result> </action> |
2.3(动态参数值)在请求动作时以get方式传递参数name=什么,就显示什么

动作属性的设置,2.1 2.2 2.3 优先级逐步增高,就是说2.3动态参数值优先级最高。
Tips:
静态参数值的获取是由staticParams拦截器实现的。
动态参数值的获取是由params拦截器实现的。
动态参数值优先值最高,因为先进行静态拦截staticParams拦截器实现,再进行动态拦截params拦截器实现,动态拦截把静态覆盖了
中文也支持,因为struts的编码常量设置默认为UTF-8
2、查阅staticParams和params拦截器的源代码帮助理解


用户注册案例
1、先分析页面的请求再下手做。由动作开始。
2、编写配置文件(user.xml,包含到struts.xml中),动作类,JSP页面(使用UI标签)
<constantname="struts.ui.theme"value="xhtml"></constant> <packagename="p1"namespace="/user"extends="struts-default"> <actionname="RegUserUI"class="com.itheima.action.UserAction"method="RegUserUI"> <resulttype="dispatcher"name="success">/WEB-INF/pages/regist.jsp</result> </action> <actionname="RegUser"class="com.itheima.action.UserAction"method="RegUser"> <resulttype="dispatcher"name="success">/WEB-INF/pages/main.jsp</result> <resulttype="dispatcher"name="error">/WEB-INF/pages/commons/error.jsp</result> </action> </package> |
写一个User的JavaBean,有username,nick和password三个变量
写动作类UserAction,继承ActionSupport。
publicclassextends privateusernew public out.println("getUser"); returnuser; publicvoid out.println("setUser"); this.user public returnSUCCESS; public try{ out.println(user); //调用service,保存数据 out.println("调用后台service,保存数据到数据库中"); returnSUCCESS; catch returnERROR; } |
写一个注册页面regist.jsp(注意name应该为user.nick这个格式)
注意,在第一个form表单中,submit不要加 name=”submit“ 因为动作类里面没有getsubmit,后台会报错.(struts-2.3.15.1已解决这个问题);
使用OGNL表达式后,只需要写action=”RegUser“就可以了。会自动得到访问地址。
此时action里面的RegUser根据struts里的常量值来,例如设置为do,那这个值自动在后面加do
不需要加冒号,会自己加,如果没有label,那么key就会使用国际化的资源包,如果有label,那么就使用label的值
<s:formaction="RegUser"namespace="/user"> <s:textfieldkey="hello"label="用户名"name="user.username"></s:textfield> <s:textfieldlabel="昵称"name="user.nick"></s:textfield> <s:passwordlabel="密码"name="user.password"></s:password> <s:submitvalue="注册"></s:submit> </s:form> |
建立index.jsp(注意要设置escapeAmp="false",否则&会转义)
要使用s:a不要使用html的<a>好处是:动作的扩展名不定;支持中文参数值URL编码
还有一个s:url是同理的,功能类似JSTL中的c:url
s:param的value属性是一个OGNL表达式,因此字符串直接量要使用value=”'你好'”
注意,这里的地址会被重写,防止用户禁用cookie;
<s:anamespace="/user"action="RegUserUI"escapeAmp="false">注册 <s:paramname="p1">p1value</s:param> <s:paramname="p2">你好</s:param> </s:a><br/> <s:urlaction="RegUserUI"namespace="/user"var="url"escapeAmp="false"> <s:paramname="p1">p1value</s:param> <s:paramname="p2">你好</s:param> </s:url> <ahref="${url}">注册</a> |
技巧:如果不确定是不是OGNL表达式,那么加上%{abc},那么abc就是一个OGNL表达式而不是字符串了
其实就是一个拦截器
其实实现了ModelDriven接口的时,会调用getModel()方法,并把该方法返回的对象压入栈顶。是modelDriven拦截器干的。
所以必须先实例化User这个类,否则压入栈顶的时候会空指针,user必须先new出来。可以把User这个类的get和set方法删掉,因为ModelDriver这个类已经把这个实例压入栈顶了。
publicclassextendsimplements privateusernew public returnuser; privatehobbiesnew public hobbies.put("eat""吃饭"); hobbies.put("sleep""睡觉"); hobbies.put("study""ѧjava"); returnhobbies; publicvoid this.hobbies public returnSUCCESS; public try out.println(user); out.println("调用后台service,保存数据到数据库中"); returnSUCCESS; catch returnERROR; } |
写jsp页面(注意用iterator标签和checkboxlist标签都能达到一样的效果)
<s:formaction="RegUser"namespace="/user"> <s:textfieldkey="hello"label="用户名"name="username"></s:textfield> <s:textfieldlabel="昵称"name="nick"></s:textfield> <s:passwordlabel="密码"name="password"></s:password> <s:iteratorvalue="hobbies"var="me"> <s:checkboxname="hobby"fieldValue="%{key}"label="%{value}"></s:checkbox> </s:iterator> <hr/> <s:checkboxlistlist="hobbies"name="hobby"listKey="key"listValue="value"label="新爱好"></s:checkboxlist> <s:radiolist="#{'male':'男','female':'女'}name="gender"label="性别"></s:radio> <s:submitvalue="注册"></s:submit> </s:form> |
控制逻辑的value,90%都是OGNL表达式。而UI标签里面的东西,90%都不是OGNL表达式。
文章来源: Struts2学习-3 : OGNL表达式详解