JSTL标签

全称: jsp standard tag library, 标准标签库

为什么会有JSTL标签?

  在jsp文件如果同时出现java片段+html标签+jsp标签, 页面代码会很乱, 于是有人提出: 能不能把<%%>java片段使用标签来替换, 

这样jsp页面会很整洁, 于是有了JSTL标签.

使用JSTL标签的好处?

  (1) 在应用程序和服务器之间提供了统一的接口, 从而提供了web应用在不同服务器的移植

  (2) 简化了jsp与web应用程序的开发

  (3) 减少jsp中java片段的代码, 可以达到没有任何的java代码, 使页面更加简洁

  (4) 提高jsp的开发效率, 缩短开发周期

分类:

1. 一般用途的标签

2. 条件标签

3. 迭代标签

4. url相关的标签(xml, sql)

-------------------------------------------------

新建Web Project: jstl, 并引入jstl标签库

范例1: 在jsp页面输出Hello World !

index.jsp:

<!-- 跳转到c_out.jsp页面 -->
<jsp:forward page="/WEB-INF/c_out.jsp" />

c_out.jsp:

引入c标签: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!-- 使用c标签输出Hello World ! -->
<c:out value="Hello World !" />

测试:

---------------------------------------------------

范例2:输出J2EE中域对象request, session, application, pageContext的数据

<!-- 输出J2EE中域对象request, session, application, pageContext的数据 -->
<%
// 这句话应该写在Controller中, 但是为了演示就写在这里
pageContext.setAttribute("username", "pageContext: 王五");
request.setAttribute("username", "request: 张三"); // 在jsp中, request是内置对象
session.setAttribute("username", "session: 李四");
application.setAttribute("username", "application: 赵六");
%>
<!-- 相当于request.getAttribute("username").tostring() -->
<!-- 当key值相同时, 四个域对象的c:out优先级: pageContext>request>session>application -->
<c:out value="${username }" /><br>

<!-- 如果找不到任何一个相匹配的key, 那么什么都不会输出, 也不报错 -->
<c:out value="${xxx }" /><br>
<!-- 如果设置了默认值, 那么将输出默认值 -->
<c:out value="${xxx }" default="没有值" />

测试:

---------------------------------------------------------

范例3: 是否解析/过滤<html>标签, 默认是true

 <!-- 是否解析<html>标签 --> 

<c:out value="<a href='http://www.sohu.com'>Sohu</a>" />

测试: <a href='http://www.sohu.com'>Sohu</a>

<c:out value="<a href='http://www.sohu.com'>Sohu</a>" escapeXml="false" />

测试: Sohu

-------------------------------------------------

范例4: 获取对象的属性

 创建包: com.itcast.jstl.domain, 包下创建User.java

User.java:

private String name;

private int age;

+ getter/setter

c_out.jsp:

<!-- 获取domain对象的属性 -->
<%
// 这里只是为了方便测试, 将User对象在这里实例化
User user = new User();
user.setName("小明");
user.setAge(10);
request.setAttribute("user1", user);
%>
User对象: <c:out value="${user1 }" /><br>
name属性: <c:out value="${user1.name }" /><br>
age属性: <c:out value="${user1.age }" />
<hr>
<!-- 使用EL表达式输出User对象及其属性 -->
${user1 } | ${user1.name } | ${user1.age }

测试:

------------------------------------------------

范例5: 使用<c:set>标签

这个标签不常使用, 因为在Controller中就设定了值

<!-- 设定值, 相当于: request.setAttribute("address", "中国, 北京") -->
<c:set var="address" value="中国, 北京" />
<br>
<!-- 获取值, 相当于: request.getAttribute("address") -->
<c:out value="${address }" />

测试:

 

 -------------------------------------------------

范例6: <c:remove>标签

c_remove.jsp:

<!-- remove标签演示 -->
<c:set var="abc" value="Hello" scope="request" /><br>
<c:out value="${abc }" />
<hr>
<!-- remove之后, var中写入set的var值, scope是域对象的类型,
如果不指定域对象, 那么就把四个域对象中的变量值都remove掉
-->
<c:remove var="abc" scope="request" />
<c:out value="${abc }" default="abc的值已经被remove了" />

 测试:

-------------------------------------------

范例7: <c:catch>标签

此标签用于捕获异常

c_catch.jsp:

<c:catch var="myException">
<% int i = 8 / 0; %>
</c:catch>
输出异常信息:<br>
1. 详细信息: <c:out value="${myException }" /><br>
2. 简单信息: <c:out value="${myException.message }" />

 测试:

 --------------------------------------

范例8: <c:if>标签

用于条件判断, 除了以下几种判断之外还有很多, 具体使用查手册

index.jsp: <jsp:forward page="/WEB-INF/c_if.jsp" />

(1) 字符串判断

 

c_if.jsp:

<%
          request.setAttribute("username", "Peter");
%>
      <!-- 使用c:if标签判断 -->
      <c:if test="${username == 'Peter' }">
          <h3>YES!</h3>
      </c:if>
      <c:if test="${username != 'Peter' }">
          <h3>NO!</h3>
      </c:if>

测试:根据条件输出YES!或者NO!

(2) 年龄范围判断, 会自动把字符型的age转换成数值型

<%
          request.setAttribute("age", "11");
      %>
      <!-- 使用c:if标签判断 -->
      <c:if test="${age > 10 and age < 20 }">
          <h3>年龄在10 - 20 之间</h3>
      </c:if>
      <c:if test="${age <= 10 or age >= 20 }">
          <h3>年龄不在10 - 20 之间</h3>
      </c:if>

(3) 获取对象的属性

Rat.java:

private String name;

private int age;

+ getter/setter()

c_if.jsp:

<%
          Rat rat = new Rat();
          rat.setName("Kitty");
          rat.setAge(10);
          request.setAttribute("rat", rat);
      %>
      <!-- 使用c:if标签判断 -->
      <c:if test="${rat.name == 'Kitty' and rat.age == 10 }">
          <h3>YES!</h3>
      </c:if>

注意: 底层rat.name和rat.age调用的是getXxx()方法, 并不是调用属性

---------------------------------------------

范例8: <c:choose>标签

<c:if>是单分支, <c:choose>是多分支, <c:choose>是父标签, 里面还有<c:when>和<c:otherwise>子标签

<%
          Rat rat = new Rat();
          rat.setName("Kitty");
          rat.setAge(4);
          request.setAttribute("rat", rat);
      %>
      <c:choose>
          <c:when test="${rat.age < 5 }">
              <font color="red">年龄太小</font>
          </c:when>
          <c:when test="${rat.age > 10 }">
              <font color="red">年龄太大</font>
          </c:when>
          <c:otherwise>
              <font color="green">年龄适合</font>
          </c:otherwise>
      </c:choose>

测试:

 

范例9: 迭代标签<c:foreach>

(1) 第一种foreach

<%
          List<Rat> rats = new ArrayList<Rat>();
          
          Rat rat1 = new Rat();
          rat1.setName("小宝");
          rat1.setAge(2);
          
          Rat rat2 = new Rat();
          rat2.setName("大宝");
          rat2.setAge(5);
          
          Rat rat3 = new Rat();
          rat3.setName("老宝");
          rat3.setAge(10);
          
          rats.add(rat1);
          rats.add(rat2);
          rats.add(rat3);
          
          request.setAttribute("rats", rats);
      %>
      使用传统方法获取, java片段:<br>
      <%
          List<Rat> allRats = (List<Rat>)request.getAttribute("rats");
          for(Rat rat : allRats) {
              out.println(rat.getName() + " | " + rat.getAge() + "<br/>");
          }
      %>
      <hr>
      使用c:foreach标签获取:<br>
      <c:forEach items="${rats }" var="rat">
          <c:out value="${rat.name }" /> | <c:out value="${rat.age }" /><br/>
      </c:forEach>

