一.OGNL常用符号(接上一篇文章):

1.#号

1)<s:property value="#request.username"/> 作用于struts2的域对象,而不是普通域对象

2)<s:property value="#user.username"/>作用于JavaBean对象

3)<s:property value="#username"/>作用于普通字符串,如果value只是一个字符串的话,不是JavaBean对象,可以加#,也可以不加.

4) ?#,表示所有记录

  ^#,表示第一条记录

  $#,表示最后一条记录

  {?#条件}[n],表示第n+1条记录,

例如:<s:iterator var="user" value="#attr.userList.{$#this.age>=22}">

<s:iterator var="user" value="#attr.userList.{?#this.age>=22}[1]">
取出第N个记录,N为索引号

实例:ognl_3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ page import="java.util.*"%>
<%@ page import="ognl.User"%>
<!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>
<%
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "张三", 20));
userList.add(new User(2, "李四", 25));
userList.add(new User(3, "amos", 30));
userList.add(new User(4, "hi_amos", 28));
pageContext.setAttribute("userList", userList);
%>
<hr>
<table border="1" align="center" width="50%">
<caption><font color="blue">查询大于等于25岁的所有用户,?#</font></caption>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<!-- {条件},{}中存放条件;this表示该个对象或该条数据;?表示全部符合条件的数据;^表示查询符合条件的第一个数据-->
<s:iterator var="user" value="#attr.userList.{?#this.age>=25}">
<tr>
<td><s:property value="#user.id" /></td>
<td><s:property value="#user.name" /></td>
<td><s:property value="#user.age" /></td>
</tr>
</s:iterator>
</table>
<br><hr><br>
<table border="1" align="center" width="50%">
<caption><font color="blue">查询大于等于25岁的第一个用户,^#</font></caption>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<!-- {条件},{}中存放条件;this表示该个对象或该条数据;?表示全部符合条件的数据;^表示查询符合条件的第一个数据-->
<s:iterator var="user" value="#attr.userList.{^#this.age>=25}">
<tr>
<td><s:property value="#user.id" /></td>
<td><s:property value="#user.name" /></td>
<td><s:property value="#user.age" /></td>
</tr>
</s:iterator>
</table>
<br><hr><br>
<table border="1" align="center" width="50%">
<caption><font color="blue">查询大于等于25岁的最后一个用户,$#</font></caption>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<!-- {条件},{}中存放条件;this表示该个对象或该条数据;?表示全部符合条件的数据;^表示查询符合条件的第一个数据-->
<s:iterator var="user" value="#attr.userList.{$#this.age>=25}">
<tr>
<td><s:property value="#user.id" /></td>
<td><s:property value="#user.name" /></td>
<td><s:property value="#user.age" /></td>
</tr>
</s:iterator>
</table>
<br><hr><br>
<table border="1" align="center" width="50%">
<caption><font color="blue">查询大于等于25岁的最后一个用户,{?#}[索引值]</font></caption>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<!-- {条件},{}中存放条件;this表示该个对象或该条数据;?表示全部符合条件的数据;^表示查询符合条件的第一个数据-->
<s:iterator var="user" value="#attr.userList.{?#this.age>=25}[1]">
<tr>
<td><s:property value="#user.id" /></td>
<td><s:property value="#user.name" /></td>
<td><s:property value="#user.age" /></td>
</tr>
</s:iterator>
</table>
</body>
</html>

效果如下图所示:

5)可以构造Map集合

实例:ognl_4.jsp

<%@ 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>
<!-- 能过#号构造Map集合 -->
<s:iterator var="" value="#{'male':'男','female':'女' }">
<br>
<s:property value="key"/>
:
<s:property value="value"/>
</s:iterator>
</body>
</html>

效果如下图所示:

2.%号

用法一:引用变量
<s:textfield label="%{#request.usernameTip}" name="username"/>

用法二:引用常量
<s:textfield label="%{'#request.usernameTip'}" name="username"/>

实例:ognl_5.jsp

<%@ 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>
传统:<s:textfield label="用户名" name="username"/><br><hr>
现代:<s:textfield label="%{#request.usernameTip}" name="username"/><br><hr>
现代2:<s:textfield label="%{'#request.usernameTip'}" name="username"/>
</body>
</html>

效果如下图所示:

3.$号

用法一:
>>读取xml文件中配置的变量

用法二:

>>读取Action类中的实例变量,底层执行getXxxx()方法

二.OGNL常用标签

1.property标签,用于输出指定值:

<s:property value=“#name" default="a default value" />

* default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
* escape:可选属性,指定是否格式化HTML代码。
* value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输
出ValueStack栈顶的值。

