JSTL学习笔记

JSTL是java中的一个定制标记库集,全称为JSP Standard Tag Library。

为什么要是用JSTL?

1、实现了JSP页面中的代码复用

2、书写JSP页面时可读性更强

在JSP页面中使用JSTL标记时,需要添加下面这个指令

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:out value="输出内容"></c:out> //核心库
Ps:在uri中之所以能找到该http,是因为导入了jar,否则是找不到的。prefix="c",里面的名字可以自定义,一般为“c”。

标签属于核心库

JSTL总共有6个标签库,分别是核心库、格式化库、数据库标签库、XML库、函数库、TLV

JSTL标签的value属性的属性值可以为变量和常量.

变量需要通过EL表达式来获取.


什么是EL表达式

全名为Exoression Language

经常与JSTL配合使用,使得JSP页面更直观,写法更简单

普通写法:

`<%=session.getValue("name") %>`

EL表达式:

<c:out value="${sessionScope.name}"/>

EL表达式的格式

用美元符号”$”定界,内容包括在花括号”{}”中; ${表达式}

EL表达式的基本格式:用美元符号“$”定界,内容包括在花括号“{}”中——${表达式}。

EL表达式中的”.”与”[]”运算符:

通常情况两者通用,eg:${user.sex}等同于${user["sex"]};

其中"[]"还可以用来进行集合元素中的定位${booklist[0].price}。

不通用的情况:

1、包含特殊符号:

如${user.first-name}则为错误的写法,正确的:${user[“first-name”]};

2、通过变量动态的取值时:${user[param]}—param可以是name or sex or others,是用户传入的情况。

而”.”不能动态取值,它的写法是:${user.name}or${user.sex}or…

EL变量

JSP内置对象 || EL变量范围

pagerequest || pageScope

request || requestScope

session || sessionScope

application || applicationScope

<c:out value="${username}" />

运行时,会依次在page->session->request->application范围中寻找名为username的变量,然后输出其值。但是如果没有,就返回空字符串。

EL自动类型转换

要取得文本框中的输入,我们需要做类型转换

普通写法:

String str_count = request.getParameter("count");
int count = Integer.parseInt(str_count);
count = count + 20;

EL会进行自动类型转换,只需要这样写:

${param.count +20}

c:out 标签

<!-- 1、使用out标签输出常量 -->
<c:out value="慕课网" ></c:out>
<hr>
<!-- 2、使用out标签输出变量 -->
<!-- 直接输出变量 -->
<%session.setAttribute("name", "Bob"); %>
<c:out value="${name}"></c:out>
<hr>
<!-- 3、当变量不存在时,通过default属性输出默认值 -->
<c:out value="${name1}" default="error"></c:out>
<hr>
<!-- 4、设置输出转义后的字符需要escapeXml属性值设置成false,escapeXml默认值:true -->
<c:out value="<out标签>" escapeXml="false"></c:out>

c:set 标签

<!-- 第一种写法 -->
<c:set value="today" var="day" scope="session"></c:set>
<c:out value="${day}"></c:out>




four





//将Javabean实例化为person



123456

Ps:不能同时有“var”和“target”属性。“scope” 是可选的,如果没有使用这个属性,则默认为页面作用域。

c:remove 标签

<c:set var="lastName" value="Bob" ></c:set>
<c:out value="${lastName}"></c:out>
<c:set var="firstName" value="Jack" ></c:set>
<c:remove var="firstName"></c:remove>
<c:out value="${firstName}"></c:out>

Ps:remove的对象只能是某一个变量,不能是一个jsp:useBean中的某一个属性。

c:catch 标签

catch标签中可以包含哪些容易出错的JSTL标签(逻辑)

`<c:catch var="error">
    //如果这段出错,错误信息将保存到error变量中
    <c:set target="aa" property="bb">asasa</c:set> 
</c:catch>

<c:out value="${error}"></c:out> //输出error,即输出错误信息`

c:if 标签

`//先构建一个表单
<form action="index.jsp" method="post">
    <input type="text" name="score" value="${param.score}" />
    <input type="submit"/> //这是一个提交按钮
</form>

<!-- 优秀:score>=90 -->
<c:if test="${param.score>=90}" var="result" scope="session">
    <c:out value="你的成绩:优秀——${sessionScope.result}"></c:out>
</c:if>`

