1.什麼是OGNL
OGNL是Object Graphic Navigation Language(對象圖導航語言)的縮寫,它是一個單獨的開源項目。 Struts2框架使用OGNL作爲默認的表達式語言。
2.OGNL功能
前提: OGNL是struts2整合的一個開源項目,所以在struts2中,要想使用OGNL表達式,必須使用Struts2標籤庫
2.1 OGNL方法的調用
jsp界面引用
<%@ taglib uri="/struts-tags" prefix="s" %>```
body中
<%--OGNL表達式:它可以訪問普通方法
OGNL表達式必須寫在struts2的標籤中
s:property它就類似於jsp的表達式,把值輸出到瀏覽器上
value屬性中的內容不再是我們看到的字符串,它是一個OGNL表達式。必須知道
如果想讓他變成一個普通的字符串,在值外面套上單引號
--%>
<s:property value="OGNL-Expression"/> 這是一個OGNL表達式<br/>
<s:property value="'OGNL-Expression'"/>這是一個普通的字符串<br/>
<s:property value="'OGNL-Expression'.length()"/>使用普通字符串調用了獲取長度的方法
<hr/>
<%--OGNL訪問靜態屬性:
訪問靜態屬性的方式:@全類名@靜態屬性名稱
--%>
<s:property value="@java.lang.Integer@MAX_VALUE" /><br/>
<%--OGNL訪問靜態方法:
訪問靜態方法的方式:@全類名@靜態方法名
struts2的框架默認是禁用靜態方法調用的。我們可以通過配置開啓。
struts.ognl.allowStaticMethodAccess=false把它改爲true
--%>
<s:property value="@java.lang.Math@random()" />
<hr/>
<%--OGNL操作map和List --%>
<%-- 使用的是s:radio的標籤,創建list集合
{}就相當於創建了一個list集合
list屬性中的取值是一個OGNL表達式
--%>
<s:radio name="gender" list="{'男','女'}"></s:radio><br/>
<%--使用s:radio創建一個map
#{}表示創建一個map
1和0作爲value給raido標籤的value屬性賦值
男和女作爲key,顯示到頁面的內容
--%>
<s:radio name="gender1" list="#{'1':'男','0':'女'}" />
當訪問靜態方法時,需要在struts.xml中進行配置
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
3.EL表達式的自定義方法
1 編寫一個普通類,提供一個實現功能的靜態方法
package jxust.simon.web.function;
public class MyFunction {
public static String toUpperCase(String str){
return str.toUpperCase();
}
}
2 在WEB-INF目錄中創建一個擴展名爲.tld的xml文件.文件不能放在classes和lib目錄中
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version><!-- 指定標籤庫或方法庫版本號 -->
<short-name>myfn</short-name><!-- 使用的短名稱。對應的是taglib指令中的prefix -->
<!-- uri:把當前的方法庫綁定到一個uri地址上,在該網址上不一定存在方法庫 -->
<uri>http://www.baidu.com/functions/myfunction</uri>
<function><!-- 自定義方法 -->
<name>touppoercase</name><!-- 方法的名稱,是jsp頁面上使用的名稱 -->
<!-- 指定執行的類 -->
<function-class>jxust.simon.web.function.MyFunction</function-class>
<!-- 指定執行的方法。方法名稱必須和類中的方法名稱保持一致
注意:當方法有參數和返回值時:參數和返回值必須寫類全名(除了基本數據類型)
-->
<function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>
</function>
</taglib>
3 在jsp頁面中使用taglib指令引入外部的標籤庫/方法庫
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.baidu.com/functions/myfunction" prefix="myfn" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ONGL-Expression</title>
</head>
<body>
<%--EL表達式 --%>
afghdsf轉成大寫<br/>
${myfn:touppoercase("afhdsf")}<br>
</body>
</html>