JSP
JSP概述
JSP(Java Server Pages)是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。JSP是一种Java Servlet,主要用于实现Java Web应用程序的用户界面部分。
JSP原理
JSP最终也会被转换成一个Java类,JSP本质上就是一个Servlet。
在JSP页面中,JAVA代码会被原封不动地输出,HTML代码会被转换为out.write("<html>\r\n");
JSP所需依赖
Tomcat版本:10.0.14
Tomcat 10
想要使用JSP,需要搭配当前同样最新的jakarta.Servlet
。
<!-- Servlet依赖 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<!-- JSP依赖 -->
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- JSTL表达式的依赖 -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
JSP基础语法
JSP作为Java技术的一种应用,在支持Java所有语法的基础上,还拥有一些扩充语法。
<%--
JSP表达式:
- 作用:将程序的输出,输出到客户端
- 形式: <%= 变量 或者 表达式 %>
--%>
<%= new java.util.Date() %>
<%-- 分隔符 --%>
<hr>
<%-- java脚本片段 --%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
// 输出到前端页面
out.println("<h1>Sum=" + sum + "</h1>");
%>
<%-- JSP声明 --%>
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void hunter() {
System.out.println("进入了方法hunter!");
}
%>
- JSP声明会被编译到JSP生成的Java类中,其他的就会被生成到
_jspService
方法中。 - JSP的注释不会在客户端显示,HTML的注释会显示。
JSP内置对象及作用域
9大内置对象
PageContext
pageContext.setAttribute()
保存的数据只在一个页面中有效。Request
request.setAttribute()
保存的数据只在一次请求中有效,请求转发会携带这个数据。Session
session.setAttribute()
保存的数据在一次会话中有效,从打开浏览器到关闭浏览器。Application (ServletContext)
application.setAttribute()
保存的数据只在服务器中有效,从打开服务器到关闭服务器。Response
config (ServletConfig)
out
page
exception
<%-- 在一个JSP中,使用内置对象 --%>
<%
pageContext.setAttribute("name1", "特叔服务1");
request.setAttribute("name2", "特叔服务2");
session.setAttribute("name3", "特叔服务3");
application.setAttribute("name4", "特叔服务4");
// 请求转发可以drequest设置的属性
// 效果等价于 application.getRequestDispatcher("/getInitParam").forward(request, response);
pageContext.forward("/pageDemo01.jsp");
%>
<%-- 在另一个JSP中,尝试读取上述JSP设置的参数 --%>
<%
// 不同于getAttribute 只从pageContext本身中寻找属性,
// findAttribute是按作用域范围从小到大寻找,pageContext -> request -> session -> application
String name1 = (String) pageContext.findAttribute("name1"); // 找不到
String name2 = (String) pageContext.findAttribute("name2"); // 找不到
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
%>
<%-- EL表达式 --%>
<h1>${name1}</h1>
<h1>${name2}</h1>
<h1>${name3}</h1>
<h1>${name4}</h1>
EL表达式、JSP标签、JSTL标签
EL(Expression Language)表达式${ }
获取数据
执行运算
获取web开发的常用对象
例如获取表单中的数据:
${param.参数名}
<input type="text" name="username" value="${param.username}">
JSP标签
<%-- 在页面被请求时引入别的文件,如head.jsp、foot.jsp --%>
<%-- jsp:include --%>
<%--
如下JSP标签的效果:
请求转发至 http://localhost:8080/jsptag2.jsp?name=hunter&age=88
--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="hunter"></jsp:param>
<jsp:param name="age" value="88"></jsp:param>
</jsp:forward>
JSTL(JSP Standard Tag Library)标签
JSTL标签库的使用是为了弥补HTML标签的不足,它自定义了许多标签,标签的功能和Java代码一样。
核心库
<%-- 引入JSTL核心标签库,才能引用JSTL core标签 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
<c:out> |
用于在JSP中显示数据,就像<%= ... > |
<c:set> |
用于保存数据 |
<c:remove> |
用于删除数据 |
<c:if> |
和if一样 |
<c:choose> |
switch case —— switch |
<c:when> |
switch case —— case |
<c:otherwise> |
switch case —— default |
<c:forEach> |
迭代标签 |
<c:url> |
使用可选的查询参数来创造一个URL |
示例
<%-- ------------------ <c:if> 和 <c:out> 示例 -------------------- --%>
<form action="coreif.jsp" method="get">
<%-- EL表达式获取表单中的数据 ${param.username} --%>
<label>
<input type="text" name="username" value="${param.username}">
</label>
<input type="submit" value="登录">
</form>
<%-- 判断如果提交的用户名是管理员,则登录成功 --%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员,您好"/>
</c:if>
<c:out value="${isAdmin}"/>
<%-- ------------ <c:set>、<c:choose>、<c:when> 示例 ---------------- --%>
<c:set var="score" value="85" />
<c:choose>
<c:when test="${score >= 90}">
你的成绩为优秀
</c:when>
<c:when test="${score >= 80}">
你的成绩为良好
</c:when>
<c:when test="${score >= 70}">
你的成绩为一般
</c:when>
<c:when test="${score >= 60}">
你的成绩为及格
</c:when>
<c:when test="${score < 60}">
你的成绩为不及格
</c:when>
</c:choose>
<%-- ------------------------ <c:forEach> 示例 -------------------------- --%>
<%
List<String> people = new ArrayList<>();
people.add("赵1");
people.add("赵2");
people.add("赵3");
people.add("赵4");
people.add("赵5");
request.setAttribute("list", people);
%>
<%--
var:每一次遍历出来的变量
items:要遍历的对象
--%>
<c:forEach var="person" items="${list}">
<c:out value="${person}"/> <br>
</c:forEach>
<%--
var:每一次遍历出来的变量
items:要遍历的对象
begin:开始的下标
end:结束的下标
step:步长
--%>
<hr>
<c:forEach var="person" items="${list}" begin="1" end="3" step="2">
<c:out value="${person}"/> <br>
</c:forEach>