Ps:$(param.user)相当于<%=request.getParameter(“user”)%>;$(paramValues.favorites[0])相当于<%=request.getParameters(“favorites”)[0]%>。

choose-when-otherwise标签

通常这三个标签被放在一起配合使用

标签嵌套在标签外面作为他们的父标签来使用

其中choose和when标签也可以一起组合使用

`<c:choose>
    <c:when test="${param.score<=100 && param.score>=60 }">
        <c:out value="及格"></c:out>
    </c:when>

    <c:when test="${param.score<60 && param.score>=0 }">
        <c:out value="不及格"></c:out>
    </c:when>

    <c:otherwise>
        <c:out value="请检查你的输入!"></c:out>
    </c:otherwise>
</c:choose>`

foreach 标签

-根据循环条件遍历集合(Collectoin)中的元素

  • var设定变量名用于存储从集合中取出元素(必须无默认值)
  • items指定要遍历的集合(必须无默认值)
  • begin、end用于指定遍历的起始位置和终止位置(有默认)
  • step指定循环的步长(有默认)
  • varStatus通过index、count、first、last几个状态值,描述begin和end子集中的元素状态


    `<%
    List<String> fruits=new ArrayList<String>();
    fruits.add("apple");
    fruits.add("pear");
    fruits.add("orange");
    fruits.add("banana");
    request.setAttribute("fruits", fruits);
    
    %><hr>
    <c:out value="${fruit}"></c:out><br>
    
    <hr>
    <c:out value="${fruit}"></c:out><br>
    
    <hr>
    <c:out value="${fruit}"></c:out><br>
    
    `

Ps:step默认值:1。



<!-- 用法四:部分遍历并带状态 --> <c:forEach var="fruit" items="${fruits}" begin="1" end="3" varStatus="fru"> <c:out value="${fruit}——四个属性:"></c:out><br> <c:out value="index属性:${fru.index}"></c:out><br> <c:out value="count属性:${fru.count}"></c:out><br> <c:out value="first属性:${fru.first}"></c:out><br> <c:out value="last属性:${fru.last}"></c:out><br> <c:out value="----------"></c:out><br> </c:forEach>

Ps:index从0开始;count从1开始;first是否第一个(boolean);last是否最后一个(boolean)。

forTokens 标签

<c:forTokens items="400-888888-123" delims="-" var="num">
     <c:out value="${num}"></c:out><br>
</c:forTokens>

import标签

语法格式:

<c:import url="" context="" var="" scope="" charEncoding="" varReader="">
</c:import>
  • .url被导入资源的URL路径
  • .context相同服务器下其他的web工程,必须以”/“开头
  • .var以String类型存入北包含文件的内容
  • .Scope var变量的JSP范围
  • .charEncoding被导入文件的编码格式
  • .varReader以Reader类型存储被包含文件内容

`<!-- 导入网络上的绝对路径 -->
<c:catch var="error0">
    <c:import url="http://www.imooc.com"></c:import>
</c:catch>

<c:out value="${error0}"></c:out>`



`


<c:out value="${error1}"></c:out>`

Ps:由于可能网络中断导致抛出异常,所以常常把import标签放在catch标签里。

redirect标签

  • -该标签用来实现请求的重定向,同时可以在url中加入指定的参数
  • .url指定重定向页面的地址,可以是一个string类型的绝对地址或相对地址
  • .context用于导入其他web应用中的页面

    @temp.jsp
    username:<c:out value="${param.username}"></c:out>
    password:<c:out value="${param.password}"></c:out>
    

    @index.jsp
    <!-- redirect标签用法 -->
     <c:redirect url="temp.jsp">
         <c:param name="username">Lily</c:param>
         <c:param name="password">123456</c:param>
     </c:redirect>
    

JSTL函数

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
//使用JSTL函数时要有这句
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<c:out value="“Hello World”字符串中是否包含“Hello”?${fn:contains('Hello World','Hello')}"></c:out>

  <c:out value="“Hello World”字符串中是否包含“ABCD”?${fn:contains('Hello World','ABCD')}"></c:out>

  <c:out value="“Hello World”字符串中是否包含“hello”(忽略大小写)?${fn:containsIgnoreCase('Hello World','hello')}"></c:out>

  <c:out value="“Hello”是否在“Hello World”字符串开头?${fn:startsWith('Hello World','Hello')}"></c:out>

  <c:out value="“world”是否在“Hello World”字符串尾部?${fn:endsWith('Hello World','world')}"></c:out>