Struts2之OGNL使用小结

OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。
1、“#”符号有三种用途:    
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();如:#parameters,#request,#session,#application,#attr
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}  
(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}
2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。很有点类似javascript里面的eval_r()功能。如果有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。
3、“$”有两种用途    
(1)、在国际化资源文件中,引用OGNL表达式。    

(2)、在Struts 2配置文件中,引用OGNL表达式。

Sample.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>OGNL例子</title>
<style>
.block1 {
	border: 1px dashed #c76c3e;
	width: 500px;
	padding: 5px;
	margin-top: 3px;
}
</style>
</head>
<body>
	Array:
	<div class="block1">
		<b>sampleArray :</b>
		<s:property value="sampleArray" />
		<br> <b>sampleArray.length :</b>
		<s:property value="sampleArray.length" />
		<br> <b>sampleArray[0] :</b>
		<s:property value="sampleArray[0]" />
		<br> <b>[0].sampleArray :</b>
		<s:property value="[0].sampleArray" />
		<br> <b>top.sampleArray :</b>
		<s:property value="top.sampleArray" />
	</div>

	List:
	<div class="block1">
		<b>sampleList :</b>
		<s:property value="sampleList" />
		<br> <b>sampleList.size :</b>
		<s:property value="sampleList.size" />
		<br> <b>sampleList[0] :</b>
		<s:property value="sampleList[0]" />
	</div>

	Map:
	<div class="block1">
		<b>sampleMap[1] :</b>
		<s:property value="sampleMap[1]" />
		<br> <b>sampleMap.size :</b>
		<s:property value="sampleMap.size" />
		<br>
		<s:select list="#{'make1':'Ford', 'make2':'Honda', 'make3':'Toyota'}"
			name="carMake" label="Select "></s:select>
		<br> <b>sexMap[11] :</b>
		<s:property value="sexMap[11]" />
		<br> <b>sexMap[RY] :</b>
		<s:property value="sexMap['RY']" />
		<br> <b>URL:</b>
		<s:url value="%{sexMap['RY']}" />
		<br> <b>%:</b>%{sexMap['RY']} <br> <b>EL:</b>${sexMap['RY']}
	</div>

	Self Class:
	<div class="block1">
		<b>电子邮件EL:</b>${user.email} <br> <b>电子邮件:</b>
		<s:property value="user.email" />
		<br> <b>quote :</b>
		<s:property value="quote" />
	</div>


	#访问非根对象(struts中值栈为根对象):
	<div class="block1">
		curUserId:
		<s:property value="#parameters['curUserId']" />
		<br> quote:
		<s:property value="#parameters['quote']" />
	</div>

	#用于过滤和投影(projecting)集合:
	<div style="width: 100%; overflow: scroll; border: 1px solid;">
		<table border="1" style="width: 100%">
			<caption>用户列表</caption>
			<tr>
				<td />
				<td>编号</td>
				<td>名称</td>
				<td>电话号码</td>
				<td>邮箱</td>
				<td style="width: 100px">出生日期</td>
				<td>性别</td>
				<td>性别2</td>
			</tr>

			<s:iterator value="users.{?#this.userId>1}" status="st" id="user">
				<tr <s:if test="#st.odd">style="background-color:#cccccc" </s:if>>
					<td><s:radio name="uradio" list="{#user.userId}"
							theme="simple" listValue="''" /></td>
					<td><s:property value="#user.userId" /></td>
					<td><s:property value="#user.name" /></td>
					<td><s:property value="#user.phoneNumber" /></td>
					<td><s:property value="#user.email" /></td>
					<td><s:property value="#user.birthday" /></td>
					<td><s:select value="#user.gender"
							list="#{'':'', '00':'女', '11':'男'}" theme="simple"
							disabled="true" /></td>
					<td><s:property value="sexMap[#user.gender]" /></td>
				</tr>
			</s:iterator>
		</table>
	</div>

	构造Map,"%"的作用:
	<div class="block1">
		<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}" />
		<s:property value="#myMap['key1']" />
		<s:url value="#myMap['key1']" />
		<s:url value="%{#myMap['key1']}" />
	</div>

	Others:user.serialNumber.replaceAll(' ','')
	<div class="block1">
		${user.name} <br> ${user.serialNumber} <br>
		<%=java.lang.String.format("foo %s", "bar")%>
		<br>
		<s:checkboxlist name="user.serialNumber"
			list="#{1:'value1',2:'value2',3:'value3',4:'value4'}"
			listKey="value" listValue="key" value="%{[1,3]}" />
	</div>
</body>
</html>

Struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="main" namespace="/" extends="struts-default">
		<action name="User_*" class="lian.UserAction" method="{1}">
			<result name="input">/jsp/UserEdit.jsp</result>
			<result name="list">/jsp/Users.jsp</result>
			<result name="edit">/jsp/UserEdit.jsp</result>
			<result name="ognl">/jsp/OgnlElStruts2.jsp</result>
        </action>
        
		<action name="Sample" class="lian.SampleAction">
			<result name="success">/jsp/Sample.jsp?quote=${quote}</result>
        </action>
    </package>
</struts>

SampleAction.java

package lian;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SampleAction {
	private String[] sampleArray;
	{
		sampleArray = new String[] { "item1", "item2", "item3" };
	}

	public String[] getSampleArray() {
		return sampleArray;
	}

	private List<String> sampleList = new ArrayList<String>();
	{
		sampleList.add("listItem1");
		sampleList.add("listItem2");
		sampleList.add("listItem3");
	}

	public List<String> getSampleList() {
		return sampleList;
	}

	private Map<Integer, String> sampleMap = new HashMap<Integer, String>();
	{
		sampleMap.put(new Integer(1), "one");
		sampleMap.put(new Integer(2), "two");
		sampleMap.put(new Integer(3), "three");
	}

	public Map<Integer, String> getSampleMap() {
		return sampleMap;
	}

	private Map<String, String> sexMap = new HashMap<String, String>();
	{
		sexMap.put("00", "女");
		sexMap.put("11", "男");
		sexMap.put("RY", "人妖");
	}

	public Map<String, String> getSexMap() {
		return sexMap;
	}

	private User user = new User();
	{
		user.setName("Eswar");
		user.setEmail("mulanxi@yeah.net");
		user.setSerialNumber("1,3");
	}

	public String execute() {
		users = userMgr.listAll();
		return "success";
	}

	public String getQuote() {
		return "Don't think, just do";
	}

	public User getUser() {
		return user;
	}

	private List<User> users;

	private UserMgr userMgr = new UserMgr();

	public List<User> getUsers() {
		return users;
	}
}

运行效果:http://localhost:7080/MyDynamicWeb/Sample.action?curUserId=309






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值