JavaEE——06.JSP标签技术

1.JSP标准标签库JSTL

1.JSTL简介

JSTL可以提高JSP页面的开发效率,JSTL是由5个不同功能的标签库共同组成的。如下图:


JSTL标签库

2.JSTL的配置

1.首先下载JSTL对应的jar包
点击这里下载:下载jar包

下载jar包

一般只需要下载前两个就行,但是这几个文件也不大全下呗就。
下载jar包完成之后

下载完了之后,把这几个文件拷贝到项目的lib文件夹下:
拷贝到lib文件夹下

然后你可以新建一个JSP文件,输入以下代码看看是否能成功输出:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
#下面这句是导入JSTL
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
    <h3><c:out value="Hello world!!!"/></h3>
</body>
</html>

正确运行结果如下:
运行结果

2.核心标签库

1.核心标签库的主要标签

核心标签库

注意:在所有标签的属性中,用[]包含的属性表示可有可无

2.<c:out>标签

<c:out>输出标签用于将表达式的值输出到JSP页面中
1.<c:out>输出标签的2种语法格式
语法1:没有标签体
<c:out value="expression" [escapeXml="true|false"] [default="defaultValue"] />
语法2:有标签体

<c:out value="expression" [escapeXml="true|false] />
defaultValue
</c:out>

1.<c:out>输出标签的属性

<c:out>输出标签的属性

例如当你想要输出<hr>(在HTML中代表水平线)单纯文本时,可以不写escapeXml的值,因为它默认为true;但是如果你想输出水平线的话,就必须加上escapeXml="false",escapeXml的功能就相当于转义字符。

3.<c:set>标签

<c:set>标签用于在指定的范围内(page,request,session或application)内定义保存某个值的变量,或指定的对象设置属性值,与setAttribute()方法类似。
1.<c:set>标签的4种语法格式
语法1:在scope指定的范围内将变量存储到变量中,如果省略[scope]默认是在page作用域
<c:set value="value" var="name" [scope="page|request|session|application"] />
语法2:在scope指定的范围内将标签主体存储到变量中
<c:set var="name" [scope="page|request|session|application"] >标签主体</c:set>
语法3:将变量值存储在target属性指定的目标对象的propName属性中
<c:set value="value" target="object" property="propName" />
语法4:将标签主体存储到target属性指定的目标对象的propName属性中
<c:set target="object" property="propName" >标签主体</c:set>
2.<c:set>标签的属性

<c:set>标签的属性

4.<c:remove>移除标签

<c:remove>移除标签,可以从指定的JSP范围内移除指定的变量,功能与removeAttribute()方法类似。
1.<c:remove>移除标签的语法格式
<c:remove var="name" [scope="page|request|session|application"] />
2.<c:remove>移除标签的属性

  • var属性:用于指定要移除的变量名
  • scope属性:用于指定变量存在的范围,可选值有page,request,session,application。默认值是page。

例如:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c:remove</title>
</head>
<body>
    <c:set var="name" value="Curry" scope="page" />
    移除前输出变量name的值:<c:out value="${pageScope.name}" default="name值为空"/>
    <br>
    <c:remove var="name" scope="page" />
    移除后输出变量name的值:<c:out value="${pageScope.name}" default="name值为空"/>
</body>
</html>

5.<c:catch>捕捉异常标签

<c:catch>捕捉异常标签与Java程序中的try...catch语言类似,用于捕捉程序中出现的异常;此外,它还将异常信息保存在变量中。
1.<c:catch>捕捉异常标签的语法格式
<c:catch [var="exception"]>...//可能异常的代码</c:catch>
2.<c:catch>捕捉异常标签的属性
var:同来保存异常信息的属性名称
例如:

...
<body>
    <c:catch var="exception">
    <%
        int result=10/0;
    %>
    </c:catch>
    <h3>异常信息:${exception}</h3>
</body>
...

6.<c:if>标签

<c:if>标签主要用来完成分支语句的实现,<c:if>标签和Java中的if语句功能类似,但是没有对应的else标签
1.<c:if>标签的2种语法格式
语法1:可判断条件表达式,并将判断结果保存在var属性指定的变量中,而这个变量存在于scope属性所指定的范围内
<c:if test="condition" var="name" [scope="page|request|session|application"] />
语法2:不但可以将test属性的判断结果保存在指定的范围变量中,还可以根据条件的判断结果执行标签主体。标签主体可以是JSP页面能够使用的任何标签,如HTML标记,Java代码或者嵌入其它JSP标签
<c:if test="condition" var="name" [scope="page|request|session|application"]>标签主体</c:if>
例如:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c_if</title>
</head>
<body>
    <c:if test="${param.ref=='qtc'}" var="info1" scope="page">
    <h3>欢迎${param.ref}光临!</h3>
    </c:if>
    <c:if test="${10<30}" var="info2" >
    <h3>10<30</h3>
    </c:if>
</body>
</html>

2.<c:if>标签的属性

<c:if>标签的属性

7.<c:choose>标签

<c:choose>标签可以根据不同的条件完成指定的业务逻辑(相当于switch,case),如果没有符合的条件,执行默认的业务逻辑。需要注意的是,<c:choose>标签只能作为<c:when>和<c:otherwise>标签的父标签,可以在其中嵌套这两个标签完成逻辑。
1.<c:choose>标签和<c:when>,<c:otherwise>的语法格式

<c:choose>
<c:when test="condition">
业务逻辑
</c:when>
<c:otherwise>
业务逻辑
</c:otherwise>
</c:choose>

例如:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c_choose</title>
</head>
<body>
<%
request.setAttribute("now",new Date());
%>
<c:choose>
<c:when test="${now.hours>=0&&now.hours<5}">
凌晨好
</c:when>
<c:when test="${now.hours>=5&&now.hours<8}">
早上好
</c:when>
<c:when test="${now.hours>=8&&now.hours<11}">
上午好
</c:when>
<c:when test="${now.hours>=11&&now.hours<13}">
中午好
</c:when>
<c:when test="${now.hours>=13&&now.hours<17}">
下午好
</c:when>
<c:otherwise>
晚上好
</c:otherwise>
</c:choose>
现在的时间是:${now.hours}时${now.minutes}分
</body>
</html>

8.<c:forEach>标签

<c:forEach>标签可以根据循环条件遍历数组和集合类中的所有或部分数据。功能与Iterator接口类似。
1.<c:forEach>标签的2种语法格式
语法1:数字索引迭代

<c:forEach begin="start" end="finish" [var="name" ][varStatus="statusName" ] [step="step"]>
标签主体
</c:forEach>

语法2:集合成员迭代

<c:forEach items="data" [var="name" ] [begin="start"] [end="finish"] [step="step"] [varStatus="statusName" ]>
标签主体
</c:forEach>

2.<c:forEach>标签的属性

<c:forEach>标签的属性

<c:forEach>标签varStatus属性的状态属性

例如:

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c_forEach</title>
</head>
<body>
<%
    List all = new ArrayList();
    all.add("sun");
    all.add("lsu");
    all.add("lsu.edu.cn");
    pageContext.setAttribute("ref",all);
%>
<h3>输出全部:
<c:forEach items="${ref}" var="mem">
    ${mem},
</c:forEach>
</h3>
</body>
</html>

9.<c:import>文件导入标签

<c:import>文件导入标签可以将其它页面的内容包含进来一起显示,这与<jsp:include>标签的功能类似,但是不同之处是<c:import>标签可以包含外部的页面
1.<c:import>文件导入标签的语法格式

<c:import url="包含地址的url" [context="上下文路径"] [var="保存内容的属性名称"] [scope="page|request|session|application"] [charEncoding="字符编码"] [varReader="以Reader方式读取内容"]>
标签主体
[<c:param name="参数名称" value="参数内容" >]
</c:import>

2.<c:import>文件导入标签的属性

<c:import>文件导入标签的属性

例如:
接收参数的页面param.jsp

...
<body>
    <h3>name参数:${param.name}</h3>
    <h3>url参数:${param.url}</h3>
</body>
...

<c:import>标签页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c_import</title>
</head>
<body>
<c:import url="param.jsp" charEncoding="GBK">
    <c:param name="name" value="lsu"/>
    <c:param name="url" value="www.lsu.edu.cn"/>
</c:import>
</body>
</html>

10.<c:url>标签

<c:url>标签用于生成一个URL路径的字符串,这个生成的字符串可以赋予HTML<a>标记实现url的链接,或者用这个生成的url字符串实现网页的转发与重定向。在使用该标签时还可以搭配<c:param>标签添加url的参数信息
1.<c:url>标签的2种语法格式
语法1:
<c:url value="url" [var="name"] [scope="page|request|session|application"] [context="context"]/>
语法2:

<c:url value="url" [var="name"] [scope="page|request|session|application"] [context="context"]>
<c:param />
...<--!可以有多个<c:param>标签-->
</c:url>

2.<c:url>标签的属性

<c:url>标签的属性

例如:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c_url</title>
</head>
<body>
    <c:url value="http://www.baidu.com" var="info">
        <c:param name="name" value="curry"/>
    </c:url>
    <a href="${info}">新的地址</a>
</body>
</html>

11.<c:redirect>重定向标签

<c:redirect>重定向标签可以将客户端发出的request请求重新定向到其他的URL服务端,与HttpSetvletResponse的sendRedirect()功能相同,在此期间可以用param标签对request请求添加参数
1.<c:redirect>重定向标签的2种语法格式
语法1:
<c:redirect url="url" [context="/context"] />
语法2:

<c:redirect url="url" [context="/context"]>
<c:param />
</c:redirect>

2.<c:redirect>重定向标签的属性

  • url属性:必选属性,用于指定待定向资源的url,可以使用EL。
  • context属性:用于在使用相对路径访问外部context资源时指定资源的名称。

例如:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:redirect url="param.jsp">
<c:param name="name" value="curry"/>
<c:param name="url" value="www.baidu.com"/>
</c:redirect>
</body>
</html>

3.一个Servlet处理多个请求

1.实现方法一:添加多个uri

在新建Servlet类的时候添加多个对应的uri,如下图:


添加多个uri

例如,在实现员工信息管理时,test.jsp代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="addUser">添加员工</a><br>
<a href="queryUser">查询员工信息</a><br>
<a href="updateUser">更新员工信息</a><br>
<a href="deleteUser">删除员工</a><br>
</body>
</html>

能够处理多个信息的UserServlet代码如下:

package com.demo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={ "/addUser", "/queryUser", "/updateUser", "/deleteUser" })
#上面这句话还可以写成@WebServlet({ "/addUser", "/queryUser", "/updateUser", "/deleteUser" })
public class UserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uri = request.getRequestURI();
        System.out.println("uri:"+uri);
        if(uri.endsWith("addUser")){
            addUser(request,response);
        }else if (uri.endsWith("queryUser")){
            queryUser(request,response);
        }else if (uri.endsWith("updateUser")){
            updateUser(request,response);
        }else if (uri.endsWith("deleteUser")){
            deleteUser(request,response);
        }
    }
    private void deleteUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("删除员工");
    }
    private void updateUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("更新员工信息");
    }
    private void queryUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("查询员工信息");
    }
    private void addUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("添加员工");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

1.实现方法二:采用反测机制

package com.demo;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={ "/addUser", "/queryUser", "/updateUser", "/deleteUser" })
public class UserServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uri = request.getRequestURI();
        System.out.println("uri:"+uri);//yyzproject6/addUser
        String methodName = uri.substring(uri.lastIndexOf("/")+1);
        try {
            Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
            method.invoke(this,request,response);
        } catch (Exception e){
            e.printStackTrace();
        }
  
    }
    private void deleteUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("删除员工");
    }
    private void updateUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("更新员工信息");
    }
    private void queryUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("查询员工信息");
    }
    private void addUser(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("添加员工");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

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

推荐阅读更多精彩内容