JSP(全称 Java Server Pages)Java 服务端页面技术,是 JavaEE 平台下的技术规范。它允许使用特定的标签在 HTML 网页中插入 Java 代码,实现动态页面处理,所以 JSP 就是 HTML 与Java 代码的复合体。JSP 技术可以快速的实现一个页面的开发,相比在 Servlet 中实现页面开发将变得更加容易。
JSP 和 Servlet 是本质相同的技术。当一个 JSP 文件第一次被请求时,JSP 引擎会将该 JSP编译成一个 Servlet,并执行这个 Servlet。如果 JSP 文件被修改了,那么 JSP 引擎会重新编译这个 JSP。
JSP 引擎对 JSP 编译时会生成两个文件分别是.java 的源文件以及编译后的.class 文件,并放到 Tomcat 的 work 目录的 Catalina 对应的虚拟主机目录中的 org\apache\jsp 目录中。两个文件的名称会使用 JSP 的名称加”_jsp”表示。如:index_jsp.java、index_jsp.class。
需求:以 20%概率显示你中奖
<html>
<head>
<title>Title</title>
</head>
<body>
欢迎来到中奖游戏
<%
int flag = new Random().nextInt(100);
if (flag <= 20){
%>
中奖了 <%=flag %>
<% }else {%>
再试一次吧 <%= flag %>
<% } %>
</body>
</html>
## 3、 JSP 的指令标签
JSP 指令标签的作用是声明 JSP 页面的一些属性和动作。
<%@指令名称 属性=“值” 属性=“值”%>
静态包含,可以将其他页面内容包含进来,一起进行编译运行.生成一个 java 文件.
<%@include file=“被包含 JSP 的相对路径” %>
导入标签库。
<%@taglib prefix=“前缀名” uri=“名称空间” %>
JSP 中一共预先定义了 9 个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception。
3、请求转发案例
需求:在 Servlet 中获取客户端浏览器所支持的语言,并通过 JSP 页面将客户端浏览器所支持的语言响应给客户端浏览器。
//需求:在 Servlet 中获取客户端浏览器所支持的语言,
// 并通过 JSP 页面将客户端浏览器所支持的语言响应给客户端浏览器。
@WebServlet("/language.do")
public class LanguageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String header = req.getHeader("Accept-Language");
req.setAttribute("key",header);
req.getRequestDispatcher("showMsg.jsp").forward(req,resp);
}
}
showMsg.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String value = (String)request.getAttribute("key");
%>
当前支持的语言为:<%= value%>
</body>
</html>
运行结果:
作用域:“数据共享的范围”,也就是说数据能够在多大的范围内有效。
JSTL(Java server pages standarded tag library,即 JSP 标准标签库)JSTL 标签是基于 JSP页面的。这些标签可以插入在 JSP 代码中,本质上 JSTL 也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL 的目标是使 JSP 页面的可读性更强、简化 JSP 页面的设计、实现了代码复用、提高效率。
在 JSP2.0 版本后开始支持 JSTL 标签库。在使用 JSTL 标签库时需要在 JSP 中添加对应的taglib 指令标签。
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
根据 JSTL 标签所提供的功能,可以将其分为 5 个类别。
EL(Expression Language)是一种表达式语言。是为了使 JSP 写起来更加简单,减少 java代码,可以使得获取存储在 Java 对象中的数据变得非常简单。在 JSP2.0 版本后开始支持 EL表达式。
${表达式}
${对象.属性名}
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
获取作用域属性中的数据时,也可以只写属性名,EL 表达式会按照 pageScope、requestScope、sessionScope、applicationScope 的顺序查找该属性的值。
${name}
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:if test="${1==1}">
执行了
</c:if>
</body>
</html>
switch 语句中有 case,而
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:choose>
<c:when test="${1==1}">
when1执行了
</c:when>
<c:when test="${1==1}">
when2执行了
</c:when>
<c:otherwise>
otherwise执行了
</c:otherwise>
</c:choose>
</body>
</html>
迭代器,用于迭代集合。
varStatus 属性
current: 当前这次迭代的(集合中的)项
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
begin: 属性值
end: 属性值
step: 属性值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach begin="0" end="9" step="2" varStatus="var">
ForEach.... ${var.count},${var.first},${var.last},${var.current} <br/>
</c:forEach>
</body>
</html>
需求:
创建 Users 对象,含有 userid,username 属性。
创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 List 集合中,在 showUsers.jsp
的页面中显示所有的 Users对象信息。
1、创建 Users 对象,含有 userid,username 属性:
//创建 Users 对象,含有 userid,username 属性。
public class Users {
private Integer userid;
private String username;
public Users() {
}
public Users(Integer userid, String username) {
this.userid = userid;
this.username = username;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
2、创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 List 集合中
//创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 List 集合中
@WebServlet("/findUser.do")
public class FindUsersServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Users> list = new ArrayList<>();
Users users1 = new Users(1,"kangkang");
Users users2 = new Users(2,"Corey");
list.add(users1);
list.add(users2);
req.setAttribute("list",list);
req.getRequestDispatcher("showUsers.jsp").forward(req,resp);
}
}
3、在 showUsers.jsp 的页面中显示所有的 Users对象信息。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" align="center">
<tr>
<th>用户ID</th>
<th>用户名</th>
</tr>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.userid}</td>
<td>${user.username}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
运行结果:
需求:
创建 Users 对象,含有 userid,username 属性。
创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 Map 集合中,在 showUsers2.jsp
的页面中显示所有的 Users 对象的信息。
1、创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 Map 集合中:
//创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 Map 集合中
@WebServlet("/findUser2.do")
public class FindUsers2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String , Users> map = new HashMap<>();
Users users1 = new Users(1,"kangkang");
Users users2 = new Users(2,"Corey");
map.put("users1",users1);
map.put("users2",users2);
req.setAttribute("map",map);
req.getRequestDispatcher("showUsers2.jsp").forward(req,resp);
}
}
2、在 showUsers2.jsp的页面中显示所有的 Users 对象的信息:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" align="center">
<tr>
<th>Map的key</th>
<th>用户ID</th>
<th>用户名</th>
</tr>
<c:forEach items="${map}" var="map">
<tr>
<td>${map.key}</td>
<td>${map.value.userid}</td>
<td>${map.value.username}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
运行结果: