JSTL标签和I18N

JSTL简介:

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

JSTL组成:

JSTL –Core 核心标签库。 - 这是本部分的重点
JSTL – I18N - 国际化标签库。Internationalization-   I18N
JSTL – SQL – 数据库操作标签(有悖于MVC设计模式不用不讲)。
JSTL -Functions – 函数库。
JSTL -XML ,对XML的操作(同SQL标签)。
 
在jstl-1.2.jar包的META-INF目录中,保存着各种tld文件的版本。请查看。

JSTL核心标签库:

使用JSTL核心标签:
•如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@ taglib 指令使用JSTL的核心标签库。
<span style="font-size:18px;color:#000000;">•<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%></span>
•uri是引用标签库的资源定位符,并不代表一个实际的地址。
•Prefix是自定义的前缀。
•如果你的项目是JavaEE2.5以下的项目,必须在在你项目中的lib目录下,存在以下两个jar文件为:
•Jstl.jar、standard.jar
•在上面的包中,存在着jstl的tld文件,用于描述jstl标签的属性、名称、资源等信息。程序就是通过这个tld文件找到相关java类以供运行的。
•然后再在任意的JSP页面通过指令导入jstl.

Jar文件的说明:

Jstl-1.2.jar –包含在jstl规范中定义的接口和类的class文件,在META-INF目录下包含了所有可用的tld文件。
可以通过以下步骤修改引用jstl的方式:
<span style="font-size:18px;color:#000000;"> </span>
<span style="font-size:18px;color:#000000;">找到META-INF目录中的c.tld文件,将c.tld放到WEB-INF/tld/目录下。

在web.xml中配置以下信息:

<jsp-config>

<taglib>

<taglib-uri>/c.tld</taglib-uri>

<taglib-location>/WEB-INF/tld/c.tld</taglib-location>

</taglib>

</jsp-config>

然后在页面上如下使用:

<%@ taglib uri=“/c.tld”prefix=“c”%></span>
 
JSTL-Core一共包含以下几个子标签:

JSTL标签-out:
 

 

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

 

demo1.jsp中的out标签部分代码

<span style="font-size:18px;color:#000000;">	 <%
		request.setAttribute("name", "jack");
	 %>
	<p>c:out标签------输出表达式或标识符的值(功能和${标识符}类似,差别在default和escapeXml两个属性上)</p>    
   	<c:out value="${ name}" ></c:out><br/>◎注意:value="里面要放EL表达式(${标识符})"
    	${name}<br/>
    	<!--default属性的功能:当“变量值aaaa”为空时,输出输出该属性的值  -->
    	<c:out value="${aaaa}" default="此值为空"></c:out><br/>
   
    	<%
    		pageContext.setAttribute("str", "<font color='red'>湖南城市学院</font>");
     	%>
    	<!-- escapeXml="true"会把信息中的"<" 编码成"<"输出,若该属性值为false 则编码-->
    	${str},<c:out value="${ str }" escapeXml="true"></c:out>
    
    	<br/>
    	<!-- 此点为自加 .前台?号传参,在这里要用EL表达式的param获参,但要注意参数值如果为中文会出现乱码-->
    	<c:out value="${ param.nm }"></c:out>,${param.nm }.
    	<br/><br/><br/></span>

 

 


<c:set/>-声明一个变量

 

<span style="font-size:18px;color:#000000;"><c:set/>标签的作用如下:
为String类型的命名变量设置值。
<c:set var=“变量名” value=“变量的值” scope=“page|request|session|application”/>
<c:set var=“name” value=“${param.name}”/>直接从参数中取出数据给name赋值。
如果变量为JavaBean则为这个JavaBean的属性设置值。
<c:set target=“JavaBean的变量名” property=“设置的属性” value=“值”/> 
示例:
<jsp:useBean id="person" class="cn.itcast.Person"></jsp:useBean>
  <c:set target="${pageScope.person}" property="name" value="Jack"/>
  <c:set target="${pageScope.person}" property="age" value="99"/>
