EL表达式+jstl核心库+测试JSTL格式库+自定义 JSTL 函数标签库

EL表达式:

1、 普通字符串
<%=request.getAttribute(“hello”)%>
结果:直接输出hello world

2、 采用“ . ”进行导航,也称存取器
姓名:$ {user.username }
年龄:$ {user.age }
所属组:${user.group.name }
结果:输出属性名对应的属性值(EL表达式特性)

3、 输出map
${mapvalue.key1 }
结果:从map中拿到key为key1的属性值

4、 输出数组
${str[1] }
结果:取出属性名为str,数组下标为1的数组元素

5、 输出对象数组,采用[]和下标
${usersArray[2].username }
结果:输出数组中第二个元素的username属性值

6、 输出list,采用[]和下标
${userlist[4].username }
结果:输出集合中第四个username的属性值

7、 el表达式对运算符的支持
${1+2 }
${10/0 }<! – 发现异常,转换成实型运算 -->
${10 div 5 }
${10 % 3 }
${10 mod 3 }
${abcd+ 3 }
结果:输出结果与正常四则运算无异,而且EL表达式会自动处理异常

8、 测试empty
${empty value1 }
${empty value2 }
${empty value3 }
${empty value4 }
${!empty value4 }
结果:从scop中取出属性名为value1的值,如果为空输出true。不为空,则为false

测试类:

public class JstlElAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		// 普通字符串
		request.setAttribute("hello", "hello world");

		// 结构
		Group group = new Group();
		group.setName("zte");

		User user = new User();
		user.setUsername("张三");
		user.setAge(18);
		user.setGroup(group);

		request.setAttribute("user", user);

		// map
		Map mapValue = new HashMap();
		mapValue.put("key1", "value1");
		mapValue.put("key2", "value2");

		request.setAttribute("mapvalue", mapValue);

		// 字符串数组
		String[] strArray = null;

		strArray = new String[] { "a", "b", "c" };
		request.setAttribute("str", strArray);

		User[] users = new User[10];
		for (int i = 0; i < 10; i++) {
			User u = new User();
			u.setUsername("U_" + i);
			users[i] = u;
		}
		request.setAttribute("usersArray", users);

		List userList = new ArrayList();
		for (int i = 0; i < 10; i++) {
			User uu = new User();
			uu.setUsername("UU_" + i);
			userList.add(uu);
		}
		request.setAttribute("userlist", userList);

		// empty
		request.setAttribute("abcd", 6);
		request.setAttribute("value1", null);
		request.setAttribute("value2", "");
		request.setAttribute("value3", new ArrayList());
		request.setAttribute("value4", "123456");
		return mapping.findForward("success");
	}
}

**

• JSTL_ 标签库

**
一、 配置
将jstl.jar和standard.jar拷贝到WEB-INF/lib下
二、 导入
在jsp页面中采用taglib指令引入标签
例:
库核心标签库指令引入: <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
格式化标签库指令引入: <%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>

**

测试jstl核心库(见代码注释)

**
1、 直接输出(测试c:out)

	hello(default):<c:out value="hello"/><br><!-- 直接输出hello -->
	hello(default):<c:out value="${hello}"/><br><!-- jstl标签一定要接EL表达式 -->
	hello(el表达式):${hello }<br>	
    hello(default="123"):<c:out value="${abcd}" default="123" /><br><!-- 如果没有找到abcd的值,用默认值替代 -->
	hello(default="123"):<c:out value="${abcd}">123</c:out><br><!-- 输出了123 -->
	bj(defalut):<c:out value="${bj}"/><br><!-- 不解析html标签 -->
	bj(escapeXml="true"):<c:out value="${bj}" escapeXml="true"/><br><!-- 控制浏览器解析 -->
	bj(escapeXml="false"):<c:out value="${bj}" escapeXml="false"/><br><!-- 控制浏览器不解析 -->
	bj(el表达式):${bj }<br><!-- EL表达式会解析html标签 -->

2、 改变内置对象属性值(测试c:set和c:remove)

<c:set value="123" var="temp"/><!-- 直接往内置对象设值(这里默认page,可以换成scop=request) -->
	temp:${temp }<br>
	<c:remove var="temp"/><!-- 从内置对象中移除属性名为temp的值 -->
	temp:${temp }<br>

