做过web项目的朋友肯定会遇到这样的场景,前台jsp页面录入一些的数据,然后提交到后台action进行处理,处理完之后需到跳转到另一个jsp页面,同时需要在打开的jsp页面上显示处理过的结果信息。
或者会遇到这样的情况,在一个列表上点击详细按钮,打开一个新的页面显示这条记录的详细信息。
如何将详细信息再显示到页面上呢?
以前我们之前使用的方式就是在action处理之后将结果封装到一个大对象中,然后将这个大对象通过request.setAttribute的方式添加到request请求中,然后再打开的新页面中通过request.getAttribute来得到大对象,再通过在jsp页面上插入java代码来解析这个大对象,并显示到页面上相应的域中。
还有另外的处理方法就是将后台处理后的结果封装成XML或者JSON数据通过异步方式返回到打开的页面上,最后在页面上通过js代码来解析XML或者JSON来取得相应的值然后赋给页面上的相应的域中。
由于之前使用struts2的表达式比较少最多也只是使用JSTL普通的表达式,今天偶然接触到OGNL,研究了一上午发现以前的代码完全可以通过这个表达式来实现页面的赋值,于是花了一点时间看了看OGNL的介绍和例子,总结成以下的文档。
关于OGNL的介绍大家可以随便上网找找,这里只介绍它比较重要的地方,首先是各种符号的使用:#/$/%
#可以取出堆栈上下文中的存放的对象.
名称 |
作用 |
例子 |
parameters |
包含当前HTTP请求参数的Map |
#parameters.id[0]作用相当于 request.getParameter("id") |
request |
包含当前HttpServletRequest的属性(attribute)的Map |
#request.userName相当于 request.getAttribute("userName") |
session |
包含当前HttpSession的属性(attribute)的Map |
#session.userName相当于 session.getAttribute("userName") |
application |
包含当前应用的ServletContext的属性(attribute)的Map |
#application.userName相当于 application.getAttribute("userName") |
attr |
用于按request > session > application顺序访问其属性(attribute) |
|
“$”有两个主要的用途
1、用于在国际化资源文件中,引用OGNL表达式
2、在Struts 2配置文件中,引用OGNL表达式
3、在页面上调用action中声明的属性,以及如果属性是一个对象,可以获取对象的属性
下面以一个例子来说明OGNL的使用:
一、前台请求页面[index.jsp]
<%@page contentType="text/html;charset=GBK"%> <%@ include file="/common/taglibs.jsp"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>测试</title> </head> <body> <form action="${ctx}/ognlAction.action" method="post"> <input type='text' id='name' name='name'/> <input type="submit" value="提交"/> </form> </body> </html>
二、后台action
package com.ognl.dto; public class Person{ private String name; private String age; public Person(){} public Person(String name,String age){ this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(String age) { this.age = age; } public String getAge() { return age; } }
package com.ognl.action; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.ognl.dto.OgnlDto; import com.ognl.dto.Person; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class OgnlAction extends ActionSupport{ private static final long serialVersionUID = 1L; private OgnlDto ognlDto; private String username; private List<String> list = new ArrayList<String>(); private Map<String, Person>maps; public String getOgnl(){ HttpServletRequest request = ServletActionContext.getRequest(); String name = request.getParameter("name"); System.out.println("name = "+name); ognlDto = new OgnlDto(); ognlDto.setName(name); ognlDto.setAge(20); ognlDto.setPassword("123456"); ognlDto.setSex("男"); Person person = new Person(); person.setAge("10"); person.setName("zxy"); ognlDto.setPerson(person); List<Person>persons = new ArrayList<Person>(); persons.add(new Person("wyc","28")); persons.add(new Person("zxy","29")); persons.add(new Person("baby","0")); ognlDto.setPersons(persons); this.setUsername("测试"); request.setAttribute("req", "request"); ActionContext.getContext().getApplication().put("app", "application"); ActionContext.getContext().getSession().put("sess", "session"); list.add("1"); list.add("2"); list.add("a"); maps = new HashMap<String, Person>(); maps.put("1", new Person("wyc","28")); maps.put("2", new Person("zxy","29")); maps.put("3", new Person("baby","0")); return SUCCESS; } public String test(){ return "action返回的值!"; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public void setOgnlDto(OgnlDto ognlDto) { this.ognlDto = ognlDto; } public OgnlDto getOgnlDto() { return ognlDto; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setMaps(Map<String, Person> maps) { this.maps = maps; } public Map<String, Person> getMaps() { return maps; } }
<%@page contentType="text/html;charset=GBK"%> <%@ include file="/common/taglibs.jsp"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>测试</title> </head> <body> <li>访问值栈中的action的普通属性,属性必须要有get和set方法:username = <s:property value="username" /></li> <li>访问值栈中对象的普通属性(get、set方法)ognlDto.name: <s:property value="ognlDto.name" /> | <s:property value="ognlDto['name']"/></li> <li>访问值栈中对象的普通属性(get set方法)ognlDto.person.name: <s:property value="ognlDto.person.name"/></li> <li>访问值栈中对象的普通方法:<s:property value="username.length()"/></li> <li>访问值栈中对象的普通方法:<s:property value="ognlDto.toString()" /></li> <li>访问值栈中action的普通方法:<s:property value="test()" /></li> <li>访问值栈中action的request:<s:property value="#request.req" /></li> <li>访问值栈中action的application:<s:property value="#application.app" /></li> <li>访问值栈中action的session:<s:property value="#session.sess" /></li> name:<input type="text"name="name"value="${ognlDto.name}"/> password:<input type="text"name="password"value="${ognlDto.password}"/> age:<input type="text"name="age"value="${ognlDto.age}"/> sex:<input type="text"name="sex"value="${ognlDto.sex}"/><br> 遍历action中定义的List对象,且List中存的是一个对象 <s:iterator value="ognlDto.persons"> <li><s:property value="name" /> - <s:property value="age" /></li> </s:iterator> 遍历action中定义的List对象,且List只是一个普通集合 <s:iterator value="list"> <li><s:property/></li> </s:iterator> 遍历action中定义的Map,且Map中存的是Person对象 遍历Map取出key值,可以直接通过"<s:property value="key"/>"来获取 取出value值可以直接通过<s:property value="value"/>来获取,如果value为简单对象可以直接通过<s:property value="value"/>来取得,如果value为javabean对象 则可以通过<s:property value="value.name"/>来取得 <s:iterator value="maps"> <li><s:property value="key"/>--<s:property value="value.name"/>--<s:property value="value.age"/></li> </s:iterator> <br> List对象生成复选框 <s:checkboxlist name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist><br> <s:checkboxlist name="checkbox_1" list="list" value="'a'" ></s:checkboxlist><br> List对象生成单选按钮组 <s:radio name="radiobox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="'看书'" ></s:radio><br> <s:radio name="radiobox_1" list="list" value="'a'" ></s:radio><br> List对象生成select <s:select name="selectbox1" id="selectbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'看书'}"></s:select><br> <s:select name="selectbox_1" id="selectbox_1" list="list" value="'a'"></s:select><br> Map对象生成复选框 <s:checkboxlist name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist><br> <s:checkboxlist name="checkbox_2" list="maps" listKey="key" listValue="value.name" value="{1,2}" ></s:checkboxlist><br> Map对象生成单选按钮组 <s:radio name="radiobox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" value="1"></s:radio><br> <s:radio name="radiobox_2" list="maps" listKey="key" listValue="value.name" value="1"></s:radio><br> Map对象生成select <s:select name="selectbox2" id="selectbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" value="3"></s:select><br> <s:select name="selectbox_2" id="selectbox_2" list="maps" listKey="key" listValue="value.name" value="2"></s:select><br> </body> </html>