OGNL表達式
OGNL的作用
OGNL的操作對象
ValueStack:ValueStack中默認就是Action的對象,以及Action對象中的屬性。
ActionCotnext上下文。
A:Request作用域
B:Session作用域
C:Application作用域
D:Parameter,Request的請求參數
Ognl表達式訪問或者定義不同對象時,需要用到不同的符號。
無符號
# 訪問ActionContext對象時,需要用到的符號。
{} OGNL中用於定義集合時
#{} OGNL中用於定義Map
%{} OGNL中,將字符串轉義成OGNL表達式,並輸出轉化後的結果
${} struts.xml中,獲取ValueStack裏成員變量的值。
1:OGNL表達式訪問成員變量與成員方法
public int add(int x, int y) {
System.out.println("調用到add這個成員方法");
return x + y;
}
public String accessMember() throwsException {
this.userBean = new UserBean();
this.userBean.setUserid("1");
this.userBean.setUsername("admin");
return "succ";
}
省略UserBean
Jsp:
userBean = <s:property value="userBean"/>
userid = <s:property value="userBean.userid"/>
username = <s:property value="userBean['username']"/>
username = <s:property value="userBean.getUsername()"/>
<s:property value="userBean.setUserid(222)"/>
userid = <s:property value="userBean.userid"/>
add = <s:property value="add(10,20)"/>
2:輸出靜態變量與靜態方法
public static final double PI = 3.1415;
public static String getSystemTime() {
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(date);
}
public String accessStatic() throws Exception {
return "succ";
}
調用靜態方法前提:struts.xml中開啓常量 = struts.ognl.allowStaticMethodAcces
Jsp:
PI = <s:property value="@com.action.OgnlAction@PI"/>
系統時間 = <s:property value="@com.action.OgnlAction@getSystemTime()"/>
3:輸出集合
private Map<String, Object> map;
private List<UserBean> userList;
private Set<String> strSet;
//省略set,get
public String accessCollection() throws Exception {
/**
* 集合初始化
*/
this.strSet = new LinkedHashSet<String>();
this.strSet.add("aa");
this.strSet.add("bb");
this.strSet.add("cc");
this.strSet.add("dd");
this.userList = new ArrayList<UserBean>(6);
for (int i = 1; i <= 5; i++) {
UserBean userBean = new UserBean();
userBean.setUserid(String.valueOf(i));
userBean.setUsername("用戶名_" + i);
this.userList.add(userBean);
}
this.map = new LinkedHashMap<String,Object>();
this.map.put("key_1", "value_1");
this.map.put("key_2", OgnlAction.getSystemTime());
this.map.put("key_3", this.strSet);
this.map.put("key_4", this.userList);
return "succ";
}
Jsp:
strSet = <s:property value="strSet"/>
大小Size = <s:property value="strSet.size()"/>
刪除元素= <s:property value="strSet.remove('bb')"/>
strSet = <s:property value="strSet"/>
userList = <s:property value="userList"/>
大小 = <s:property value="userList.size()"/>
第2個用戶 = <s:property value="userList.get(1)"/> username = <s:property value="userList.get(1).username"/>
刪除元素 = <s:property value="userList.remove(2)"/>
大小 = <s:property value="userList.size()"/>
map = <s:property value="map"/>
size = <s:property value="map.size()"/>
key_1 = <s:property value="map.key_1"/>
key_2 = <s:property value="map['key_2']"/>
key_3 = <s:property value="map.get('key_3')"/>
key_4 = <s:property value="map.key_4.get(1).username"/>
4:作用域與請求參數
public String accessScope() throws Exception {
this.userList = new ArrayList<UserBean>(6);
for (int i = 1; i <= 5; i++) {
UserBean userBean = new UserBean();
userBean.setUserid(String.valueOf(i));
userBean.setUsername("用戶名_" + i);
this.userList.add(userBean);
}
this.request.setAttribute("req_key", "Request作用域");
this.session.setAttribute("session_key", this.userList);
this.servletContext.setAttribute("app_key", OgnlAction.getSystemTime());
// 1:第一種:後臺轉換的解決。
// 頁面中使用param對象或者EL表達式,取出來仍然是亂碼。
// String param_b =request.getParameter("param_b");
// param_b = newString(param_b.getBytes("ISO-8859-1"), "UTF-8");
// this.request.setAttribute("param_b_xx",param_b);
// 2:第二種,改Tomcat的GET的URL編碼
// server.xml中配置。ConnectorconnectionTimeout="20000" port="8080"
// protocol="HTTP/1.1"redirectPort="8443" URIEncoding="UTF-8"
// 3:寫過濾器
return "succ";
}
Jsp:
req_key= <s:property value="#request.req_key"/> ${requestScope.req_key}
session_key = <s:property value="#session.session_key"/>
app_key = <s:property value="#application.app_key"/> ${applicationScope.app_key}
請求參數 =
param_a = <s:property value="#parameters.param_a"/> ${param.param_a}
param_b = <s:property value="#parameters.param_b"/> ${param.param_b}
param_b = <s:property value="#request.param_b_xx"/>
5:ValueStack與ActionContext
publicString accessValueStack() throwsException {
// ServletActionContext servletActionContext
ActionContext context = ActionContext.getContext();
context.put("context_key", "這是放到ActionContext中的值");
/**
* 操作ValueStack
*/
ValueStack valueStack =context.getValueStack();
/**
*setValue只能設置Action中存在的屬性的值。
*/
valueStack.setValue("xx", OgnlAction.getSystemTime());
/**
*set可以設置與增加Action中不存在的屬性的值。
*/
valueStack.set("key_1", "value_1");
valueStack.set("key_2", "value_2");
valueStack.set("xx", "這是通過Set增加的");
//valueStack.push(arg0);
return "succ";
}
context_key= <s:property value="#context_key"/>
key_1 = <s:property value="key_1"/>
key_2 = <s:property value="key_2"/>
棧頂中的xx = <s:property value="xx"/>
Action中屬性的XX = <s:property value="[1].xx"/> 通過下標的方式獲取棧中的元素。