测试:

(2) 第二种foreach

<c:forEach var="i" begin="1" end="10">
        <c:out value="${i }" />,
    </c:forEach>

测试:

(3) 第三种foreach: 可以指定步长

<c:forEach var="i" begin="1" end="10" step="3">
        <c:out value="${i }" />,
    </c:forEach>

测试:

(4) c:forTokens, 使用分隔符

<c:forTokens items="12,56,你好!" delims="," var="splitPart">
        <!-- 这里直接使用EL表达式输出 -->
        ${splitPart }
    </c:forTokens>

测试:

 --------------------------------------------

10. <c:foreach>标签遍历Map集合

c_foreach_map.jsp:

<%
          Map<String, String> all = new HashMap<String, String>();
          all.put("p1", "Peter");
          all.put("p2", "Tom");
          all.put("p3", "Lucy");
          request.setAttribute("persons", all);
      %>
      <!-- 从Map集合中取出key和value -->
      <c:forEach items="${persons }" var="person">
          key: ${person.key } , value: ${person.value } <br>
      </c:forEach>

测试:

如果Map中的value放入的是对象, 怎么取值?

<%
          Map<String, Object> all = new HashMap<String, Object>();
      
          Rat rat1 = new Rat();
          rat1.setName("小宝");
          rat1.setAge(2);
          
          Rat rat2 = new Rat();
          rat2.setName("大宝");
          rat2.setAge(5);
          
          all.put("l_Rat", rat1);
          all.put("m_Rat", rat2);
          
          request.setAttribute("rats", all);
      %>
      <!-- 从Map集合中取出key和value -->
      <c:forEach items="${rats }" var="rat">
          key: ${rat.key } , name: ${rat.value.name } , age: ${rat.value.age } <br>
      </c:forEach>

测试:

11. <c:foreach>标签遍历Set集合

<%
          Set all = new HashSet();
      
          Rat rat1 = new Rat();
            rat1.setName("小宝");
            rat1.setAge(2);
    
           Rat rat2 = new Rat();
           rat2.setName("大宝");
           rat2.setAge(5);
           
           all.add(rat1);
           all.add(rat2);
           
          request.setAttribute("rats", all);
      %>
      <!-- 从Set集合中取出key和value -->
      <c:forEach items="${rats }" var="rat">
          name: ${rat.name } , age: ${rat.age } <br>
      </c:forEach>

测试:

添加功能: 如果集合中没有对象, 即集合是空的, 那么给出提示, 实现:

<%
          Set all = new HashSet();
      
          Rat rat1 = new Rat();
            rat1.setName("小宝");
            rat1.setAge(2);
    
           Rat rat2 = new Rat();
           rat2.setName("大宝");
           rat2.setAge(5);
           
           all.add(rat1);
           all.add(rat2);
           
          request.setAttribute("rats", all);
      %>
      <!-- 从Set集合中取出key和value -->
      <c:choose>
          <c:when test="${empty rats }">
              <font color="red">没有任何对象</font>
          </c:when>
          <c:otherwise>
              <c:forEach items="${rats }" var="rat">
                  name: ${rat.name } , age: ${rat.age } <br>
              </c:forEach>
          </c:otherwise>
      </c:choose>

测试:

  

12. <c:redirect>重定向

<!-- 重定向到百度 -->
      <c:redirect url="http://www.baidu.com" />

输入http://localhost:8080/jstl, 回车就会重定向到百度

13. <c:import>引入别的页面

<c:import url="/WEB-INF/a.jsp" />
      <c:import url="/WEB-INF/b.jsp" />

a.jsp: <h4>Page a.jsp</h4>

b.jsp: <h4>Page b.jsp</h4>

测试:

 

posted @ 2017-03-07 20:11  半生戎马,共话桑麻、  阅读(123)  评论(0)    收藏  举报
levels of contents