JSTL标签库的知识--其实为EL,HTTP技术的综合

--------学了自定义标签,也知道很多公司,都有自己的自定义的一套标签库,比如擅长做金融产品的公司,一般都有自己的一套自己写的针对金融产品的标签库,但是像我们平时做的中小系统,就没必要都自己去写一套标签库了,我们有现成的会使用就好!比如很常用的JSTL!
-------JSP Standard Tag Library(简称JSTL),是一套预先定义好、协助程序设计人员简化JSP网页制作的标签函数库,规格包含了各种网页运作所需的运用,例如循环、流程控制、输入/出、文本格式化,甚至XML文件处理及数据库访问操作均为其涵盖范围。
-------到JSP2.0后,通过结合使用EL,可以开发出没有java代码的JSP,这使得JSP的开发非常简单,非Java程序员都能胜任。另外,通过使用JSTL可以使
程的代码量大大减少。


image.png

image.png

使用核心标签


image.png

[#1.设置JSTL运行环境]

1.1下载JSTL的jar包,下载地址:http://tomcat.apache.org/taglibs/standard/

Impl: taglibs-standard-impl-1.2.5.jar JSTL实现类库
Spec: taglibs-standard-spec-1.2.5.jar JSTL标准接口
EL: taglibs-standard-jstlel-1.2.5.jar JSTL1.0标签-EL相关
Compat: taglibs-standard-compat-1.2.5.jar 兼容版本
如果不使用JSTL1.0标签,可以忽略taglibs-standard-jstlel包,taglibs-standard-compat包,应该是兼容以前版本标签库,所以一般只需要 taglibs-standard-impl 和 taglibs-standard-spec 两个jar包

1.2.也可以不用下载,不下载可以到tomcat目录里去copy也是可以的!

apache-tomcat-8.5.55\webapps\examples\WEB-INF\lib中有对应的包,复制到lib下即可。

1.3.配置页面taglib 若不记得uri(页面taglib配置需要).

可以解压包,打开如c.tld文件,找到uri, 复制用即可。
<uri>http://java.sun.com/jsp/jstl/core</uri>
----> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

2.核心标签库的应用。

2.1 <c:out>

语法1:未包含主体(body)
<c:out value= "value" [escapeXml= "{true|false}"]
[default= "defaultValue"] />

语法2:包含主体(body)
<c:out value= "value" [escapeXml= "{true|false}"]>
default value
</c:out>
语法3:将value值储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName" value="值"/>
语法4:将本体(body)内容储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName">
body content
</c:set>

image.png

例:

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:out value="jstl tag"></c:out>
</body>
</html>
测试:http://localhost:8080/mvcproject/jstltest/c_out.jsp
jstl tag

测试:因为本测试在 mvcproject项目中测试的

2.<c:set>

语法1:将value值储存至范围变量varName
<c:set value="value" var="varName"
[scope="{page|request|session|application}"]/>**
语法2:将本体(body)内容设定储存至范围变量varName
<c:set var="varName" [scope="{page|request|session|application}"]>
body content
</c:set>
语法3:将value值储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName" value="值"/>
语法4:将本体(body)内容储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName">
body content
</c:set>

image.png

例:

<br>
<%
    User user =new User();   //javaBean---cn.ybzy.mvcproject.model.User
    pageContext.setAttribute("user",user);   //页面域对象,本页有效
    out.println("没有设置用户姓名前"+user);    //为null
%>
<c:set target="${user}" property="username" value="熊少文"/>
<br>
c_set之后:
<c:out value="${user.username}"/>
<br/>
<c:out value="${user.getUsername() }"/>   <!-- 这个和以上一个,两个c:out结果一样 -->

测试:http://localhost:8080/mvcproject/jstltest/c_out.jsp
没有设置用户姓名前User [id=0, username=null, password=null, phoneNo=null, address=null, regDate=null] 
c_set之后: 熊少文 
熊少文

3.<c:remove>

用来移除某个范围变量的內容值

<c:remove var="varName"
[scope="{page|request|session|application}"]/>

4.<c:url>标签

作用是将一个URL地址格式化为一个字符串,并且保存在一个变量当中。它具有URL自动重写功能。value指定的URL可以是当前工程的一个URL地址,也可以是其他web工程的URL。但是这时需要context属性,context:其他工程路径。也可以添加需要传递的参数
语法1:无本体内容,就是单纯的显示url地址

<c:url value="value" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]/>

