码迷,mamicode.com
首页 > Web开发 > 详细

JSTL

时间:2014-11-29 18:49:55      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   ar   os   使用   sp   

作者:禅楼望月

1 安装JSTL1.1

①需要将"jstl.jar"和"standard.jar"放在Web应用的WEB-INF/lib目录中。
②jsp页面引用JSTL标准标签 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    ,若uri不知道是什么,则可以打开/java Resources/Libraies/web App Librarues目录下的standars.jar包下META-INF目录下c.tld(xml文件)里面查找,如图所示:
bubuko.com,布布扣
③最后在页面直接使用JSTL标准标签库。

2 <c:out>

用来显示一个表达式的结果,与<%= %>作用相似。
<c:out>标签有如下属性:
属性描述是否必要默认值
value 要输出的内容
default 输出的默认值 主体中的内容
escapeXml 是否忽略XML特殊字符 true
①显式地声明转换XML实体
  1. <div>
  2. <b>Tip of the Day:</b><br/><br/>
  3. <c:outvalue="${pageContent.rawHTML}"escapeXml="true"/>
  4. </div>
显式地声明不转换XML实体
将escapeXml设置为false即可。
bubuko.com,布布扣escapeXml默认值为true。
以下5种字符需要转换
字符 字符实体码
< &lt;
> &gt;
& &amp;
&#039;
" &#034
  1. <c:out value="<hr>原样输出HTML标签<hr>" escapeXml="true"/><br>
  2. <c:out value="<hr>转换HTML标签并输出<hr>" escapeXml="false"/>
 
bubuko.com,布布扣bubuko.com,布布扣使用EL输出用户输入的内容会存在"跨域攻击"的危险
        跨域攻击是指,一个用户使用你的web应用作为传输机制向另一个用户的web浏览器发动攻击。
        使用<c:out>则可以避免这种情况。
 NULL值的处理
EL遇到NULL值什么也不会打印。但是<c:out>可以设置默认值:
  1. value值为NULL时,默认值
  2. <c:outvalue="${null }"default="houhou"></c:out><br>

3 循环<c:forEach>

<c:forEach>标签有如下属性:

属性描述是否必要默认值
items 要被循环的信息
begin 开始的元素(0=第一个元素,1=第二个元素) 0
end 最后一个元素(0=第一个元素,1=第二个元素) Last element
step 每一次迭代的步长 1
var 代表当前条目的变量名称
varStatus 代表循环状态的变量名称
Servlet中:
  1. package jstl;
  2. import java.io.IOException;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. publicclass jstlServlet extendsHttpServlet{
  6. publicvoid doGet(HttpServletRequest request,HttpServletResponse response)
  7. throwsServletException,IOException{
  8. response.setContentType("text/html");
  9. String[] movieList={"A","B","C"};
  10. request.setAttribute("movieList", movieList);
  11. getServletContext().getRequestDispatcher("/UseJSTL.jsp").forward(request, response);
  12. }
  13. publicvoid doPost(HttpServletRequest request,HttpServletResponse response)
  14. throwsServletException,IOException{
  15. doGet(request, response);
  16. }
  17. }
JSP中:
  1. <%@ page language="java"import="java.util.*" pageEncoding="utf-8" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. </head>
  7. <body>
  8. <table>
  9. <c:forEachvar="movie"items="${movieList }">
  10. <tr>
  11. <td>${movie }</td>
  12. </tr>
  13. </c:forEach>
  14. </table>
  15. </body>
  16. </html>
打印出的结果:
bubuko.com,布布扣
bubuko.com,布布扣
还可用一个可选属性(varStatus)得到计数器
  1. <tablestyle="border:solid 1px red">
  2. <c:forEachvar="movie"items="${movieList }"varStatus="movieLoopCount">
  3. <tr>
  4. <tdstyle="border:solid 1px red">${movie}</td>
  5. <tdstyle="border:solid 1px red">count:${movieLoopCount.count }</td>
  6. </tr>
  7. </c:forEach>
  8. </table>
bubuko.com,布布扣
bubuko.com,布布扣
<c:forEach>可以嵌套
如:
Servlet中:
bubuko.com,布布扣
JSP中:
bubuko.com,布布扣
关于步长:
bubuko.com,布布扣
还可以有begin和end属性来选取集合的一个子集。
对map和set的迭代:
bubuko.com,布布扣
bubuko.com,布布扣

4 <c:if test="">  没有else的if

<c:if>标签有如下属性:

属性描述是否必要默认值
test 条件
var 用于存储条件结果的变量
scope var属性的作用域 page
bubuko.com,布布扣
 
bubuko.com,布布扣
bubuko.com,布布扣
判断不为空
bubuko.com,布布扣
bubuko.com,布布扣该标签没有else属性。那么怎么来表示if……else……呢?