例子 :
<s:property/>:输出栈顶的值
输出: username=username_valueStack, msgxx=msg_valueStack
<s:property value="%{'<hr> hr的使用'}" escape="false" />
输出:<hr> hr的使用
注:escape=“false”时,hr作为html标签使用

实例:s_property.jsp

<%@ 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>
<%
session.setAttribute("user_name", "hi_amos");
request.setAttribute("msg", "<a href='#'>超链接</a>");
%>
<s:property value="#session.user_name" default="查无此值"/><br>
<s:property value="#attr.user_name" default="查无此值"/><br>
<s:property value="#attr.user_fname" default="查无此值"/><br>
<!-- 是否将html转义 -->
<s:property value="#attr.msg" default="查无此值" escape="true"/> <br>
<s:property value="#attr.msg" default="查无此值" escape="false"/> <br>
</body>
</html>

效果如下图所示:

2. set标签

set标签用于将某个值放入指定范围。
var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代
scope:指定变量被放置的范围,该属性可以接受application、session、request、 page。如果没有设置该属性,则默认放置在action中,即值栈。
value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。

例子:

<s:set value="#request.username" var="xxx“ scope=“request” /><br>
<s:property value=“#request.xxx" /><br>

<s:set value="#request.username" var="xxx" scope="page" /><br>
<s:property value="#attr.xxx" /><br>

<s:set value="#request.username" var="xxx" /><br>
<s:property value="xxx" /><br>

实例:

s_set.jsp

<%@ 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>
<%
request.setAttribute("username", "hi_amos");
%>
<font color="green">application、session、request、 page</font>
<br>
<s:set var="name" value="#request.username" scope="session" />
<s:property value="#session.name" />
<br>
<!-- 设置域为application -->
<s:set var="name2" value="#request.username" scope="application" />
<s:property value="#application.name2" />
<br>
<!-- 不写scope表示默认从值栈中取值的. -->
<s:set var="name3" value="#request.username" />
<s:property value="#name3" />
<br>
</body>
</html>

效果如下图所示:

 3.Iterator标签

Iterator:标签用于对集合进行迭代,这里的集合包含List、Set,Map和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
var: 可选属性,引用变量的名称.
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。

实例:

s_iterator.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ page import="java.util.*"%>
<%@ page import="ognl.*"%>
<!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>标签学习</title>
</head>
<body>
<%
List<String> usersList = new ArrayList<String>();
usersList.add("张一");
usersList.add("张二");
usersList.add("张三");
usersList.add("张四");
pageContext.setAttribute("usersList", usersList);
%>
<hr>
<table border="1" width="80%" align="center">
<tr>
<th>索引号</th>
<th>编号</th>
<th>姓名</th>
<th>是否奇数行</th>
<th>是否偶数行</th>
<th>是否第一行</th>
<th>是否最后一行</th>
<th>状态</th>
</tr>
<s:iterator var="user" value="#attr.usersList" status="userstatus">
<%-- <tr style='color:<s:property value="#userstatus.odd?'red':'blue'"/>'> --%>
<tr
style='background-color:<s:property value="#userstatus.odd?'grey':'green'"/>'>
<td><s:property value="#userstatus.index" /></td>
<td><s:property value="#userstatus.count" /></td>
<td><s:property value="#user" /></td>
<td><s:property value="#userstatus.even" /></td>
<td><s:property value="#userstatus.odd" /></td>
<td><s:property value="#userstatus.first" /></td>
<td><s:property value="#userstatus.last" /></td>
<td><s:if test="#userstatus.count==1">A</s:if> <s:elseif
test="#userstatus.count==2">B</s:elseif> <s:elseif
test="#userstatus.count==3">C</s:elseif> <s:elseif
test="#userstatus.count==4">D</s:elseif></td>
</tr>
</s:iterator>
</table>
</body>
</html>

效果如下图所示:

4.ognl操作集合

1)使用ognl操作list和数组.

Action中:
private List allList=new ArrayList();
Jsp:
集合的长度:<s:property value="allList.size"/>

ognl也可直接创建集合对象. 利用下拉列表框:

Jsp:
<s:iterator value="{1,2,3,4}">
<s:property/> <br>
</s:iterator>

<s:iterator value="{'s1','s2','s3','s4'}" var="s">
<s:property value="#s"/> <br>
</s:iterator>

实例:ognl_6.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ 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>对于集合的操作,判断是否非空,长度等</title>
</head>
<body>
<%
List<String> userList = new ArrayList<String>();
userList.add("hi");
userList.add("amos");
userList.add("li");
application.setAttribute("userList",userList);
%>
集合长度:
<s:property value="#application.userList.size" />
<br>
是否为空:
<s:property value="#application.userList.isEmpty"/>
<hr>
<s:iterator var="letters" value='{"A","V","I"}'>
<s:property value="#letters"/><br>
</s:iterator>
</body>
</html>

