Jsp---JSTL

本文详细介绍Java标准标签库(JSTL)的核心组件及其使用方法,包括输出、条件判断、循环处理等功能,并介绍如何实现国际化(I18N)。

一.简介:

JSTL(Java Standard Tag Library) –Java标准标签库。
SUN公司制定的一套标准标签库的规范。
JSTL标签库,是由一些Java类组成的。

二.JSTL组成:

JSTL –Core 核心标签库。 - 这是本部分的重点
JSTL – I18N - 国际化标签库。Internationalization-   I18N
JSTL – SQL – 数据库操作标签(有悖于MVC设计模式不用不讲)
JSTL Functions – 函数库。
lJSTLXML ,对XML的操作(SQL标签)
三、JSTL核心标签库:c标签
l使用JSTL核心标签:
如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@taglib指令使用JSTL的核心标签库。
<%@ tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c"%>
uri是引用标签库的资源定位符,并不代表一个实际的地址。
Prefix是自定义的前缀。
如果你的项目是JavaEE2.5以下的项目,必须在在你项目中的lib目录下,存在以下两个jar文件为:
Jstl.jarstandard.jar
在上面的包中,存在着jstltld文件,用于描述jstl标签的属性、名称、资源等信息。程序就是通过这个tld文件找到相关java类以供运行的。
然后再在任意的JSP页面通过指令导入jstl.

<c:out${name}

输出标签

<c:set>   pageContext.setAttirbute(key,value,scope);

声明标签

C:remove

删除某个范畴内的数据

<c:if>

判断c:else,c:elsfif

<c:choose><c:when><c:otherwise>

判断分枝c:if,c:else if c:

<c:forEach>

遍历

<c:forTokens>

分隔

<c:import>

导入其他资源,相当于动态包含共享同一个request

<c:url>  -

重写url

<c:redirect>

重定向  response.sendRedirect(‘’..)


1.JSTL标签-out

<c:out value=…/>用于在页面上输出结果。

<c:outvalue=“${requestScope.name}”/> -request中的name值输出
<c:outvalue=“${param.username}”/> - 用于将参数输出到页面上。
<c:outvalue=“${name}”default=“hello”/>pageapplication开始查找,如果没有找到,就显示默认值hello.
另一种设置默认值的方式:
<c:outvalue=“${name}”>
Default-value-默认值。
</c:out>
只有当要求的信息为null或不存在时才会输出默认值。
excapeXml属性:默认值为true,用于将html等标签转换成&lt;等转换元素,示例:
<%
     String name="<font color='red'>Red</font>";
      pageContext.setAttribute("name",name);
  %>
<c:outvalue=“${name}”escapeXml=false></c:out>不对xmlhtml进行转换,直接输出,这样就会在页面上看到红色的Red字符,因为浏览器会解析html数据。
2.<c:set/>-声明一个变量

l<c:set/>标签的作用如下:
String类型的命名变量设置值。
<c:setvar=“变量名”value=“变量的值”scope=“page|request|session|application”/>
<c:setvar=“name”value=“${param.name}”/>直接从参数中取出数据给name赋值。
如果变量为JavaBean则为这个JavaBean的属性设置值。
<c:settarget=“JavaBean的变量名”property=“设置的属性”value=“值”/>
示例:
<jsp:useBeanid="person"class="cn.itcast.Person"></jsp:useBean>
  <c:settarget="${pageScope.person}" property="name"value="Jack"/>
  <c:settarget="${pageScope.person}" property="age"value="99"/>
如果变量为Map则,给Map中的key设置值。
<c:settarget=“代表Map的变量”property=“key”value=“value”/>,示例:
<jsp:useBeanid="map"class="java.util.HashMap"scope="request"></jsp:useBean>
  <c:settarget="${requestScope.map}"property="name"value="Jack"/>
  <c:outvalue="${requestScope.map.name}"/>
3.JSTL if 标签
<c:if/>用于实现Java语言中的if语句。它的语法如下:
<c:if test=“逻辑表达式”  var=“代表逻辑表达式值的命名变量” scope=../>
示例:
<c:if test=“${name!=‘Jack’}”>
      name的值为Jack时输出此行信息l</c:if>
上面的判断等价于下面的代码片段:
if(pageContext.getAttribute(“name”)!=null &&!..equals(“Jack”)){
out.println(“…..”);
}
此标签经常使用,要掌握。
4.choose,when,otherwise:

这几个标签共同使用可以实现Java中的if…else语句的功能。
<c:choose>
 <c:when test="${emptyparam.name}">
  用户没有输入name参数
  </c:when>
 <c:whentest="${param.name=='Admin'}">
  ${param.name}是管理员
  </c:when>
  <c:otherwise>
  用户是:${param.name}
  </c:otherwise>
  </c:choose>
使用c:when必须遵循以下语法规则:
<c:when/><c:otherwise/>不能单独使用,它必须位于<c:choose内。
<c:otherwise/>必须位于c:when之后。
5.forEach:
forEach用于遍历集合中的对像。
基本语法:
<c:forEachvar=“迭代变量”item=“${集合名称}”varStatus=“迭代下标变量”>
     迭代部分