5 <c:choose> 代替if……else…… 

  • <c:choose>标签没有属性。
  • <c:when>标签只有一个属性,在下表中有给出。
  • <c:otherwise>标签没有属性。

 

<c:when>标签的属性如下:

 

属性描述是否必要默认值
test 条件
bubuko.com,布布扣
bubuko.com,布布扣<c:choose>可以没有<c:otherwise>

6 <c:set>  代替<jsp:setProperty>

<c:set>标签有如下属性:

属性描述是否必要默认值
value 要存储的值 主体的内容
target 要修改的属性所属的对象
property 要修改的属性
var 存储信息的变量
scope var属性的作用域 Page
<jsp:setProperty>  只能设置bean的属性。但是<c:set>可以设置任何东西的值。
<c:set> 有两版本:① var   版本,用来设置属性变量;②target  版本,用来bean性质或Map值,但是不能用来向数组或列表中增加元素。
① var   版本   
<c:set var="" scope="" value=""/> 使用var来定义变量。  
bubuko.com,布布扣
target  版本 
  
bubuko.com,布布扣
bubuko.com,布布扣<c:set>   要点
①不能同时有var和target。
scope是可选的,默认值为页面(page)作用域,即,没有scope时,只会在页面(page)作用域中查找。
③如果value为null,则var指定的属性将被删除
④若var属性不存在,则会创建一个新属性,但仅当value不为null时才会创建新属性。
⑤若target表达式为null,容器抛异常。
⑥若target表达式不是bean或map,容器抛异常。
⑦若target表达式是一个bean,但是这个bean没有与property匹配的属性,容器抛异常。EL表达式${bean.notAProperty}也会抛异常
 

7 <c:remove>  移除一个变量

<c:remove>标签有如下属性:

属性描述是否必要默认值
var 要移除的变量名称
scope 变量所属的作用域 所有作用域

8 第三种导入其他页面的方法<c:import

<c:import>标签有如下属性:

属性描述是否必要默认值
url 需要检索和引入的页面的URL
context / 紧接着一个本地网络应用程序的名称 当前应用程序
charEncoding 所引入的数据的字符编码集 ISO-8859-1
var 用于存储所引入的文本的变量 Print to page
scope var属性的作用域 Page
varReader 可选的用于提供java.io.Reader对象的变量
 
第一种:静态导入<%@ include  file="/index.jsp"%>
第二种:动态导入<jsp:include page="index.jsp"/>
第三种:动态导入<c:import url="http://www.baidu.com"/>
在请求时将URL属性值制定的内容增加到当前页面。与<jsp:include>非常相似但是功能更加强大。前两种被被包含的页面不能超出本站范围,但是<c:import可以。
也可以利用<c:param传参数。
bubuko.com,布布扣

9 强大的<c:url><c:param>可以满足所有超链接需求

<c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。

 

在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。

 

<c:param>标签有如下属性:

属性描述是否必要默认值
name URL中要设置的参数的名称
value 参数的值 Body

<c:url>标签有如下属性:

属性描述是否必要默认值
value 基础URL
context 本地网络应用程序的名称 当前应用程序
var 代表URL的变量名 Print to page
scope var属性的作用域 Page

 

<c:url>可以自动实现URL重写。
Servlet的URL重写:
bubuko.com,布布扣
JSP的URL重写:
bubuko.com,布布扣
URL编码:
URL通常需要编码。意思是,把不安全/保留的字符替换为其他字符,然后再在服务器端完成解码。
例子:
加入URL中不能包含空格,但是可用一个+“+”来代替。
bubuko.com,布布扣<c:url>不会自动对URL编码。
bubuko.com,布布扣

10 说说错误页面

在无法保证一个错误都没有的情况下,更友好的解决方式是建立一个错误响应页面,然后使用page指令配置错误页面。
①设计一个错误响应页面:
bubuko.com,布布扣
②为有可能出现错误的页面配置错误页面:
bubuko.com,布布扣
bubuko.com,布布扣问题来了---->我是不是得花很大的功夫为每一个jsp配置错误页面呢?如果想为不同的错误制定不同的错误页面怎办呢?
在DD中可以根据<exception-type>或HTTP状态码<error-code>声明错误页面。
声明一个“普通”型错误页面。
bubuko.com,布布扣
这样就为整个Web应用中所有部分设置了默认的错误页面。
bubuko.com,布布扣
当要为单个JSP设置一个特定的错误页面,在该JSP的page指令的errorPage属性覆盖这个设置即可。
为更明确的一个异常声明错误页面。
bubuko.com,布布扣
根据一个HTTP状态码声明错误页面
bubuko.com,布布扣
当一个页面声明为错误页面时,该页面立即得到一个其他页面没有的对象:exception
bubuko.com,布布扣
bubuko.com,布布扣自己能通过程序生成错误码吗?
可以!!!调用HttpServletResponse的sendError方法,它会告诉容器生成错我,就好像是容器自己生成的一样。如果已经根据这个错误码配置了一个要发送给客户端的错误页面,客户就会得到这个错误页面。错误码也成为状态码,他们指的是同一个东西。