效果如下图所示:

2)使用ognl操作map 

ognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.
创建map与创建list语法很相似,不同的是map前需要加"#"号.

5.<s:token />标签防止重复提交

<s:token />标签防止重复提交,用法如下:
第一步:在表单中加入<s:token />,第二步,使用token栏截器

例子可以参见上篇文章.

6.使用 native2ascii 程序转换字符编码

JDK 中提供了一个 native2ascii 工具程序,它可以将某种本地字符集编码的字符转换成 Unicode 转义序列的形式
DOS 下进入 test_cn_backup.properties文件所在目录,运行下面的命令后将在当前目录下生成一个名为 test_zh_CN.properites 文件:
native2ascii -encoding gb2312 源文件 目标文件.properites
native2ascii -encoding gbk a.txt   b.properites 

效果如下图所示:

 7.本文源码

常用符号和常用标签学习

java struts2入门学习--OGNL语言常用符号和常用标签学习的更多相关文章

  1. java struts2入门学习--OGNL语言基本用法

    一.知识点学习 1.struts2中包含以下6种对象,requestMap,sessionMap,applicationMap,paramtersMap,attr,valueStack; 1)requ ...

  2. java struts2入门学习--防止表单重复提交.OGNL语言学习

    一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...

  3. java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器

    实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...

  4. Struts2入门(五)——OGNL和标签库

    一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...

  5. [java]struts2入门

    摘要 本文是struts2入门,配置教程.如何在IntelJ Idea中进行手动配置.在使用idea新建struts2web项目的时候,在下载jar包的过程中,下载失败,没办法就直接手动进行下载jar ...

  6. java struts2入门学习---常用标签学习总结

    jsp页面中引入标签: <%@ taglib uri="/struts-tags" prefix="s"%> 常用标签知识点总结: <s:fi ...

  7. java struts2入门学习--基于xml文件的声明式验证

    一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...

  8. java struts2入门学习---国际化

    一.国际化的概念 1.不同国家的人访问同一个网站,显示的语言不同. 2.对JSP页面进行国际化 属性(properties)文件命名规则:基名---语言--国家如, message_zh_CN.pro ...

  9. java struts2入门学习---拦截器学习

    一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...

随机推荐

  1. Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证

    在JavaScript前端技术大行其道的今天,我们通常只需在后台构建API提供给前端调用,并且后端仅仅设计为给前端移动App调用.用户认证是Web应用的重要组成部分,基于API的用户认证有两个最佳解决 ...

  2. Tensorflow中张量数据类型的转换

    https://blog.csdn.net/Tramac/article/details/74942587 字符串转为数字: tf.string_to_number (string_tensor, o ...

  3. Centos6.4下安装mysql5.6.10

    今天下午捣腾安装mysql和apache.从网上下载mysql5.6.10,http://ishare.iask.sina.com.cn/f/36050990.html,解压后发现没有configur ...

  4. Java-JUC(五):闭锁(CountDownLatch)

    闭锁(CountDownLatch) jdk5.0在java.util.concurrent包中提供了CountDownLatch,它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一 ...

  5. Total Commander如何设置自定义快捷键在当前目录打开ConEmu

    Total Commander,简称TC,原名Windows Commander,是Windows平台下功能最强大的全能文件管理器. 自从使用了TC基本上就很少再打开Window的文件夹了,因为TC不 ...

  6. HDU 4059 The Boss on Mars(容斥原理 + 四次方求和)

    传送门 The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. cocos2d-x3.0 XML解析

    在2dx3.0中xml解析已经不用自己找库了.已经为我们集成好了. text.xml <?xml version ="1.0" encoding ="UTF8&qu ...

  8. GitHub没有实时通知怎么办?当然是自己上手写一个啊!

    相信各位程序员对github已经不陌生了.不知道各位有没有注意到GitHub没有推送通知这个功能.当有人在我的存储库中创建了一个提取请求/问题时,我可以收到电子邮件通知,但当有人stars/forks ...

  9. linux 文件系统与磁盘修复

    fsck修复受损的文件系统   Linux不正常关机,有时候再次启动时会报文件系统损坏,如何修复文件? 首先会让你输入root用户的密码.  1)出错的时候如果告诉你是哪一块硬盘的分区有问题,比如是/ ...

  10. HDU1069(还是dp基础)

    今天不想说太多废话-由于等下要写自己主动提交机. 不知道能不能成功呢? 题目的意思就是,一个猴子,在叠砖头 ...以下的要严格大于上面的.求叠起来最高能到多少- n非常少,n^2算法毫无压力-话说dp ...