3、 条件判断标签(测试条件控制标签c:if)

 <c:if test="$ {v1 lt v2}" var="v"><! -- 从scop中取出v1,v2。比较V1<V2。(这里为true)-->
		v1小于v2<br>v=$ {v }<br>
	</c:if>
	<c:if test="$ {empty v3}"var="v"><! -- 判断属性名为V3的值是否为空 -->
		v3为空<br>v=$ {v }<br>
	</c:if>
	<c:if test="$ {empty v4}">
		v4为空<br>
	</c:if>
	<c:if test="$ {empty v5}">
		v5为空<br>
	</c:if>

(将结果赋给var,结果为真则执行其后语句,否则不执行)

4、 条件控制标签(测试条件控制标签c:choose,c:when,c:otherwise)

<c:choose>
		<c:when test="${v1 lt v2}"><!-- 如果V1<v2 -->
			v1小于v2<br>
		</c:when>
		<c:otherwise>
			v1大于v2<br>
		</c:otherwise>
	</c:choose>
	<c:choose>
		<c:when test="${empty v4}">
			v4为空<br>
		</c:when>
		<c:otherwise>
			v4不为空<br>
		</c:otherwise>
	</c:choose>

注意:c:when,c:otherwise必须定义在choose中。
结果:根据结果选择输出when语句或者otherwise语句

5、循环控制标签c:forEach

<table border="1">
		<tr>
			<td>姓名</td>
			<td>年龄</td>
			<td>所属组</td>
		</tr>
		<c:choose>
			<c:when test="${empty userlist}">
				<tr>
					<td colspan="3">没有符合条件的数据!</td>
				</tr>
			</c:when>
			<c:otherwise>
				<c:forEach items="${userlist}" var="u">
					<tr>
						<td>${u.username }</td>
						<td>${u.age }</td>
						<td>${u.group.name }</td>
					</tr>
				</c:forEach>
			</c:otherwise>
		</c:choose>
	</table>	

注:这里先判断集合是否为空,不为空则用标签遍历所有属性到var对象“u”,之后用EL表达式输出“u”中属性名对应属性。

6、 循环控制标签c:forEach,varstatus

<table border="1">
		<tr>
			<td>姓名</td>
			<td>年龄</td>
			<td>所属组</td>
		</tr>
		<c:choose>
			<c:when test="${empty userlist}">
				<tr>
					<td colspan="3">没有符合条件的数据!</td>
			</tr>
			</c:when>
			<c:otherwise>
				<c:forEach items="${userlist}" var="user" varStatus="vs">
					<c:choose>
						<c:when test="${vs.count % 2 == 0}">
							<tr bgcolor="red">
						</c:when>
						<c:otherwise>
							<tr>
						</c:otherwise>
		            </c:choose>
								<td>
									<c:out value="${user.username}"/>
								</td>
								<td>
									<c:out value="${user.age}"/>
								</td>
								<td>
									<c:out value="${user.group.name}"/>
								</td>
   </tr>		   
			</c:forEach>
			</c:otherwise>
		</c:choose>
	</table>

Varstatus:可以对特定的值进行输出控制,例子表明偶数用红色显示

7、 循环控制标签c:forEach,begin,end,step

<table border="1">
		<tr>
			<td>姓名</td>
			<td>年龄</td>
			<td>所属组</td>
		</tr>
		<c:choose>
			<c:when test="${empty userlist}">
				<tr>
					<td colspan="3">没有符合条件的数据!</td>
				</tr>
			</c:when>
			<c:otherwise>
				<c:forEach items="${userlist}" var="user" begin="2" end="8" step="2">
					<tr>
						<td>${user.username}</td>
						<td>${user.age}</td>
						<td>${user.group.name }</td>
					</tr>
				</c:forEach>
			</c:otherwise>
		</c:choose>
	</table>	

注:设定循环的起点begin,终点end,以及每次循环的间隔step(不设定默认为1)

8、循环控制标签c:forEach

<c:forEach begin="1" end="10">
		  ${hello} <br>
	</c:forEach>

结果:输出10个值

9、 循环控制标签c:forEach,输出map

     <c:forEach  items="$ {mapvalue}" var="v">
    		$ {v.key }=$ {v.value }<br>
    	</c:forEach>