如果变量为Map则,给Map中的key设置值。
<c:set target=“代表Map的变量” property=“key” value=“value”/>,示例:
<jsp:useBean id="map" class="java.util.HashMap" scope="request"></jsp:useBean>
  <c:set target="${requestScope.map}" property="name" value="Jack"/>
  <c:out value="${requestScope.map.name}"/>

</span>

demo1.jsp中set标签部分代码

<span style="font-size:18px;color:#000000;"> <p>c:set标签</p>
    <!-- 给JavaBean设置属性 -->
    <jsp:useBean id="user" class="cn.hncu.domain.UserModel" ></jsp:useBean>
    <c:set target="${user}" property="name" value="Rose"></c:set>
    <c:set target="${user}" property="age" value="22" ></c:set>
    <c:out value="${user}"></c:out>
    <br/>
    
    <!-- 给String类型变量设置值 -->
    <c:set var="sum" value="2000"></c:set>
    <c:out value="${sum}"></c:out></span>


<c:if>- 判断标签

<span style="font-size:18px;color:#000000;"><c:if/>用于实现Java语言中的if语句。它的语法如下:
<c:if test=“逻辑表达式”   var=“代表逻辑表达式值的命名变量”  scope=../>
示例:
<c:if test=“${name!=‘Jack’}”>
       当name的值为Jack时输出此行信息
</c:if>
上面的判断等价于下面的代码片段:
if(pageContext.getAttribute(“name”)!=null && !..equals(“Jack”)){
out.println(“…..”);
}
此标签经常使用,要掌握。
</span>


demo1.jsp中if标签部分代码

<span style="font-size:18px;color:#000000;"><p>c:if标签-----用于控制判断</p>
    ${user.age>20? "yes!":"no!" }<br/>
   	<!-- 实现 if-else功能 -->
    <c:if test="${user.age>20 }" var="boo" scope="request" >
    		YES!
    </c:if>
    <c:if test="${!boo}">
    		NO!
    </c:if>
    
    <br/>
    <%
    	pageContext.setAttribute("age", "18");
     %>
    <c:if test="${age>20 }" var="boo" scope="request" >
    		YES!
    </c:if>
    <c:if test="${!boo}">
    		NO!
    </c:if></span>

 

 

续-迭代标签(重要内容):

