- Servlet和JSP是同一种编程效果所使用的不同的实现方式
JSP内部运行机制
浏览器向服务器发送请求,调用JSP页面
服务器将请求传递给Web容器,Web容器将JSP文件转化为Servlet的源文件,并对源文件进行编译,生成class文件
转化和编译的过程发生在第一次调用JSP文件时,因此第一次加载JSP文件会比较慢
JSP转化和编译得到的.java文件和.class文件在Tomcat的work目录下
JSP转化后的Servlet要重写三个方法: jspInit、JSPDestroy和jspService,本质上和Servlet是一样的
JSP代码注释
一共有四种方式
// 单行注释(只能出现在jsp文件的java代码区)
/* */ 多行注释(只能出现在jsp文件的java代码区)
<%-- --%> (转化时会忽略这部分代码)
(会发送到客户端)
指令标记
一共有6个(page, include, taglib, tag, attribute, variable),只影响当前JSP页面
(1) page: 提供当前JSP文件的有关信息
例如
<% @page language="java" contentType="text/html;charset=UTF-8" import="java.util.ArrayList">
(2) include: 设置当前JSP页面包含其他JSP或html页面,被包含页面中的Java代码和JSP元素会正确执行。包含的过程发生在JSP页面转化成Servlet的时候,包含的过程是静态的(被包含的内容是插入到JSP页面中include的位置的)
(3) taglib: 使用定制标记
声明标记
定义当前JSP页面中使用的变量和方法,定义的变量为JSP页面全局变量
语法
<%!
....
%>
其中....部分只能包含属性和方法的声明(java代码声明和实现是在一起的,所以这里声明==实现),不能直接嵌入Java代码片段和JSP内置对象
Scriptlet标记
包括任意多行的Java代码,标记中可以定义变量、方法和输出表达式的数值,以及使用JSP内置对象
语法
<%
....
%>
表达式标记
直接输出一个表达式的值,如果不是String类型,则调用toString方法
<%="...."%>
动作
本质是jsp内置的定制标记库,常用的有5个,分别是 include, useBean, getProperty, setProperty和forward
(1) <jsp:include>
如果包含的是静态文件,则直接把内容包含到include动作所在的位置上
如果包含的是动态文件,则把调用所包含JSP网页的输出内容插入到输出的内容中
<jsp:include>可以传递参数,通过 request.getParameter(String name)可以获得被包含文件传递的参数值
-
示例
<jsp:include page="/header.jsp"> <jsp:param name="author" value="vv.com"/> </jsp:include>
-
include指令和<jsp:include>动作的区别:
include指令发生在JSP转化为Servlet的阶段,只产生一个Servlet的.java文件和.class文件,把两个JSP内容的文件何在一起;
<jsp:include>的本质是调用被包含文件的Servlet帝乡的jspService方法,因此会有多个Servlet的.java和.class文件
(2) <jsp:forward>
作用是由当前JSP页面转到同一个Web应用的其他html页面或JSP页面,不能转到其他Web服务器页面(类似于 Servlet中的 RequestDispatcher.forward()方法)
转发的时候可以传递参数,通过 request.getParameter(String name)可以获得参数
-
示例
<jsp:forward page="/register.jsp"> <jsp:param name-"author" value="vv.com"/> </jsp:forward>
JSP内置对象
一共有9个内置对象
(1) out
用于在浏览器上输出
默认设置缓冲,当缓冲区没有满之前,数据不会真正被送出至客户端
(2) request
- 相当于Servlet中的request
(3) response
相当于Servlet中的response
可以重定向 <% response.sendRedirect("www.baidu.com") %>
(4) session
相当于Servlet中的HTTPSession
当访问同一个Web应用的Servlet和JSP页面时,使用的是同一个session对象
(5) application
相当于 javax.servlet.ServletContext
-
可以跨用户的传递参数(而Session只能保存绑定单个用户)
eg.
<% application.setAttribute("website", "www.baidu.com"); out.println(application.getAttribute("website")); %>
-
可以设置context初始参数
eg.
<% out.println(application.getInitParameter("website")); %>
-
使用log方法记录日志
eg.
<% application.log("I'm here") %>
(6) page
- 代表当前所在的JSP页面,相当于this
(7) pageContext
-
作用是获得其他内置对象,提供单一接口方便管理
eg.
getRequst()获得ServletRequest对象 getServletConfig()获得ServletConfig对象 ......
(8) exception
page指令(不是page内置对象)可以设定 errorPage属性指定专门处理异常的JSP页面
专门处理异常的JSP页面需要设定 page指令中 isErrorPage 属性为true
专门处理异常的JSP页面中需要使用 exception 对象
-
示例
<%@page contentType="text/html;charset="UTF-8" isErrorPage="true"%> <%@page import="java.io.PrintWriter%> <html> <head> <title>display error</title> </head> <body> 网页发生异常信息:<%=exception%> <br> 显示异常的堆栈信息: <br> <% exception.printStackTrace(new PrintWriter(out)); %> </body> </html>
(9) config
- 相当于 javax.servlet.ServletConfig
HTTP常见错误代码
(1) 401
- 用户验证失败
(2) 403
- 没有指定访问页面的名称,例如 www.baidu.com/java/
(3) 404
- 找不到请求的文件资源
(4) 405
- 不允许访问该资源,例如Servlet只写了doPost没写doGet却用浏览器输入地址访问了
(5) 500
- 服务器内部运行错误