</c:forEach>
forEachbegin(开始索引)end(结束索引)step(步长)属性:
<c:forEachbegin=0 end=10 step=“2”>…</c:forEach>将输出0,2,4,6,810

varStatus属性,用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量:
它包含以下信息:
count– 当前元素在集合中的序号,从1开始。
index- 记录当前元素的下标,从0开始。
first- 判断是否是第一个元素。
Last -判断是否是最后一个元素。
 
6.forTokens遍历一个字符串:
<c:forTokensvar="v" items="a,b,c,d,e,f"delims=",">
   <c:out value="${v}"></c:out><br/>
</c:forTokens>
,(逗号)对字符串a,b,c,d,e,f进行分隔。
7.URL相关的标签:
<c:import/>包含其他web资源,功能类似与<jsp:include/>(动态包含)。
<c:importurl=“web资源”/>
<c:url/>按特定的方式重写URL
<c:urlvalue=“/aaa.jsp”/>总是以/开头,如果只使用value属性为直接使用或输出。
<c:urlvalue=“/…”var=“someVar”scope=“…”/>也可以通过这样的方式将重写的url放到某个范围中,然后再取出来使用。
<c:redirect/>负责重定向。
<c:redirecturl=“重定向到的资源”/>
在使用<c:redirect时可以带更多的参数:
<c:redirecturl=“/…”>
 <c:param name=“someName” value=“someValue”/>
</c:redirect>

属性

类型

说明

value

Striing

资源地址信息

var

String

变量名

context

String

可以指定上下文根,默认为本项目的上下方根,也可以指定为其他项目的项目名。

scope

同上

使用c:url时,如果只使用value属性,则是直接将信息输出。如果声明了var属性,将不会输出结果而是将url地址信息的结果保存到此变量中。


下面通过jsp页面来演示JSTL核心标签库
<span style="font-size:12px;"><%@page import="cn.hncu.elWeb.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    
    <title>演示JSTL技术</title>
      </head>
  
  <body>
         <h1>JSTL技术演示</h1>
         <%
         	request.setAttribute("aa", "goggo");
         	List<Object> list=new ArrayList<Object>();
         	list.add(new User("wja",20));
         	list.add("aaaaaaa");
         	list.add(2000);
         	list.add(-300.9);
         	request.setAttribute("list", list);
          %>
          ${list}
          <table border="1px"">
          <c:forEach items="${list}" var="la">
          		<tr><td>${la}</td></tr>
          		</c:forEach>
          </table>
            <br/>
    <!-- c:out -->
    <%
    	pageContext.setAttribute("name", "Jack");
    	pageContext.setAttribute("name2", "<font color='red'>JACK</font>");
     %>
     	${name }<br/>
         <c:out value="${name}" ></c:out> <br/>
     	${name2}<br/>
         <c:out value="${name2}" escapeXml="false" ></c:out><!--  escapeXml参数是看是否解析c:out -->
  	 	<br/>
  	 <!-- c:if -->
  	 <c:if test="${list[0].age>20}" var="boo" scope="session">
  	 	<table border="1px">
  	 		<c:forEach items="${list }" var="l">
  	 			<tr/><td/>${l }
  	 		</c:forEach>
  	 	</table>
  	 </c:if>
  	 
  	 <c:if test="${!boo}">
  	 	<h2>输出表格错误</h2>
  	 </c:if>
  	相当于${list[0].age>20?"yes":"no" }<br/>
  	<!-- forEach -->
    <!-- forEach的遍历功能 -->
    <%
    	HashMap<String,Object> map=new HashMap<String,Object>();
    	map.put("name", "Rose");
    	map.put("age",55);
    	map.put("tel", "13566668888");
    	pageContext.setAttribute("m", map);
    	String str[]={"aaa","bbb","cccc","dddddddd"};
    	pageContext.setAttribute("str", str);
     %>
     
    <c:forEach items="${m }" var="im">
    	${im.key}=${im.value }
    </c:forEach><br/>
  
  	<c:forEach items="${str}" var="s">
    	${s}
    </c:forEach><br/>
     <h3>看看ForEach标签中的varStatus属性---idx.index是元素的下标(从0开始),idx.count是元素的序号(从1开始计数)</h3>
     <c:forEach items="${str }" var="s" varStatus="index">
     	 ${s }------index=${index.index}  count=${index.count }<br/>
     </c:forEach>
      <!-- forEach的普通循环功能 -->
      <c:forEach begin="20" end="40" step="2" varStatus="idx" var="x" ><!-- 只能是递增,而且step不能为负数 -->
      ${x }  index=${idx.index} --${idx.count} <br/>
      
      </c:forEach>
      ${str[0]}<br/>
      
       <!-- c:set 设置属性,默认作用域:pageScope-->
       <c:set var="aa" value="abc123"></c:set>
       <c:set var="aa" value="bbbbbbb23123" scope="session"> </c:set>
      <%--  <c:set var="${requestScope.aa }" value="bbbbbbb23123" scope="request"> </c:set>var的值不能用EL表达式<br/> --%>
       ${aa },,,${sessionScope.aa }<br/>
       
        <!-- c:remove 删除属性,默认作用域:pageScope,request等4个容器中的都会被删除-->
     <!-- 下面这一句,若没有scope属性,则前面的所有"aa"都会被清除。写了下面的scope,则只清除指定的request中的那个"aa"属性 -->
    <%-- <c:remove var="aa" scope="request"/> --%>
      ${aa },,${requestScope.aa },,${sessionScope.aa }<br/>
      
       <br/>
     <!-- c:choose,c:when,c:otherwise  类似Java中的switch-case-default且每项自动带break -->
     <c:set var="score" value="8"></c:set>
     <c:choose >
     	<c:when test="${score>90}">优秀</c:when>
     	<c:when test="${score>80}">良好</c:when>
     	<c:when test="${score>60}">及格</c:when>
     	<c:otherwise>不及格</c:otherwise>
     </c:choose>
     
     <br/>
     <!-- c:forTokens 用分隔符去拆分字符串-->
     <c:forTokens items="aa,vv,sdasd,sfasfafggd,eeeee" delims="," var="str">
     ${str}
     </c:forTokens><hr/>
     ${str[0]}<br/><!-- >被覆盖了,读不出去 -->  
      <!-- c:import 导入资源,相当于动态包含,共享同一个request-->
     <c:import url="/jsps/aa.jsp"></c:import>
      <!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
     <%-- 
         <c:redirect url="/jsps/aa.jsp"></c:redirect>
      --%>
     <!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
      <h2>以下演示JSTL中的国际化--I18N </h2>
      <a href="<c:url value='/jsps/i18n.jsp'/>">I18N演示</a>
     </body>
     
     
