1. 概念

  • Java Server Pages: java服务器端页面
    • 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
    • 用于简化书写!!!

2. 原理

  • JSP本质上就是一个Servlet,通过查看JSP工作时的目录可以发现,解析JSP时用到的类HttpJspBase继承课HttpServlet所以JSP文件它的本质就是一个servlet

3. JSP指令

作用:用于配置JSP页面,导入资源文件
格式:<% 指令名称:属性名1=属性值 属性名2=属性值2 …%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

分类:

  1. page:配置JSP界面
    1. contentType:等同于设置response.setContentType()
      1. 设置响应体的mime类型及字符集
      2. 设置当前jsp页面的编码,(只能是高级的idec才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
    2. import:导包
    3. errorPage:当前页面发生异常后,会自动跳转到指定的错误页面 。
    4. isErrorPage:标识当前页面是否是错误页面
      1. true:是。可以使用内置对象exception
      2. false:否。默认,不可以使用内置对象exception
  2. include:页面包含的,导入页面的资源文件
  3. taglib:导入资源
    <%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
    prefix:前缀,自定义的
mime类型它不是一个文件扩展名,而是由服务器定义的一个文件处理格式,将其发送给浏览器,浏览器接收到服务器发送你的文件,会根据相应的mime类型解析文件显示出来。

4. JSP注释

  1. html注释:< !-- 注释内容 -->只能注释html代码片段
  2. JSP注释:<%-- 注释内容 --%> :可以注释所有

5. JSP的脚本:JSP定义Java代码的方式

  1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
  2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
  3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

6. JSP内置对象(重点:面试问题)

在JSP页面中不需要创建和获取,可以直接使用的对象
<mark>jsp一共有9个内置对象</mark>

  1. request(真实类型:HttpServletRequest):用在在service方法里面的,<%使用%>,一次请求的访问多个资源(使用转发)
  2. response(真实类型:HttpServletResponse):用在在service方法里面的,<%使用%>
  3. out(真实类型:JspWriter):字符输出流对象。可以将数据输出到页面上,和response和request类似
    response.write()和out.write()的区别?
    答:
    (1)在tomcat服务器真正给客户端做出响应之前,会想找response缓冲区数据,再找out缓存区数据。
    (2)response.write()数据输出永远在out.write()之前。
  4. session(真实类型:HttpSession):一次会话的多个请求间共享数据
  5. config(真实类型:ServletConfig):Servlet配置对象
  6. exception(真实类型:Throwable):异常对象
  7. application(真实类型:ServletContext):所有用户间共享数据
  8. page(真实类型:Object):当前页面(Servlet)的对象,类似于this
  9. pageContext(真实类型:PageContext):当前页面共享数据,还可以用于获取其它的八个内置对象

7. JSP 4个域对象

  1. Page:页面域(对象只对于它所在页面可访问)
  2. Request:请求域(对象在相应请求的生命周期内有效,即对象在创建它的页面内有效,以及请求被转发和包含的页面内有效。请求域的对象是<mark>线程安全</mark>的,只有相应请求的执行,线程可以访问这些对象)
      所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。
  3. Session:回话域(对于参与某个客户端会话的所有应用组件是有效的。这类对象<mark>不是线程安全</mark>的)
      所谓当前回话,是指从用户打开浏览器到用户关闭浏览器这中间的过程
  4. Application:应用域(应用域的对象在整个应用的整个生命周期内都是有效果的。这类对象<mark>不是线程安全</mark>的)
       整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。
      application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。

各类setAttribute方法得比较:

  • 使用pageContext所设定的属性对象,共享范围限于同一个JSP页面。
  • 使用session设定的属性在同一个会话进程中可以共享。
  • 使用request所设定的属性对象,在同一个 request处理期间可以共享(包括forward给其它JSP页面)。
  • 使用application对象设定的属性,在整个Web应用程序中的JSP页面都可 共享。