11 JSP的异常捕捉<c:catch>相当于try块(注意没有catch块)

<c:catch>标签有如下属性:

属性描述是否必要默认值
var 用来储存错误信息的变量 None
应该将有风险的EL或标记调用(或其他部分)包在的<c:catch>体中。异常就会在这里被捕获。一旦有异常发生,控制就会跳至<c:catch>标记体的后面。
bubuko.com,布布扣
<c:catch>标记结束后访问异常该怎么办?
bubuko.com,布布扣
正确的做法是:
bubuko.com,布布扣

12 <c:forTokens>标签将字符串分隔为一个子串数组然后迭代它们 

<c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:

属性描述是否必要默认值
delims 分隔符
bubuko.com,布布扣

13 <c:redirect>重定向

c:redirect标签有如下属性:

属性描述是否必要默认值
url 目标URL
context 紧接着一个本地网络应用程序的名称 当前应用程序
<c:redirect url="http://www.w3cschool.cc"/> 

 14 理解TLD

TLD描述了两个主要的内容:定制标记和EL函数。EL函数我们在EL中已经讲过了。
bubuko.com,布布扣
bubuko.com,布布扣怎么知道属性的类型呢?
<attribute>有一个可选属性, <type>它取一个完全限定类名作为类型。
bubuko.com,布布扣标记体<body-content>里面能放什么内容呢?
可以放4种内容:①empty:这个标记不能有体。
                              ②scriptless:这个 标记不能有脚本元素,但可以是模板文本和EL,还可以是定制和标准动作。
                              ③tagdependent:标记体要看作是纯文本,所以不会计算EL,也不会触发标记/动作。
                              ④JSP:能在放在JSP中的东西都能放在这里。
bubuko.com,布布扣对于<body-content>内容为empty,我们怎么调用标记?
有3种方法:①标记以斜线"/"结尾,省略结束标记。
                      ②在开始标记和结束标记之间不要放任何内容。
                      ③在开始标记和结束标记之间放<jsp:attribute>标记
bubuko.com,布布扣容器在那些地方查找TLD呢?
在4个位置查找:①直接WEB-INF目录中查找。
                              ②直接WEB-INF一个子目录中查找
                              ③在WEB-INF/lib下一个JAR文件中的META-INF中查找。
                              ④WEB-INF/lib下一个JAR文件中的META-INF目录中的子目录中查找。

15 实现一个定制标记处理器

首先我们建立一个TLD,设置我们自定义的标签:
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!DOCTYPE taglib
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  4. "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
  5. <taglib>
  6. <tlib-version>1.0</tlib-version>
  7. <jsp-version>1.2</jsp-version>
  8. <short-name>RandomTags</short-name>
  9. <uri>randomThings</uri>
  10. <description>
  11. A simple tab library for the examples
  12. </description>
  13. <tag>
  14. <name>advice</name>
  15. <tag-class>jstl.AdvisorTagHandler</tag-class>
  16. <body-content>empty</body-content>
  17. <description>
  18. random advice
  19. </description>
  20. <attribute>
  21. <name>user</name>
  22. <required>true</required>
  23. <rtexprvalue>true</rtexprvalue>
  24. </attribute>
  25. </tag>
  26. </taglib>
完成工作的Java类:
bubuko.com,布布扣
bubuko.com,布布扣注意:再采用EL函数时,要创建一个有公共静态方法的Java类,并且该方法的名字可以自己取,再在TLD中映射即可,但是在利用定制标记是,该方法名不能自定义,只能是doTag。

判断是否为空或是否为null

JSTL 判断对象是否为空

<C:IF 判断对象或集合是否为空

判断集合和对象是否为空:

list为集合,user为对象名
<c:if test="${empty user}">无user信息!TODO...</c:if>为空
<c:if test="${!empty list}">list集合不为空判断,TODO...</c:if>非空

 

<S:IF 判断对象是否为空

<s:if test="null==user||user.isEmpty()">
集合为空
</s:if><s:else>
集合不为空
</s:else>

or
<s:if test="null!=user&&!user.isEmpty()">
集合不为看空
</s:if>

 





JSTL

标签:des   style   blog   http   io   ar   os   使用   sp   

原文地址:http://www.cnblogs.com/yaoyinglong/p/JSTL.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!