</html>
</span>

四、I18N标签:

  • 简介:
l18NInternationalization的简称,因为IN之间有18个字符所以叫i18n
java的核心库当中,提供了对i18n的支持,java.util.Locale类是最重要的i18n相关类。
首先介绍一下Locale类:
获取Locale类的实例,有以下几种方式:
Locale ch = new Locale(“zh”,”CN”);
Locale ch =Locale.CHINA;
或获取默认值:
Locale zh =Locale.getDefault();
然后可以通过以下方法输出语言和国家:
getLanguage
getCountry
  • I18NResourceBundle类:
Java.util.ResourceBundle类,用于管理和Locale相关的资源的功能。
ResourceBundle类提供了两个方法,用于创建ResourceBundle对像的静态工厂方法:
getBundle(StringbaseName)—通过此方法获取资源文件的名称
getBundle(StringbaseName,Locale locale);
参数中的baseName是资源文件的名称,资源文件通常以properties为扩展名。
资源文件的命名规则如下:
默认资源文件:resources.properties
英文资源文件:resources_en_US.properties
中文资源文件:resources_zh_CN.properties
  • ResourceBundle示例:
步骤如下:
1、在classpath目录下建立一个资源文件为message.properties
2、内容如下:name=Jack
3、书写一个main方法的类,并输入以下代码:
4ResourceBundle b =ResourceBundle.getBundle("message");
Stringname = b.getString("name");
System.err.println(name);
此时你看到的输出是Jack.
5、在classpath目录下,再建立一个文件message_zh_CN.properties
并输入以下内容:name=杰克(注意转码)
6、重新执行第4步的代码,你将会看到输出的结果变成了:杰克。
7、这是因为它使用本地语言查找相关的资源文件,如果找不到就使用默认的,如果找到就使用本地的资源文件。
在网页上的使用(要导入<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>标签)
<%@page import="cn.hncu.elWeb.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
     <fmt:setLocale value="zh_CN"/>
     <fmt:setBundle basename="msg"/>
     <!-- 真正搞国际,应该要把设置Locale和Bundle的代码放在head标签中,页面只负责显示。 -->
  </head>
  
  <body>
             张三,<fmt:message key="welcome"/><br/>
     <fmt:message key="time"/>fddfdfdfdfdfdf
     
     
     <hr/>
     <!-- 相比上一版本,把国家语种用参数进行传递 -->
     <a href="?loc=en_US">English</a>
     <a href="?loc=zh_CN">中文</a>
     <fmt:setLocale value="${param.loc}"/>
     <fmt:setBundle basename="msg"/>
           张三,<fmt:message key="welcome"/><br/>
     <fmt:message key="time"/>fddfdfdfdfdfdf
     
     
     <hr/>
     <!-- 再演示一下多个资源的情况,第二个资源及以后都必须取别名(变量名)。前面(第一个)没取变量名的那个叫默认资源  -->
     <fmt:setBundle basename="a" var="aaa" scope="session"/>
     <!-- 如果多个页面都要使用,那么得把作用域设成session -->      
           
           张三,<fmt:message key="welcome"/><br/>
     <fmt:message key="time"/>fd8888dfdf
     <br/>
     <!-- 如果是从非默认资源中读取,那么得指定资源名称即aaa。如果没有指定名称,那么就是从默认的读取 -->
     <fmt:message key="address" bundle="${aaa}"></fmt:message>
     <br/>
     <a href="<c:url value='/jsps/c.jsp'/>">到网站的其它页面去看看</a>
  </body>
  
  
</html>






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值