1、概述
JSP
是 JavaServer Pages
的简称, 是一种动态网页技术标准
1.1、JSP
的基本使用
指令
<%@ page %>
:配置当前页面信息
<%@ include %>
:包含其他页面
<%@ taglib %>
:导入标签库
输出
<%= 需要输出的内容 %>
(代码最终都运行在 _jspService
方法中)
<h1><%=age%>></h1> // 输出年龄
等价于 out.print
(需要输出的内容)
嵌入 java
代码
<% Java代码 %>
(代码最终都运行在 _jspService
方法中)
<%
for (int i = 0; i < 10; i++) {
%>
<h1>我是好学生</h1>
<%
}
%>
注释
<%-- 注释内容 --%>
HTML
、CSS
、JS
注释照常使用
声明
<%! 声明成员变量、方法 %>
<%!
private int age = 10;
public void test() {
System.out.println("123");
}
%>
JSP
的本质是 Servlet
1、查看Tomcat
启动日志,查看CATALINA_BASE
打开对应的文件路径可以看到
test.jsp
最终转换为 test_jsp.java
文件test_jsp.java
2、打开
test_jsp
文件, test_jsp
的继承关系:test_jsp
=> org.apache.jasper.runtime.HttpJspBase
=> jakarta.servlet.http.HttpServlet
_jspService
3、所有
test.jsp
的请求都会调用 _jspService
方法
2、Servlet + JSP
2.1、Servlet
+ JSP
的请求过程
Servlet + JSP
2.2、taglibs
配置
1、Servlet
+ JSP
的相结合,需要使用到 Apache
的 Taglibs
如果使用其核心标签库,只需要下载2个jar
包即可
jakarta.servlet.jsp.jstl-2.0.0.jar、jakarta.servlet.jsp.jstl-api-2.0.0.jar
2、将 jar
包加入到WEV-INF/lib
中,并且右击选择 Add as Library
或者在
Manven
中添加依赖
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
3、使用 taglib
指令导入 JSTL
核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.2、EL
表达式、JSTL
标签库
1、EL
是Expression Language
的简称
${obj.property}
、${obj["property"]}
、${obj[propertyVar]}
empty
、not empty
2、JSTL
是 JSP Standard Tag Library
的简称,译为“JSP
标准标签库”,由 Apache
的 Jakarta
小组维护
3、EL
表达式、 JSTL
标签库都可以简化JSP
代码
4、常用标签
<c:if test="条件">
<c:forEach items="集合" var="元素" varStatus="循环相关的信息">
<c:choose>
、<c:when test="条件">
、<c:otherwise>
2.3、转发(forward)
RequestDispatcher
进行数据转发代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("customers", getCustomers());
// 转发到list.jsp页面进行数据展示
RequestDispatcher dispatcher = request.getRequestDispatcher("/page/list.jsp");
dispatcher.forward(request, response);
}
数据转发链条
1、转发只能在同一个Context
中进行请求转发
2、在同一次请求中,可以转发多次,形成一个转发链条
- 可以通过
request.setAttribute
、request.getAttribute
来共享数据 - 每次转发都会创建一个新的
request
对象,用成员变量request
指向前一个request对象
转发链
转发链
3、在转发链条上,所有的attribute
都存储在头部的 Request
对象中
2.4、重定向
1、重定向:服务器通知客户端重新发送请求到新的任意URL
地址
重定向请求
3、转发 VS 重定向
转发代码:request.getRequestDispatcher("/page/list.jsp").forward(request, response);
- 只能转发到同一个
Context
下,路径中不用包含ContextPath
- 客户端只发送一次请求
- 浏览器地址栏的
URL
不会发生变化 - 转发的操作只由服务器完成
重定向代码:response.sendRedirect("/crm2/list");
- 可以重定向到任意
URL
,如果从定向到同一个Context
下,路径中需要包含ContextPath
- 客户端发了两次请求
- 浏览器地址栏的
URL
会发生变化 - 重定向的操作由服务器+客户端配合完成
4、JSP的9大内置对象
jsp的9大内置对象创建
main.jsp
运行tomcat
<body>
<%
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(page);
System.out.println(pageContext);
System.out.println(out);
System.out.println(config);
%>
// http://localhost:8080/test/main.jsp?name=sj
<input type="text" value="${param.name}">
</body>
在控制台找到CATALINA_HOME
目录/work/Catalina/localhost/test/
在test
项目中找到main_jsp.java
文件。
// 用于共享数据,仅限于当前页面
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
4个域对象:pageContext
、request
、session
、application
共享范围从左至右,逐渐增大
利用EL
表达式从JSP
域对象中获取数据
EL
表达式可以通过param
,直接获取参数
网友评论