<span style="font-size:18px;color:#000000;"><c:forEach/>用于遍历集合中的对像。
<c:forTokens/>用于遍历字符串中用特定分隔符分隔的字符串。--String.split(“#”);
</span>


 

 

 


forEach:

<span style="font-size:18px;color:#000000;">forEach用于遍历集合中的对像。
基本语法:
<c:forEach var=“迭代变量” item=“${集合名称}” varStatus=“迭代下标变量”>
       迭代部分
</c:forEach>
forEach的begin(开始索引)、end(结束索引)、step(步长)属性:
<c:forEach begin=0 end=10 step=“2”>…</c:forEach>将输出0,2,4,6,810
</span>

 

使用forEach来遍历List:

<span style="font-size:18px;color:#000000;"><%
  List<String> list = new ArrayList<String>();
  list.add("Hello");
  list.add("大家好");
  pageContext.setAttribute("list",list);
  %>
  <c:forEach var="str" items="${list}">
  ${str}<br/>
  </c:forEach>
</span>

用forEach来遍历Map:
<span style="font-size:18px;color:#000000;"><%
  Map<String,Object> map = new HashMap<String,Object>();
  map.put("name","Jack");
  map.put("age","99");
  pageContext.setAttribute("map",map);
  %>
  <c:forEach var="map" items="${map}">
  ${map.key} = ${map.value}<br/>
  </c:forEach>
</span>

使用varStatus属性:

<span style="font-size:18px;color:#000000;">varStatus属性,用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量:
它包含以下信息:
count – 当前元素在集合中的序号,从1开始。
index - 记录当前元素的下标,从0开始。
first - 判断是否是第一个元素。
Last - 判断是否是最后一个元素。
  
</span>


 

 

demo2.jsp中forEach和varStatus标签代码

<span style="font-size:18px;color:#000000;"><p>c:forEach标签</p>
	一.普通for循环功能<br/>
		<!-- 类似for(i=0;i<=10;i+2){} -->
		<c:forEach begin="0" end="10" var="i" step="2">
			${i},
		</c:forEach>
	二.增强for循环功能<br/>
	1.遍历数组<br/>
		<%
			String[] str={"aa","bb","cc"};
			request.setAttribute("str", str);
		 %>
		<c:forEach items="${str}" var="s">
			${ s },
		</c:forEach>
		<br/>
	2.遍历List<br/>
		<%
			List<String> list=new ArrayList<String>();
			list.add( "11");
			list.add( "22");
			list.add( "33");
			request.setAttribute("list", list);
		 %>
		<c:forEach items="${list}" var="l" varStatus="idx">
			${idx.count},${l}<br>
		</c:forEach>
		<br/>
		
	3.遍历Map<br/>
		<%
			Map map=new HashMap();
			map.put("name", "Ming");
			map.put("age", "20");
			map.put("tel", "11223344");
			map.put("addr", "城院");
			session.setAttribute("user1", map);
		 %>
		<c:forEach	items="${user1}" var="u1">
			${u1} ==>    ${u1.key},${u1.value}<br/>
		</c:forEach>
		<br/>
		
	4.遍历元素为值对象的集合<br/>
		<%
			Map map2=new HashMap();
			map2.put("u1001", new UserModel("jack","11",20));
			map2.put("u1002", new UserModel("jack2","22",22));
			map2.put("u1003", new UserModel("jack3","33",33));
			map2.put("u1004", new UserModel("jack4","44",44));
			request.setAttribute("map2", map2);
		 %>
		<c:forEach items="${map2}" var="m2">
			${m2.key},${m2.value.name},${m2.value.age},${m2.value.pwd}<br/>
		</c:forEach>
		<hr/>
			<!-- index为下标的序号(索引) ,count为计数 -->
		<c:forEach items="${map2}" var="m2" varStatus="id">
			${id.count }   ${id.index }   
			<c:out value="${m2.value.name }"></c:out>
			<c:out value="${m2.value.age }"></c:out>
			<c:out value="${m2.value.pwd }"></c:out><br/>
		</c:forEach>
		<br/><br/></span>


 

 

用forTokens遍历一个字符串:

<span style="font-size:18px;color:#000000;"><c:forTokens var="v" items="a,b,c,d,e,f" delims=",">
  	<c:out value="${v}"></c:out><br/>
</c:forTokens>
按,(逗号)对字符串”a,b,c,d,e,f”进行分隔。
</span>

 

demo2.jsp中forTokens标签部分代码

<span style="font-size:18px;color:#000000;"><p>c:forTokens标签</p>
		<!-- 类似字符串拆分.str.split(",") -->
		<c:forTokens items="a,c,d,awe,53fa" delims="," var="x">
			${x}<br/>
		</c:forTokens>
		<br/></span>


choose,when,otherwise:

<span style="font-size:18px;color:#000000;">这几个标签共同使用可以实现Java中的if…else语句的功能。
<c:choose>
  <c:when test="${empty param.name}">
  用户没有输入name参数
  </c:when>
  <c:when test="${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之后。

</span>

 

 

 

URL相关的标签:
 

<span style="font-size:18px;color:#000000;"><c:import/>包含其他web资源,功能类似与<jsp:include/>(动态包含)。
<c:import url=“web资源”/>
<c:url/>按特定的方式重写URL。
<c:url value=“/aaa.jsp”/>总是以/开头,如果只使用value属性为直接使用或输出。
<c:url value=“/…” var=“someVar” scope=“…”/>也可以通过这样的方式将重写的url放到某个范围中,然后再取出来使用。

<c:redirect/>负责重定向。
<c:redirect url=“重定向到的资源”/>
在使用<c:redirect时可以带更多的参数:
<c:redirect url=“/…”>
     <c:param name=“someName” value=“someValue”/>
</c:redirect>
</span>


<c:url>

 

demo2.jsp中url标签部分代码:

<span style="font-size:18px;color:#000000;"><p>url相关的标签:url,import,redirect</p>
			<!-- 重写url技术 ,路径中的"/"就是项目根目录-->
		<a href='<c:url value="/ShowServlet"></c:url>'>显示所有用户信息</a>
		<br/>
		
		<!-- 动态包含 -->
		<c:import url='/jsps/foot.jsp'></c:import>
		<br/>
		
		<%--
		<!--注意:页面中写了c:redirect,就会立即重定向到其他页面。不会再停留在当前页面 -->
		<c:redirect url="/jsps/foot.jsp"></c:redirect>
		<%
			response.sendRedirect(request.getContextPath()+"/jsps/show.jsp");
		 %>
		 --%>
		<br/>
		
		<c:set  var="score" value="75"></c:set>
			remove前: ${score}<br/>
		<!-- c:remove标签:移除属性变量,和set相反 -->
		<c:remove var="score"/>
			remove后:${score}.
		<br/><br/><br/></span>


与demo2.jsp相关联的ShowServlet.java代码:

<pre class="java" name="code"><span style="font-size:18px;color:#000000;">package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.domain.UserModel;

public class ShowServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		List<UserModel> list=new ArrayList<UserModel>();
		for(int i=0;i<10;i++){
			list.add(new UserModel("Long"+i,"1234"+i,20+i));
		}
		request.setAttribute("list", list);
		request.getRequestDispatcher("jsps/show.jsp").forward(request, response);
	}

}
</span>

 


