1.JSP标准标签库JSTL
1.JSTL简介
JSTL可以提高JSP页面的开发效率,JSTL是由5个不同功能的标签库共同组成的。如下图:
2.JSTL的配置
1.首先下载JSTL对应的jar包
点击这里下载:下载jar包
一般只需要下载前两个就行,但是这几个文件也不大全下呗就。
下载完了之后,把这几个文件拷贝到项目的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>输出标签的属性
例如当你想要输出
<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>标签的属性
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>标签的属性
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>标签的属性
例如:
<%@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>文件导入标签的属性
例如:
接收参数的页面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>标签的属性
例如:
<%@ 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,如下图:
例如,在实现员工信息管理时,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);
}
}