Struts2学习-3 : OGNL表达式详解

匿名 (未验证) 提交于 2019-12-03 00:26:01
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表达式。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!