与demo2.jsp相关联的show.jsp代码:

<span style="font-size:18px;color:#000000;"><%@ 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>用户信息显示</title>
  </head>
  <body>
   		<h2>用户信息显示</h2>
   		<c:if test="${empty list }" var="boo">
   			用户信息为空
   		</c:if>
   		<c:if test="${!boo }">
   		<table>
   			<tr><th>姓名</th><th>年龄</th><th>密码</th></tr>
   			<c:forEach items="${list }" var="u">
   			<tr>
   				<td>${u.name }</td><td>${u.age }</td><td>${u.pwd }</td>
   			</tr>
   			</c:forEach>
   		</table>
   		</c:if>		
  </body>
</html>
</span>


与demo2.jsp相关联的foot.jsp很简单就是一张图片的代码,这里不再贴了。

 

 

I18N标签简介:

<span style="font-size:18px;color:#000000;">I18N是Internationalization的简称,因为I到N之间有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
</span>


I18N-ResourceBundle类:

<span style="font-size:18px;color:#000000;">Java.util.ResourceBundle类,用于管理和Locale相关的资源的功能。
ResourceBundle类提供了两个方法,用于创建ResourceBundle对像的静态工厂方法:
getBundle(String baseName)—通过此方法获取资源文件的名称
getBundle(String baseName,Locale locale);
参数中的baseName是资源文件的名称,资源文件通常以properties为扩展名。
资源文件的命名规则如下:
默认资源文件:resources.properties
英文资源文件:resources_en_US.properties
中文资源文件:resources_zh_CN.properties
</span>


ResourceBundle示例:

<span style="font-size:18px;color:#000000;">步骤如下:
1、在classpath目录下建立一个资源文件为message.properties。
2、内容如下:name=Jack
3、书写一个main方法的类,并输入以下代码:
4、ResourceBundle b = ResourceBundle.getBundle("message");
String name = b.getString("name");
System.err.println(name);
此时你看到的输出是Jack.
5、在classpath目录下,再建立一个文件message_zh_CN.properties
并输入以下内容:name=杰克 (注意转码)
6、重新执行第4步的代码,你将会看到输出的结果变成了:杰克。
7、这是因为它使用本地语言查找相关的资源文件,如果找不到就使用默认的,如果找到就使用本地的资源文件。
</span>


JSTL的国际化标签:

