JavaWeb-JSP
一、JSP
1.1、什么是 JSP
Java Server Pages:Java服务器端页面,也和 Servlet一样,用于动态 Web技术!
最大的特点:
- 写 JSP就像在写 HTML
- 区别:
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入 JAVA代码,为用户提供动态数据
1.2、JSP原理
思路:JSP到底怎么执行的!
- 代码层面没有任何问题
- 服务器内部工作
- Tomcat 中有一个 work目录;
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问 Servlet!
JSP最终也会被转换成为一个 Java类!
JSP本质上就是一个 Servlet。
JSP被解析成 Java的源代码分析:
- 路径:
apache-tomcat-9.0.41\work\Catalina\localhost\ROOT\org\apache\jsp
// 初始化
public void _jspInit() {
}
// 销毁
public void _jspDestroy() {
}
// JSPService
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response){}
_jspService()方法功能分析:
-
判断请求
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { final java.lang.String _jspx_method = request.getMethod(); if ("OPTIONS".equals(_jspx_method)) { response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); return; } if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS"); return; } } -
内置一些对象
final javax.servlet.jsp.PageContext pageContext; // 页面上下文 final javax.servlet.ServletContext application; // applicationContext final javax.servlet.ServletConfig config; // config javax.servlet.jsp.JspWriter out = null; // out final java.lang.Object page = this; // page:当前页 final javax.servlet.http.HttpServletRequest request // 请求 final javax.servlet.http.HttpServletResponse response // 响应 -
输出页面前增加的代码
response.setContentType("text/html; charset=UTF-8"); // 设置响应的页面类型 pageContext = _jspxFactory.getPageContext(this, request, response,null, false, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); out = pageContext.getOut(); _jspx_out = out; -
以上的这些个对象我们可以在 JSP页面中直接使用!
用户访问 Servlet上的 JSP页面流程:

Java代码中的 JSP:
-
在 JSP页面中;
-
只要是 Java代码就会原封不动的输出;
-
如果是 HTML代码,就会被转换为:
// 被转换成这样的格式,输出到前端 out.write("</h1>\r\n");
1.3、JSP基础语法
任何语言都有自己的语法,JAVA中有。JSP 作为 Java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),Java所有语法都支持!
JSP的基础使用:
-
JSP基础格式
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> </body> </html> -
JSP表达式
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <%-- JSP表达式 作用:用来将程序的输出,输出到客户端 格式:<%= 变量或者表达式 %> --%> <%= new java.util.Date()%> </body> </html> -
jsp脚本片段
<%-- JSP脚本片段 --%> <% int sum = 0; for (int i = 1; i <= 100; i++){ sum += i; } out.println("<h1>Sum="+sum+"</h1>"); %> -
jsp脚本片段再使用
<% int x = 10; out.println(x); %> <p>这是一个 JSP文档 <p> <% int y = 2; out.println(y); %> <hr> <%-- 在代码嵌入 HTML元素 --%> <% for (int i = 0; i < 5; i++){ %> <h1>Hello,World <%= i %> </h1> <% } %> -
JSP声明
<%! static{ System.out.println("Loading Servlet!"); } private int globalVar = 0; public void kuang(){ System.out.println("进入了方法 Kuang!"); } %>JSP声明:会被编译到 JSP生成 Java的类中!其他的,就会被生成到 _jspService方法中!
-
<% %> 的使用
<% %> <%-- 片段 --%> <%= %> <%-- 表达式 --%> <%! %> <%-- 全局定义 --%> <%-- --%> <%-- 注释 --%> <%@ %> <%-- JSP指令 --%>JSP的注释,不会在客户端显示,HTML就会!
1.4、JSP指令

-
page 指令的使用
<%-- JSP定制错误页面 --%> <%@ page errorPage="error/500.jsp" %> <%-- web.xml定制错误页面 --%> <error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page> -
include 指令的使用
<%-- @include 会将两个页面和二为一 --%> <%@include file="common/header.jsp" %> <h1>网页主题1</h1> <%@include file="common/footer.jsp" %> <%--JSP标签 jsp:include:拼接页面,本质还是三个 %> <jsp:include page="common/header.jsp" /> <h1>网页主题2</h1> <jsp:include page="common/footer.jsp" />
1.5、9大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application 【SerlvetContext】 存东西
- config 【SerlvetConfig】
- out
- page 不用了解
- exception
<body>
<%-- 内置对象 --%>
<%
pageContext.setAttribute("name1", "秦疆1号"); // 保存的数据只在一个页面中有效
request.setAttribute("name2", "秦疆2号"); // 保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3", "秦疆3号"); // 保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4", "秦疆4号"); // 保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%
// 通过 pageContext取出我们保存的值
pageContext.getAttribute("name1");
// 从底层到高层(作用域):page --> 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");
String name5 = (String) pageContext.findAttribute("name5");
%>
<%-- 使用EL表达式输出:${} --%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<%-- 普通方法会输出 null --%>
<h3><%= name5 %></h3>
</body>
1.6、JSP标签、JSTL表达式、EL表达式
1.6.1、EL表达式
- EL表达式:
${}- 获取数据
- 执行运算
- 获取 Web开发的常用对象
1.6.2、JSP标签
<%--jsp:include:拼接页面,本质还是三个%>
<jsp:include page="common/header.jsp" />
<h1>网页主题2</h1>
<jsp:include page="common/footer.jsp" />
------------------------------------------------
<%-- 跳转使用标签携带参数 --%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param value="kuangshen" name="name"/>
<jsp:param value="12" name="age"/>
</jsp:forward>
<%-- 第二个页面--%>
<%-- 取出参数 --%>
姓名:<%=request.getParameter("name") %>
年龄:<%=request.getParameter("age") %>
1.6.3、JSTL表达式
JSTL标签库的使用就是为了弥补 HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和 Java代码一样!
-
核心标签(掌握部分)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
SQL标签
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
-
XML标签
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
-
JSTL标签库使用步骤
- 引入对应的 taglib
- 使用其中的方法
- 在 Tomcat中也需要引入 jstl的包,否则会报错:JSTL解析错误。
-
参考资料:
-
代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Insert title here</title> </head> <body> <h4>if测试</h4> <hr> <form action="coreif.jsp" method="get"> <%-- EL表达式获取表单中的数据 --%> <input type="text" name="username" value"${param.username}"> <input type="submit" value="登录"> </form> <%-- 判断如果提交的用户名是管理员,则登录成功 --%> <c:if test="${param.username=='admin'}" var="isAdmin"> <c:out value="管理员欢迎您" /> </c:if> <%-- 自闭合标签 --%> <c:out value="${isAdmin}" /> ---------------------------------------------------------------------- <%-- 定义一个变量 score,值为85 --%> <c:set var="score" value="88" /> <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:choose> ---------------------------------------------------------------------- <% ArrayList<String> people = new ArrayList<String>(); people.add(0, "张三"); people.add(1, "李四"); people.add(2, "王五"); people.add(3, "赵六"); people.add(4, "田七"); request.setAttribute("list", people); %> <%-- var,每次遍历出来的变量 items,要遍历的对象 begin,哪里开始 end,到哪里 step,步长 --%> <c:forEach var="people" items="${list}"> <c:out value="${people}" /> <br> </c:forEach> <hr> <c:forEach var="people" items="${list}" begin="1" end="3" step="2"> <c:out value="${people}" /> <br> </c:forEach> </body> </html>

浙公网安备 33010602011771号