语法2:在本体内容指定url地址的参数?+的形式跟在后面

<c:url value="value" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]>
<c:param name="" value=""></c:url>
image.png

****核心标签中的if、choose和when,提供相当于程序语言流程控制的功能 。**
-------<c:choose>则被运用于需要进行多重判断的场合,它本身是一个框架,判断内容则由<c:when>和<c:otherwise>两个标签完成 。

5.<c:if> 条件表达式一般用EL.

与Java中的if语句相同 。
语法1:无本体内容
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
语法2:包含本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
body content
</c:if>

<c:if test ="${3>20}" var ="rs"/>
<c:out value="${rs}"/>

<c:if test="${3<4 }" var ="rs">
      <c:out value="${rs}"/>
   </c:if>

6.<c:choose>、<when>与<otherwise>

<c:choose>标签与Java的switch语句的功能一样,用于在众多选项中做出选择。
语法 - <c:choose>

<c:choose>
   <c:when test="<boolean>">
       ...
   </c:when>
  <c:when test="<boolean>">
     ...
  </c:when>
    ...
     ...
   <c:otherwise>
      ...
   </c:otherwise>
</c:choose>

例1:
 
   <c:choose>
   <c:when test="2>1">
       2>1
   </c:when>
  <c:when test="4>3">
     4>3
  </c:when>
  <c:otherwise>
      6>5
   </c:otherwise>
</c:choose>
结果: 6>5
这结果明显示,不符合我们的要求。而应这样
<c:set value="1" var ="var"/>
   <c:choose>
   <c:when test="${var==1}">
       2>1
   </c:when>
  <c:when test="${var==2 }">
     4>3
  </c:when>
  <c:otherwise>
      6>5
   </c:otherwise>
</c:choose>

7.<c:forEach> 循环。

