JSTL—Core核心标签库(重点掌握)
用之前先要导入标签库:<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
重写url:
<c:url value="/jsps/jstl.jsp" />
c:out 标签
注意:用c:out标签输出可以自己设置escapexml属性,是否让浏览器翻译输出,默认是true不翻译。如图:
<%
pageContext.setAttribute("name", "思琪");
pageContext.setAttribute("name2", "<font color='red'>小雪</font>");
%>
<hr/>
${name },${name2 }<br>
<c:out value="${ name}"></c:out>,<c:out value="${ name2}"></c:out>
<!-- 上面两个输出是有区别的,第一个是浏览器翻译输出,第二行的输出是原样输出-->
<br/>
<!-- 如果想第二种输出也让浏览器翻译要设置escapexml属性 默认是true不翻译-->
<c:out value="${name }" escapeXml="false" ></c:out>,
<c:out value="${name2 }" escapeXml="false"></c:out>
c:if标签
test属性是条件,var声明的boo只有后面用的时候才有意义。
如图:
条件满足时:
条件不满足时:
<c:if test="${list[2].age>30 }" var="boo" scope="session">
这正是我要的if结果
</c:if>
<!-- 声明的boo只有当下面要用的时候才有意义 -->
<c:if test="${!boo }">
这是当上面boo条件不满足的时候才输出
</c:if>
c:forEach遍历
list集合遍历:
<%
List list2 = new ArrayList();
list2.add("aaaaaa");
list2.add("bbbbbb");
list2.add(1111111);
list2.add(33333333);
request.setAttribute("list2", list2);
%>
<br/>
<br/>
<c:forEach items="${list2 }" var="im">
${im },
</c:forEach>
map集合遍历
<%
Map<String,Object> map= new HashMap<String,Object>();
map.put("name", "利儿");
map.put("age", 24);
map.put("b-f", "军街");
request.setAttribute("map", map);
%>
<br/>
<c:forEach items="${map }" var="im">
${im.key }=${im.value }<br/>
</c:forEach>
<br/>
数组遍历
<%
String strs ="aa,bb,cc,oo,kk";
request.setAttribute("strs", strs);
%>
<c:forEach items="${strs }" var="im">
${im },,
</c:forEach>
forEach中的varStatus属性:index:元素下标 count:统计个数
<c:forEach items="${strs }" var="im" varStatus="idx">
${im },index:${idx.index },count:${idx.count }<br/>
</c:forEach>
forEach中的普通循环功能,主要用来控制次数 begin-end step:间隔数
<c:forEach begin="10" end="18" var="i" step="2" >
${i },,
</c:forEach>
c:set 用于设置属性
默认作用域pageScope
也可以指定作用域:pageScope、requestScope、sessionScope、applicationScope
<c:set var="aa" value="123456" ></c:set>
<c:set var="aa" value="456456" scope="request" ></c:set>
aa:${aa }<br/>
aa:${requestScope.aa }
c:remove 删除属性
默认作用域:pageScope,request等4个容器中的都会被删除
如果下面的没有设置属性,则所有的aa属性都会被删除
<c:remove var="aa" scope="request"/>
aa:${aa }
<br/>
aa:${requestScope.aa }
c:choose,c:when,c:otherwise
类似Java中的switch-case-default且每项自动带break
<c:set var="score" value="85" >
</c:set>
<c:choose>
<c:when test="${score>90 }">
优秀
</c:when>
<c:when test="${score>80 }">
良好
</c:when>
<c:when test="${score>70 }">
中等
</c:when>
<c:otherwise>
不行
</c:otherwise>
</c:choose>
<br/>
结果输出如图:
c:forTokens
用分隔符去拆分字符串
<c:forTokens items="aa,bb,cc,dd,ff" delims="," var="im">
${im },,
</c:forTokens>
结果如图:
c:import 导入资源
相当于动态包含,共享同一个request
c:redirect重定向
相当于response.sendRedirect(…)
I18N标签库
配置文件写多套,由系统去读,如果匹配到相关国家,则用相应的properties,如果匹配不到,还会根据系统的国家语种再找,如果还没有,则用我们默认的properties。
//参数是:baseName-- 本例指的是资源文件名是: msg**.properties
//ResourceBundle rd = ResourceBundle.getBundle("msg");//读取的是:msg_zh_CN.properties
// ResourceBundle rd = ResourceBundle.getBundle("msg");
ResourceBundle rd = ResourceBundle.getBundle("msg",Locale.FRANCE); //读取的是:msg_en_US.properties
String str1 = rd.getString("welcome");
String str2= rd.getString("time");
System.out.println(str1+","+str2);
Functions标签库
真正搞国际,应该要把设置Locale和Bundle的代码放在head标签中,页面只负责显示。
可以写一个默认的,如果读取不到该国家参数就采用默认的properties。
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="msg"/>
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>
, 2:30 ,are you want to have a sleep<br/>
相比上一版本,把国家语种用参数进行传递
<a href="?loc=zh_CN">中文</a>
<a href="?loc=en_US">English</a>
<fmt:setLocale value="${param.loc }"/>
<fmt:setBundle basename="msg"/>
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>
, 2:49 ,are you want to have a sleep<br/>
再演示一下多个资源的情况,第二个资源及以后都必须取别名(变量名)。前面(第一个)没取变量名的那个叫默认资源
<fmt:setBundle basename="a" var="aaa" scope="session" />
<fmt:message key="address" bundle="${aaa }" ></fmt:message>
如果是从非默认资源中读取,那么得指定资源名称即aaa。如果没有指定名称,那么就是从默认的读取
如果多个页面都要使用,那么得把作用域设成session
<a href="<c:url value='/jsps/c.jsp' />">去别的网页看一看</a>
在c.jsp页面中:
<fmt:message key="address" bundle="${aaa }"></fmt:message>
本文完整代码如下:
index.jsp
<%@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>
</head>
<body>
<h2>JSTL技术演示</h2>
<a href="<c:url value='/jsps/jstl.jsp'></c:url>">JSTL技术演示页面</a>
<br/>
<br/>
<br/>
<br/>
<br/>
</body>
</html>
i18n.jsp
<%@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>
</head>
<body>
<h2>jstl.jsp页面</h2>
<br/>
<!-- jstl很强大 -->
<%
List list = new ArrayList();
list.add("aaaa");
list.add("bbbbb");
list.add(new User("小米",26));
request.setAttribute("list", list);
%>
<table border="1px">
<c:forEach items="${ list}" var="im">
<tr><td>list-item:${im }</td></tr>
</c:forEach>
</table>
<!-- c:out -->
<%
pageContext.setAttribute("name", "思琪");
pageContext.setAttribute("name2", "<font color='red'>小雪</font>");
%>
<hr/>
${name },${name2 }<br>
<c:out value="${ name}"></c:out>,<c:out value="${ name2}"></c:out>
<!-- 上面两个输出是有区别的,第一个是浏览器翻译输出,第二行的输出是原样输出-->
<br/>
<!-- 如果想第二种输出也让浏览器翻译要设置escapexml属性 默认是true不翻译-->
<c:out value="${name }" escapeXml="false" ></c:out>,
<c:out value="${name2 }" escapeXml="false"></c:out>
<br/>
<!-- c:if -->
<c:if test="${list[2].age>20 }" var="boo" scope="session">
这正是我要的if结果
</c:if>
<!-- 声明的boo只有当下面要用的时候才有意义 -->
<c:if test="${!boo }">
这是当上面boo条件不满足的时候才输出
</c:if>
<!-- c:forEach遍历 -->
<%
List list2 = new ArrayList();
list2.add("aaaaaa");
list2.add("bbbbbb");
list2.add(1111111);
list2.add(33333333);
request.setAttribute("list2", list2);
%>
<br/>
<br/>
<c:forEach items="${list2 }" var="im">
${im },
</c:forEach>
<%
Map<String,Object> map= new HashMap<String,Object>();
map.put("name", "利儿");
map.put("age", 24);
map.put("b-f", "军街");
request.setAttribute("map", map);
%>
<br/>
<c:forEach items="${map }" var="im">
${im.key }=${im.value }<br/>
</c:forEach>
<br/>
<%
String strs ="aa,bb,cc,oo,kk";
request.setAttribute("strs", strs);
%>
<c:forEach items="${strs }" var="im">
${im },,
</c:forEach>
<br/>
<h3>forEach中的varStatus属性:index:元素下标 count:统计个数</h3>
<c:forEach items="${strs }" var="im" varStatus="idx">
${im },index:${idx.index },count:${idx.count }<br/>
</c:forEach>
<br/>
<h3>forEach中的普通循环功能,主要用来控制次数 begin-end step:间隔数</h3>
<c:forEach begin="10" end="18" var="i" step="2" >
${i },,
</c:forEach>
<br/>
<!-- c:set 用于设置属性,默认作用域pageScope -->
<c:set var="aa" value="123456" >
</c:set>
aa:${aa }
<br/>
<c:set var="aa" value="456456" scope="request" >
</c:set>
aa:${requestScope.aa }
<br/>
<!-- c:remove 删除属性,默认作用域:pageScope,request等4个容器中的都会被删除 -->
<%-- 如果下面的没有设置属性,则所有的aa属性都会被删除--%>
<c:remove var="aa" scope="request"/>
aa:${aa }
<br/>
aa:${requestScope.aa }
<br/>
<br/>
<!-- c:choose,c:when,c:otherwise 类似Java中的switch-case-default且每项自动带break -->
<c:set var="score" value="85" >
</c:set>
<c:choose>
<c:when test="${score>90 }">
优秀
</c:when>
<c:when test="${score>80 }">
良好
</c:when>
<c:when test="${score>70 }">
中等
</c:when>
<c:otherwise>
不行
</c:otherwise>
</c:choose>
<br/>
<!-- c:forTokens 用分隔符去拆分字符串-->
<c:forTokens items="aa,bb,cc,dd,ff" delims="," var="im">
${im },,
</c:forTokens>
<!-- c:import 导入资源,相当于动态包含,共享同一个request-->
<br/>
导入资源:
<c:import url="/jsps/b.jsp"></c:import>
<br/>
<br/>
<!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
<%--
<c:redirect url="/jsps/aa.jsp">
</c:redirect>
--%>
<br/>
<br/>
<h2>以下演示JSTL中的国际化--I18N </h2>
<a href="<c:url value='/jsps/i18n.jsp'/>">演示JSTL中的国际化--I18N </a>
<br/>
<br/>
</body>
</html>
b.jsp
<%@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>
</head>
<body>
<c:forEach items="${list2 }" var="im">
im:${im }<br>
</c:forEach>
</body>
</html>
aa.jsp
<%@page import="cn.hncu.elWeb.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h2>aa.jsp页面</h2>
<a href = "${pageContext.request.contextPath }/index.jsp">返回主页</a>
<!--上面的index.jsp加不加无所谓,因为都是主页,在xml中设置了欢迎页面就是index.jsp -->
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
</body>
</html>
i18n.jsp
<%@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>
</head>
<body>
<h2>jstl.jsp页面</h2>
<br/>
<!-- jstl很强大 -->
<%
List list = new ArrayList();
list.add("aaaa");
list.add("bbbbb");
list.add(new User("小米",26));
request.setAttribute("list", list);
%>
<table border="1px">
<c:forEach items="${ list}" var="im">
<tr><td>list-item:${im }</td></tr>
</c:forEach>
</table>
<!-- c:out -->
<%
pageContext.setAttribute("name", "思琪");
pageContext.setAttribute("name2", "<font color='red'>小雪</font>");
%>
<hr/>
${name },${name2 }<br>
<c:out value="${ name}"></c:out>,<c:out value="${ name2}"></c:out>
<!-- 上面两个输出是有区别的,第一个是浏览器翻译输出,第二行的输出是原样输出-->
<br/>
<!-- 如果想第二种输出也让浏览器翻译要设置escapexml属性 默认是true不翻译-->
<c:out value="${name }" escapeXml="false" ></c:out>,
<c:out value="${name2 }" escapeXml="false"></c:out>
<br/>
<!-- c:if -->
<c:if test="${list[2].age>20 }" var="boo" scope="session">
这正是我要的if结果
</c:if>
<!-- 声明的boo只有当下面要用的时候才有意义 -->
<c:if test="${!boo }">
这是当上面boo条件不满足的时候才输出
</c:if>
<!-- c:forEach遍历 -->
<%
List list2 = new ArrayList();
list2.add("aaaaaa");
list2.add("bbbbbb");
list2.add(1111111);
list2.add(33333333);
request.setAttribute("list2", list2);
%>
<br/>
<br/>
<c:forEach items="${list2 }" var="im">
${im },
</c:forEach>
<%
Map<String,Object> map= new HashMap<String,Object>();
map.put("name", "利儿");
map.put("age", 24);
map.put("b-f", "军街");
request.setAttribute("map", map);
%>
<br/>
<c:forEach items="${map }" var="im">
${im.key }=${im.value }<br/>
</c:forEach>
<br/>
<%
String strs ="aa,bb,cc,oo,kk";
request.setAttribute("strs", strs);
%>
<c:forEach items="${strs }" var="im">
${im },,
</c:forEach>
<br/>
<h3>forEach中的varStatus属性:index:元素下标 count:统计个数</h3>
<c:forEach items="${strs }" var="im" varStatus="idx">
${im },index:${idx.index },count:${idx.count }<br/>
</c:forEach>
<br/>
<h3>forEach中的普通循环功能,主要用来控制次数 begin-end step:间隔数</h3>
<c:forEach begin="10" end="18" var="i" step="2" >
${i },,
</c:forEach>
<br/>
<!-- c:set 用于设置属性,默认作用域pageScope -->
<c:set var="aa" value="123456" >
</c:set>
aa:${aa }
<br/>
<c:set var="aa" value="456456" scope="request" >
</c:set>
aa:${requestScope.aa }
<br/>
<!-- c:remove 删除属性,默认作用域:pageScope,request等4个容器中的都会被删除 -->
<%-- 如果下面的没有设置属性,则所有的aa属性都会被删除--%>
<c:remove var="aa" scope="request"/>
aa:${aa }
<br/>
aa:${requestScope.aa }
<br/>
<br/>
<!-- c:choose,c:when,c:otherwise 类似Java中的switch-case-default且每项自动带break -->
<c:set var="score" value="85" >
</c:set>
<c:choose>
<c:when test="${score>90 }">
优秀
</c:when>
<c:when test="${score>80 }">
良好
</c:when>
<c:when test="${score>70 }">
中等
</c:when>
<c:otherwise>
不行
</c:otherwise>
</c:choose>
<br/>
<!-- c:forTokens 用分隔符去拆分字符串-->
<c:forTokens items="aa,bb,cc,dd,ff" delims="," var="im">
${im },,
</c:forTokens>
<!-- c:import 导入资源,相当于动态包含,共享同一个request-->
<br/>
导入资源:
<c:import url="/jsps/b.jsp"></c:import>
<br/>
<br/>
<!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
<%--
<c:redirect url="/jsps/aa.jsp">
</c:redirect>
--%>
<br/>
<br/>
<h2>以下演示JSTL中的国际化--I18N </h2>
<a href="<c:url value='/jsps/i18n.jsp'/>">演示JSTL中的国际化--I18N </a>
<br/>
<br/>
</body>
</html>
c.jsp
<%@page import="cn.hncu.elWeb.domain.User"%>
<%@ 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>
</head>
<body>
<h2>c.jsp页面</h2>
<h3>演示从session中拿资源aaa</h3>
<fmt:message key="address" bundle="${aaa }"></fmt:message>
</body>
</html>
cn.hncu.elWeb.domain.user
package cn.hncu.elWeb.domain;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
i18nDemo
package cn.hncu.i18b;
import java.util.Locale;
import java.util.ResourceBundle;
public class i18nDemo {
public static void main(String[] args) {
//参数是:baseName-- 本例指的是资源文件名是: msg**.properties
//ResourceBundle rd = ResourceBundle.getBundle("msg");//读取的是:msg_zh_CN.properties
// ResourceBundle rd = ResourceBundle.getBundle("msg");
ResourceBundle rd = ResourceBundle.getBundle("msg",Locale.FRANCE); //读取的是:msg_en_US.properties
String str1 = rd.getString("welcome");
String str2= rd.getString("time");
System.out.println(str1+","+str2);
}
}
a_en_US.properties
address=beijing
a_zh_CN.properties
address=\u5317\u4EAC
msg_en_US.properties
welcome=welcome
time=this time is
msg_zh_CN.properties
welcome=\u6B22\u8FCE\u8FDB\u5165\u6B64\u9875\u9762
time=\u73B0\u5728\u65F6\u95F4\u662F
msg.properties
welcome=welcome
time=this time is