<span style="font-size:18px;color:#000000;"><fmt:setLocale/> - 设置Locale关将它保存在某个范围内,默认为page范围。
如:<fmt:setLocale value=“zh_CN” scope=“session”/>它的作用相当于:
Locale locale = new Locale(“zh”,”CN”);
Session.setAttribute(“javax.servlet.jsp.jstl.fmt.locale.session”,locale);
<fmt:setBundle/>
用于设置要使用的资源文件。如:
<fmt:setBundle basename=“message” var=“变量名” scope=“session”/>
<fmt:bundle/>
用于设置主体使用的资源。即setBundle设置的资源。
<fmt:message/>
读取资源文件中key所对应的值。
<fmt:param/>
嵌套在message中,用户动态的传递参数。
<fmt:requestEncoding/>
用于设置请求的编码字符。<fmt:requestEncoding value=“GBK”/>等同于
Request.setCharacterEncoding(“GBK”);
</span>


 

 

设置支持国际化的网页:

<span style="font-size:18px;color:#000000;">第一步:建立两个资源文件为:
message.properties
message_zh_CN.properties
第二步:使用jstl标签。
<fmt:setLocale value=“${param.locale}” scope=“session”/>
<fmt:setBundle basename=“message” scope=“session”/>
第三步:切换。
<a href="index.jsp?locale=zh_CN">中文</a><br/>
 <a href="index.jsp?locale=en_US">English</a>
</span>

 

版本一:写死了

demo3.jsp

<span style="font-size:18px;color:#000000;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>I18N技术</title>
  </head>
  <body>
 	<h2>I18N技术----国际化技术</h2>
 	
 	<!--1 设置本地信息----(看是哪国语言) -->
 	<fmt:setLocale value="zh_cn"/>
 	
 	<!--2 指定资源文件名  -->
 	<fmt:setBundle basename="msg" scope="session"/>
 	
 	<!--3 显示信息  -->
 	<fmt:message key="welcome"></fmt:message> Hong<br/>
 	<fmt:message key="time" />2016.10.20 19:19
  </body>
</html>
</span>

 

 

 

版本二:更灵活

demo4.jsp

<span style="font-size:18px;color:#000000;"><%@ 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>
    <title>I18N技术</title>
  </head>
  <body>
 	<h2>I18N技术----国际化技术</h2>
 	
 	<a href="?bd=zh_CN">中文</a>   
 	<a href="?bd=en_US">English</a><br/>
 	
 	
 	<!--1 设置本地信息----(看是哪国语言) 相对于上一个版本做活了 -->
 	<fmt:setLocale value="${param.bd }"/>
 	
 	<!--2 指定资源文件名  -->
 	<fmt:setBundle basename="msg" scope="session"/>
 	<!-- ◎指定第二个及之后的资源文件,含路径的资源名,第二个及以后的资源一定要取别名 -->
 	<fmt:setBundle basename="cn.resources.a" var="bb" scope="session"/>
 	
 	<!--3 显示信息  -->
 	<fmt:message key="welcome"></fmt:message> Hong<br/>
 	<fmt:message key="time" />2016.10.20 19:19
 	 <!-- 第二个及以后的资源,要指定别名 -->
 	 <fmt:message key="addr" bundle="${bb }"></fmt:message>
 	 
 	 <br/>
 	 <a href="<c:url value='/jsps/a.jsp'></c:url>">转到另外一个界面</a>
 	 
  </body>
</html>
</span>

 

与demo4.jsp相关联的a.jsp代码与demo4.jsp中的显示信息代码一致,这里不再贴了。

 


主页index.jsp代码

<span style="font-size:18px;color:#000000;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  	<title>JSTL技术</title>
  </head>
  
  <body>
    <h2>JSTL技术必须依赖于EL表达式</h2>
    
    <a href="jsps/demo1.jsp">JSTL用法1</a><br/>
    <a href="jsps/demo1.jsp?nm=jack&age=20">JSTL用法1---可以从这里传参</a>
    <br/> <br/>
    <a href="jsps/demo2.jsp">JSTL用法2</a><br/>
    <br/>
    
    <a href="jsps/demo3.jsp">I18N----国际化技术</a> <br/>
    <a href="jsps/demo4.jsp">I18N----国际化技术2</a>
    
    
  </body>
</html>
</span>




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值