1. 什么是 JSP
JSP(Java Server Page) 是 JavaWeb 服务器端的动态资源. 它与 html 页面的作用是相同的,
显示数据和获取数据.
1.1 Servelet, html 和 JSP 比较
- Servlet
- 缺点: 不适合设置 html 响应体, 因为需要使用
response.getWriter().print("<html>");
方法
写入大量的 html 标签; - 优点: 动态资源, 可以编程
- 缺点: 不适合设置 html 响应体, 因为需要使用
- html
- 缺点: html 是静态页面, 不能包含动态信息.
- 优点: 不用为输出 html 标签而发愁.
- JSP
- 优点: 在原有 html 基础上添加 java 脚本, 构成 jsp 页面.
1.2 JSP 和 Servlet 的分工
- JSP
- 作为请求发起页面, 如显示表单, 超链接等.
- 作为请求结果页面, 如显示数据.
- Servlet
- 作为请求中处理数据的环节
2. JSP 组成
- JSP = html + java 脚本 + JSP 标签(指令);
- JSP 中无需创建即可使用的对象一共有 9 个, 被称为九大内置对象, 如 request对象, out对象...
- 三种 java 脚本
// 第一种:
// <%...%> java 代码片段, 用于定义 0~N 条 java语句.
// java 代码一般方法内能写什么, 它里面就可以放什么!
// <% private int a = 10; %> 这是不可以的.
// 第二种:
// <%= ...%> java 表达式, 用于输出一条表达式(或变量)的结果.
// response.getWriter().print(); print(..) 中能放什么, 它里面就可以放什么!!
// 第三种:
// <%!....%> 声明, 用来创建类的成员变量或成员方法 (该表达式基本不用, 但容易被考到)
// 类体里面能放什么, 它就可以放什么!!
class MyClass{
类体里面可以放以下内容:
成员, 方法, 构造器, 构造代码块, 静态块, 内部类.
}
3. JSP 原理
- JSP 其实就是一种特殊的 Servlet
- 当 JSP 页面第一次被访问时, 服务器会把 JSP 编译成 java 文件 (这个 java 文件其实是一个 Servlet 类);
- 然后再把 java 编译成 .class, 并创建该类对象
- 最后调用 Servlet 的生命周期 service() 方法
- 第二次请求同一 JSP 时, 直接调用 service() 方法
- 在 tomcat 的 work 目录下可以找到 JSP 对应的 .java 源码
index.jsp 编译成 java 后的内容
4. JSP 注释
- <%-- ... --%>: 当服务器把 JSP 编译成 java 文件时,已经忽略了注释部分!
5. JSP 三大指令
- 一般都会把 JSP 指令放到 JSP 文件的最上方, 但这不是必须的;
- 一个 JSP 页面中, 可以定义 0~N 个指令;
- JSP 中有三大指令: page, include, taglib;
- 指令格式:
<%@指令名 attr1="" attr2="" %>
5.1 page 指令
-
page 指令中属性:
- pageEncoding: 指定当前 jsp 页面的编码. 服务器要把 jsp 编译成 .java 时, 需要使用 pageEncoding!
- contentType: 表示添加一个响应头
Content-Type
,
等同于response.setContentType("text/html; charset=utf-8");
- import: 是唯一可以重复出现的属性, 用来导入 jar 包;
- errorPage: 当前页面如果抛出异常, 那么要转发到哪一个页面, 由 errorPage 来指定, 这时状态码为 200;
- isErrorPage: 表示当前页面是否为处理错误的页面! 当它的属性为 true, 这个页面会设置状态码为 500!
而且这个页面可以使用九大内置对象中的 exception 对象. - autoFlush : 指定 jsp 的输出流缓冲区满时, 是否自动刷新! 默认为 true;
- buffer: 指定缓冲区大小, 默认为 8KB;
- isElIgnored: 是否忽略 el 表达式, 默认为 false, 即不忽略;
- language: 指定当前 jsp 编译后的语言类型, 默认为 java;
- info: jsp 的说明信息;
- isThreadSafe: 当前的 jsp 是否支持并发访问, 默认为 false.表示采用线程不安全, 即支持并发访问;
- session: 表示当前页面是否支持 session.
-
也可以在 web.xml 中配置错误页面
<error-page>
<error-code>404</error-code>
<location>/error/errorPage.jsp</location>
</error-page>
<error-page>
<error-code>500</error-page>
<location>/error/errorPage.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/error.jsp</location>
</error-page>
<error-code>
: 指定响应码;<location>
: 指定转发的页面;<exception-type>
: 指定抛出的异常类型;
5.2 include 指令 (静态包含)
- 与 RequestDispatcher 的 include() 方法的功能相似!!
<%@include %>
它是在 jsp 编译成 java 文件时完成的!!- 例如: a.jsp 和 b.jsp ,它们共同生成一个 java 文件(也就是一个 Servlet), 然后再生成一个 class!!!
- RequestDispatcher 的 include() 方法, 涉及的是两个 Servlet, 也就是两个 .class!
- 例如: a.jsp 和 b.jsp 只是把响应的内容在运行时合并了!
- 包含的作用: 把页面分解了, 使用包含的方式组合在一起, 这样一个页面中不变的部分, 就是一个独立的 jsp 页面,
而我们只需要处理变化的页面.
// hel.jsp
<body>
<%
String name="zhangsan";
%>
<%@include file="lo.jsp";%>
</body>
// lo.jsp
<%
out.print(name);
%>
5.3 taglib 指令
- 作用: 导入标签库
- 常用属性:
- prefix: 指定标签库在本页面中的前缀!! 我们自己定义即可;
- uri: 指定标签库的地址.
6. JSP 九大内置对象
- 在 jsp 页面中无需创建就可以使用的 9 个对象, 分别是:
- out: 等同于
response.getWriter()
, 用来向客户端发送文本数据; - config : 对应
ServletConfig
; - page: 当前 JSP 页面的 "this", 即当前对象;
- pageContext: 页面上下文对象; 一个顶九个!
- exception: 只有在错误页面中可以使用这个对象;
- request: 即 HttpServletRequest 类的对象;
- response: 即 HttpServletResponse 类的对象;
- application: 即 ServletContext 类的对象;
- session: 即 HttpSession 类的对象.
如果 JSP 页面中设置<%@page session="fasle"%>
, 说明这个页面中不能使用 session.
- out: 等同于
- config, page, exception 对象基本不会使用;
- exception, session 这两个对象不是每个 JSP 页面都可以使用;
JSP 中四大域对象:
- ServletContext: 这个应用程序;
- session: 整个会话(一个会话只有一个用户);
- request: 一个请求链;
- pageContext: 一个 jsp 页面!!
pageContext 对象
- 位于 javax.servlet.jsp 包中
- 一个顶九个!!
- 这个域对象是在当前 jsp 页面和当前 jsp 页面中使用的标签之间共享数据!!!
- 可以代理其他域:
pageContext.setAttribute("aaa","bbb", PageContext.SESSION_SCOPE);
把 aaa 属性存储到 session 域中; - 获取其他八个内置对象, 例如:
getPage(), getRequest(), getResponse(), getSession()...
- 全域查找:
pageContext.findAttribute("aaa");
查找 aaa 属性的值, 如果找到就停止查找.
按照域的不同, 从小到大, 依次查找:pageContext < request < session < ServletContext
7. JSP 动作标签
- 动作标签是由 tomcat(服务器) 来解释执行! 它与 java 代码一样, 都是在服务器端执行的!!
- html 标签是由浏览器执行的!
- 标签:
<jsp:forward>
: 转发!! 它与 RequestDispatcher 的 forward() 方法一样.
一个是在 Servlet 中使用, 一个是在 jsp 中使用!!<jsp:include>
: 动态包含!! 它与 RequestDispatcher 的 include() 方法一样.<jsp:param>
: 它用来作为 forward 和 include 的子标签!! 用来给 转发或包含页面传递参数!!
8. 其他
- 访问 jsp 页面, 其实就是访问
org.apache.jasper.servlet.JspServlet
页面
// 查看 tomcat中的 conf/web.xml
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
参考资料: