1.什么是OGNL
OGNL:Object Graphic Navigation Language(對象圖導航語言)
它是Struts2中默認的表達式語言。使用表達式需要借助Struts2的標簽.
OGNL與EL的區別:
EL/JSTL 數學運算等等表達式: 都有一個明確的返回值,都只能取值。
OGNL表達式: 它不僅可以取值,還可以賦值(賦值操作只能由Struts來完成)
OGNL表達式的寫法: 屬性.屬性.屬性的方式 <input type="text" name="user.user"/>
OGNL表達式的基本使用:
- 使用s:property標簽輸出內容
- 訪問普通方法
- 訪問靜態方法
- 訪問靜態屬性
- 操作集合(List AND Map)
<title>Struts2OGNL表達式的基本使用</title> </head> <body> <!-- a、使用s:property標簽輸出內容:要想輸出內容到頁面得使用Struts2的標簽庫 value屬性:把value取值所對應的內容輸出到頁面 若想直接輸出文本,則需要用引號引起來。 --> 輸出基本內容:<s:property value="'OGNLExpresession'"/> <hr/> <!-- b、訪問普通方法 --> 輸出字符串的長度:<s:property value="'OGNLExpresession'.length()"/> <br/> 輸出轉大寫字符:<s:property value="'OGNLExpresession'.toUpperCase()"/> <br/> 切割字符串:<s:property value="'OGNLExpresession'.split('L')"/> <hr/> <!-- c、訪問靜態屬性 語法 : @類的全路徑@靜態字段 --> 輸出整數的最大值:<s:property value="@java.lang.Integer@MAX_VALUE"/> <hr/> <!-- d、訪問靜態方法 語法: @類的全路徑@靜態方法 注意: 使用靜態方法時,需要在struts.xml中開啟靜態方法調用的開關。 --> 輸出一個隨機數:<s:property value="@java.lang.Math@random()"/> <hr/> <!-- e、操作集合(List和Map) 語法: 聲明list集合:{"aa","bb"} 聲明map集合:#{"key":"value","key":"value"} --> 輸出html普通標簽的單選按鈕:<br/> <input type="radio" name="sex" value="男"/>男 <input type="radio" name="sex" value="女"/>女<br/> 使用Struts2標簽輸出單選按鈕:list集合方式<br/> <s:radio list="{'男','女'}" name="sex"></s:radio><br/> 使用Struts2標簽輸出單選按鈕:map方式<br/> <s:radio list="#{'男':'男','女':'女' }" name="sex"/> </body>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 使用EL表達式:<br/> ${c.username}<br/> ${requestScope.p }<br/> ${sessionScope.p }<br/> ${applicationScope.p }<br/> <hr/> 使用OGNL表達式:<br/> <!-- 如果是在action動作類中直接聲明的變量,OGNL直接取值即可。 --> <!-- 在域對象中的數據需要使用#開頭 --> <!-- 注:如果對象在action動作類中直接聲明,則取值需要使用c.username 如果對象在方法中手動添加到valueStack對象中,則取值不需要c.username,直接username即可。 --> <s:property value="c.username"/><br/> <%-- <s:property value="[1].username"/><br/> --%> <s:property value="#request.p"/><br/> <s:property value="#session.p"/><br/> <s:property value="#application.p"/><br/> <s:property value="#attr.p"/><br/> <hr/> <!-- 不寫value屬性:獲得的是棧頂數據 --> <s:property/> <s:debug/> </body> </html>
<%@page import="com.opensymphony.xwork2.util.ValueStack"%> <%@page import="com.opensymphony.xwork2.ActionContext"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 在頁面查看調試信息 --> ${ username}<br/> <s:debug/> <s:property value="username"/><br/> == vs.findValue("username"); <s:property value="[1].username"/><br/> <s:property value="#session.p"/><br/> <s:property value="#application.p"/> <hr/> <% ActionContext ac = ActionContext.getContext(); ValueStack vs = ac.getValueStack(); String name = (String)vs.findValue("username"); out.print(name); String p = (String)vs.findValue("#session.p"); out.print(p); %> </body> </html>