语法1:迭代对象集合内容。
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
语法2:迭代特定次数。
<c:forEach [var="varName"] [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
var每次从集合里拿出来的一个数据, 放进var指定的变量里 。items注入到jsp页面的集合类的数据, 放在这里头。varStatus也就是status封装了当前遍历的状态,比如,可以从该对象上
查看是遍历到了第几个元素:

${status.count}
<c:out value=”${status.current}”/>当前对象
<c:out value=”${status.index}”/>此次迭代的索引
<c:out value=”${status.count}”/>已经迭代的数量
<c:out value=”${status.first}”/>是否是第一个迭代对象
<c:out value=”${status.last}”/>是否是最后一个迭代对象

例:输出List集合<String> 姓名

1.TagController.java


@WebServlet(urlPatterns = {"*.tag"})
public class TagController extends HttpServlet {
..................................................................................................
private void index(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         Map<String,Integer> map = new HashMap<>();
         map.put("张三",20);
         map.put("李四",21);
         map.put("小白", 22);
        // req.setAttribute("map", map);
         //req.getRequestDispatcher("/tag/FirstTag.jsp").forward(req, resp);
         List<String> lists = new ArrayList<>();
         lists.add("张三");
         lists.add("李四");
         lists.add("王二");
         lists.add("麻子");

      Date date = new Date();
       req.setAttribute("date", date);

      req.setAttribute("list", lists);
       req.getRequestDispatcher("/jstltest/forEach.jsp").forward(req, resp);
  }


2.forEach.jsp


 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<body>
  <c:forEach items="${list}" var="u">
     <c:out value="${u}" />   <br/><br/>
  </c:forEach>

<table border="1" cellpadding="0" cellspacing="0">
<c:forEach items="${list}" var="u" varStatus="status">
    <tr>
    <td>现在循环到第 ${status.count} 个了!是第一个吗?${status.first }</td>
    <td>${u}</td>
    </tr>
  </c:forEach>
  </table>

 <c:forEach var="vvv" begin="1" end ="10" step="2">
  ${vvv }<br/>                               <!--输出1 3 5 7 9-->
  </c:forEach>

<!--下面的代码用的不多  -->
  <c:forTokens items="xiong,shao,wen" delims="," var = "name">
  <c:out value="${name}"/>  <p>
  </c:forTokens>  
</body>


3.测试:
http://localhost:8080/mvcproject/index.tag

8格式化

①函数的fn.tdl复制进工程
③<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

格式化日期
<fmt:formatDate value="date" [type="{time|date|both}"][dateStyle="{default|short|medium|long|full}"]
[timeStyle="{default|short|medium|long|full}"]
[pattern="customPattern"]
[timeZone="timeZone"]
[var="varName"]
[scope="{page|request|session|application}"]/>

image.png

例:首先由上例中的控制类注入一个当前日期时间到jsp中,上拉可看到。
其次:forEach.jsp中定上:

没有格式化的日期时间:  ${date}
  <br>
  格式化之后的日期时间:
   <fmt:formatDate value ="${date }" dateStyle="full"/><br/>
   <fmt:formatDate value ="${date }"  type="time" timeStyle="full"/><br><br/>
   <fmt:formatDate value ="${date }" type="both" pattern="yyyy-MM-dd HH:mm:ss"/>

测试:http://localhost:8080/mvcproject/index.tag
没有格式化的日期时间: Mon Jun 21 13:05:01 CST 2021 
格式化之后的日期时间: 2021年6月21日

下午01时05分01秒

2021-06-21 13:05:01

数字格式化

image.png

9.函数标签库。

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
我们常用的也就是字符串处理,这里只列举字符串函数。
函数是作为表达式用的,不是标签形式。

image.png

image.png

例:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <c:set var="string1" value="This is first String"/>
  <c:set var="string2" value="${fn:substring(string1,1,4)}"/>
  <c:out value="${string2 }"/>
${string2}
</body>
</html>

EL,JSTL改造mvcproject.

index.jsp

1.判断用户登录,输入的密码,用户名,验证码是否错误‘提示语’note是否为空。

<%
          if (request.getAttribute("note") != null) {
%>
    <span style="color: red; font-weight: bolder;"><%=request.getAttribute("note")%></span>

    <%
        }
    %>
 改为:
  <c:if test="${not empty requestScope.note}">
      <span style="color: red; font-weight: bolder;">${note }</span>
</c:if>

main.jsp

1.利用session空间的东西,判断用户是否已登录成功,不是重新登录,不会直接输入该页而进入该页面。

<%
        String username = (String)request.getSession().getAttribute("user");//如果session空间里有username,表明该username已登 陆成功,由于没计好,用user当username了。
        if(username==null ||"".equals(username)){
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }
%>
改为:
<c:if test="${empty sessionScope.user }">
       <c:redirect url="/index.jsp" context="${pageContext.request.contextPath}"/>
</c:if>
改了以后,有一个问题,所以后用过滤器来改

2.循环遍历记录,显示在表格中。

<%
            List<User> list = (List<User>) request.getAttribute("userlist");
            if(list !=null && list.size()>0){
                for(User user:list){
           
%>
        <tr>
            <td><%=user.getId()%></td>
            <td><%=user.getUsername()%></td>
            <td><%=user.getPassword()%></td>
            <td><%=user.getPhoneNo() %></td>
            <td><%=user.getAddress() %></td>
            <td><%=user.getRegDate() %></td>
            <td><a href="<%=request.getContextPath()%>/update.udo?id=<%=user.getId()%>">编辑</a> | <a href="<%=request.getContextPath()%>/delete.udo?id=<%=user.getId()%>">删除</a></td>
        </tr>
        <%}
                
            }
        %>
    </table>
改为:

update.jsp

1.判断用户名是否已存在(不包括自已上),不能修改已存在的记录。

<%
           String note =(String) request.getAttribute("note");  //note是由UserControlller.java--updatedo传来的req.setAttribute("note","xxxx")
          if(note!= null && !"".equals(note)){
%>
      <tr><td style="text-align:center;color:red;font-weight:bolder;" colspan="2">${note}</td></tr>
      <%
          }
      %>
改为:
<c:if test="${not empty requestScope.note }">
      <tr><td style="text-align:center;color:red;font-weight:bolder;" colspan="2">${note}</td></tr>
    </c:if>

``
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容