注:将map对象赋给var,拿到map集合的entry,输出指定key的value

测试JSTL格式库

1、测试日期的格式化

	${today}<br><!-- 输出日期 -->
	today(default):<fmt:formatDate value="${today}"/><br>
	today(type="date"):<fmt:formatDate value="${today}" type="date"/><br>
	today(type="time"):<fmt:formatDate value="${today}" type="time"/><br>
	today(type="both"):<fmt:formatDate value="${today}" type="both"/><br>
	today(dateStyle="short"):<fmt:formatDate value="${today}" dateStyle="short"/><br>
	today(dateStyle="medium"):<fmt:formatDate value="${today}" dateStyle="medium"/><br>
	today(dateStyle="long"):<fmt:formatDate value="${today}" dateStyle="long"/><br>
	today(dateStyle="full"):<fmt:formatDate value="${today}" dateStyle="full"/><br>
	today(pattern="yyyy/MM/dd HH:mm:ss"):<fmt:formatDate value="${today}" pattern="yyyy/MM/dd HH:mm:ss"/><br><!-- 直接定义格式 -->
	today(pattern="yyyy/MM/dd HH:mm:ss"):<fmt:formatDate value="${today}" pattern="yyyy/MM/dd HH:mm:ss" var="d"/><br>
	.......${d }<br格式化value的值必><!-- 加了var则输出var才输出值 -->

2、测试数字的格式化

	${n}<br><!-- 123456.123 -->
	n(default):<fmt:formatNumber value="${n}"/><br><!-- 默认分位 -->
	n(pattern="###,###.##"):<fmt:formatNumber value="${n}" pattern="###,###.##"/><br><!-- 定义格式 -->
	n(pattern="###,###.0000"):<fmt:formatNumber value="${n}" pattern="###,###.0000"/><br><!-- 小鼠不足部分用0补齐 -->
	n(groupingUsed="false"):<fmt:formatNumber value="${n}" groupingUsed="false"/><br> <!-- 默认不分位 -->
	n(minIntegerDigits="10"):<fmt:formatNumber value="${n}" minIntegerDigits="10"/><br><!-- 最小整数为10位 -->
	n(type="currency"):<fmt:formatNumber value="${n}" type="currency"/><br><!-- 以美元开头输出 -->
	n(type="currency"):<fmt:formatNumber value="${n}" type="currency" currencySymbol="¥"/><br><!-- 以人民币符号开头输出 -->
	n(type="percent"):<fmt:formatNumber value="${p}" type="percent"/><br><!-- 以百分号输出,默认输出 -->
	n(type="percent"):<fmt:formatNumber value="${p}" type="percent" maxFractionDigits="2" minFractionDigits="2"/><br>

自定义 JSTL 函数标签库

第一步:自定义一个public类和static方法

public class MyFunctions {
	/**
	 * 方法必须是public static
	 * @param name
	 * @return
	 */
	public static String sayHello(String name) {
		return "Hello " + name;
	}
}

第二步:写一个标签库描述符(tld)文件,在 tld 文件中把标签处理器描述成一个标签 ;

<?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">
    
  <description>my functions library</description>
  <display-name>my functions</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>my</short-name><!-- 随便写 -->
  <uri>http://www.zte.com/functions</uri><!-- 你的方法所在,通过它找tld -->
  
  <function>
    <name>say</name><!-- 标签名 -->
    <function-class>com.bjsxt.struts.MyFunctions</function-class><!-- 调用该方法的类(包名+类名) -->
    <function-signature>java.lang.String sayHello(java.lang.String)</function-signature><!-- 真正的函数名 -->
  </function>
  
</taglib>

第三步:编写一个JSP实现Tag接口

<?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">
    
  <description>my functions library</description>
  <display-name>my functions</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>my</short-name><!-- 随便写 -->
  <uri>http://www.zte.com/functions</uri><!-- 你的方法所在,通过它找tld -->
  
  <function>
    <name>say</name><!-- 标签名 -->
    <function-class>com.bjsxt.struts.MyFunctions</function-class><!-- 调用该方法的类(包名+类名) -->
    <function-signature>java.lang.String sayHello(java.lang.String)</function-signature><!-- 真正的函数名 -->
  </function>
  
</taglib>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值