jsp技术:day4--JSTL

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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值