1.什么是JSP?
Java Server Pages,java服务器端页面,一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
2.JSP原理
JSP是怎么执行的?
服务器内部工作
tomcat中有一个work目录;
IDEA中使用Tomcat的会在IDEA中的Tomcat中生成一个work目录或者项目目录/work:
1
| C:\Users\Amdministrator\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_javawev_jsp\work\Catalina\localhost\ROOT\org\apache\jsp
|

打开java类, 发现 jsp 继承了HttpJspBase
1 2 3
| public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports {
|
而HttpJspBase继承了Servlet

所以浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换成为一个Java类!
类内的_jspService()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
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; 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;
try { 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; out.write("\r\n"); out.write("\r\n");
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy"); request.setAttribute("year", sdf.format(new java.util.Date())); request.setAttribute("tomcatUrl", "https://tomcat.apache.org/"); request.setAttribute("tomcatDocUrl", "/docs/"); request.setAttribute("tomcatExamplesUrl", "/examples/");
out.write("\r\n"); out.write("<!DOCTYPE html>\r\n"); out.write("<html lang=\"en\">\r\n"); out.write(" <head>\r\n"); out.write(" <meta charset=\"UTF-8\" />\r\n"); out.write(" <title>"); out.print(request.getServletContext().getServerInfo() ); out.write("</title>\r\n"); out.write(" <link href=\"favicon.ico\" rel=\"icon\" type=\"image/x-icon\" />\r\n"); out.write(" <link href=\"favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\r\n"); out.write(" <link href=\"tomcat.css\" rel=\"stylesheet\" type=\"text/css\" />\r\n"); out.write(" </head>\r\n"); out.write("\r\n"); out.write(" <body>\r\n"); out.write(" <div id=\"wrapper\">\r\n"); out.write(" <div id=\"navigation\" class=\"curved container\">\r\n"); out.write(" <span id=\"nav-home\"><a href=\"");
|
3.JSP基本语法
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
或者,您也可以编写与其等价的XML语句,就像下面这样:
1 2 3
| <jsp:scriptlet> 代码片段 </jsp:scriptlet>
|
任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
示例:
1 2 3 4 5 6 7 8 9
| <html> <head><title>Hello World</title></head> <body> Hello World!<br/> <% out.println("Your IP address is " + request.getRemoteAddr()); %> </body> </html>
|
jsp声明:
JSP声明的语法格式:
1
| <%! declaration; [ declaration; ]+ ... %>
|
或者,您也可以编写与其等价的XML语句,就像下面这样:
1 2 3
| <jsp:declaration> 代码片段 </jsp:declaration>
|
JSP表达式:
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
JSP表达式的语法格式:
同样,您也可以编写与之等价的XML语句:
1 2 3
| <jsp:expression> 表达式 </jsp:expression>
|
JSP注释:
1 2 3 4 5
| <%%> <%=%> <%!%>
<%--注释--%>
|
4.JSP指令
JSP指令用来设置与整个JSP页面相关的属性。一般写在头部位置
JSP指令语法格式:
1
| <%@ directive attribute="value" %>
|
这里有三种指令标签:
指令 |
描述 |
<%@ page … %> |
定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> |
包含其他文件 |
<%@ taglib … %> |
引入标签库的定义,可以是自定义标签 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<%@page args.... %> <%@include file=""%>
<%--@include会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>
<hr>
<%--jSP标签 jsp:include:拼接页面,本质还是三个 --%> <jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
|
5.JSP九大内置对象详解
JSP内置对象(9个内置对象):
1.PageContext javax.servlet.jsp.PageContext JSP的页面容器
2.request javax.servlet.http.HttpServletrequest 获取用户的请求信息
3.response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
4.session javax.servlet.http.HttpSession 用来保存每一个用户的信息
5.application javax.servlet.ServletContext 表示所有用户的共享信息
6.config javax.servlet.ServletConfig 服务器配置信息,可以取得初始化参数
7.out javax.servlet.jsp.jspWriter 页面输出
8.page java.lang.object)
9.exception java.lang.Throwable
九种对象简介:
- out对象:用于向客户端、浏览器输出数据。
- request对象:封装了来自客户端、浏览器的各种信息。
- response对象:封装了服务器的响应信息。
- exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
- config(SerlvetConfig)对象:封装了应用程序的配置信息。
- page对象:指向了当前jsp程序本身。
- session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
- application(ServletContext)对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
- pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。
四种属性范围:
page(pageContext):只在一个页面中保存属性。 跳转之后无效。
request:只在一次请求中有效,服务器跳转之后有效。 客户端跳转无效
session:再一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效
application:在整个服务器上保存,所有用户都可使用。 重启服务器后无效
注意:如果设置过多的application属性范围会影响服务器性能。
1 2 3 4 5
| pageContext.PAGE_SCOPE pageContext.REQUEST_SCOPE pageContext.SESSION_SCOPE pageContext.APPLICATION_SCOPE pageContext.setAttribute("name", "liuyang",pageContext.APPLICATION_SCOPE);
|
6.JSP标签、JSTL标签、EL表达式
依赖
1 2 3 4 5 6 7 8 9 10 11 12
| <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency>
<dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
|
jsp标签
JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。
行为标签只有一种语法格式,它严格遵守XML标准:
1
| <jsp:action_name attribute="value" />
|
行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签::
语法 |
描述 |
jsp:include |
用于在当前页面中包含静态或动态资源 |
jsp:useBean |
寻找和初始化一个JavaBean组件 |
jsp:setProperty |
设置 JavaBean组件的值 |
jsp:getProperty |
将 JavaBean组件的值插入到 output中 |
jsp:forward |
从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin |
用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element |
动态创建一个XML元素 |
jsp:attribute |
定义动态创建的XML元素的属性 |
jsp:body |
定义动态创建的XML元素的主体 |
jsp:text |
用于封装模板数据 |
EL表达式:${ }
JSTL标签
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
1
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
使用任何库,你必须在每个 JSP 文件中的头部包含 标签。
在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误
c:if
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <head> <title>Title</title> </head> <body>
<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get"> <%-- EL表达式获取表单中的数据 ${param.参数名} --%> <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}"/>
</body>
|