title: 【学习之路】JSP学习
draft: true
tags:


什么是JSP

  • JSP全称(Java Server Pages)是由Sun公司为了解决动态生成的HTML文档

使用Servlet程序输出HTML页面

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // 设置返回的数据内容的数据类型和编码
  3. response.setContentType("text/html; charset=utf-8");
  4. // 获取字符输出流
  5. Writer writer = response.getWriter();
  6. //输出页面内容!
  7. writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
  8. writer.write("<html>");
  9. writer.write("<head>");
  10. writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
  11. writer.write("<title>Insert title here</title>"); writer.write("</head>");
  12. writer.write("<body>");
  13. writer.write("这是由 Servlet 程序输出的 html 页面内容!");
  14. writer.write("</body></html>");
  15. }

从这里我们可以看出来使用Servlet来输出一个页面将会非常繁琐,当页面变复杂时就更加困难,也不利于页面的维护

用IDEA创建一个JSP动态页面程序

JSP - 图1

  • 启动Web项目在浏览器访问页面输入http: //ip:端口号/工程名/文件名

注意事项:

  1. JSP页面也是一个类似于HTML的页面,JSP文件直接存放到Web目录下,和HTML一样访问JSP的时候也和访问HTML一样
  2. JSP的默认编码集是:ISO-8859-1 需要修改编码集为UTF-8

JSP的运行原理

JSP的本质,其实是一个Servlet程序

  • 首先去Tomcat下的work\catalina\localhost目录。当我们发布工程,并启动Tomcat服务器后,就会看到work\catalina\localhost下有一个当前工程目录点击进去还是空目录,当我们访问JSP文件时就会马上生成org\apache\jsp 并且会有两个文件

JSP - 图2

  • 打开index_jsp.java 文件查看里面的内容

JSP - 图3

  1. 发现自动生成的Java文件继承与HttpJspBase类
  2. 进入HttpJspBase类可以看到HttpJspBase继承与HttpServlet证明HttpJspBase就是一个Servlet程序

JSP - 图4

JSP语法

JSP头声明

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

JSP属性

属性 说明
language 值只能是 java表示翻译的得到的是 java 语言
contentType 设置响应头 contentType 的内容
pageEncoding 设置当前 jsp 页面的编码
import 给当前 jsp 页面导入需要使用的类包
autoFlush 设置是否自动刷新 out 的缓冲区,默认为 true
buffer 设置 out 的缓冲区大小。默认为 8KB
errorPage 设置当前 jsp 发生错误后,需要跳转到哪个页面去显示错误信息
isErrorPage 设置当前 jsp 页面是否是错误页面。是的话,就可以使用 exception 异常对象
session 设置当前 jsp 页面是否获取 session 对象,默认为 true
extends 给服务器厂商预留的 jsp 默认翻译的 servlet 继承于什么类

当buffer缓冲区容量不足时会出现以下异常,autoFlush建议设置为true,buffer设置为8K

JSP中的三种脚本

声明脚本

  1. <%!
  2. java代码
  3. %>

在声明脚本块中,我们可以做四件事情

  1. 可以定义全局变量
  2. 定义static静态代码块
  3. 定义方法
  4. 定义内部类

表达式脚本

  1. <%= 表达式 %>

表达式脚本用于向页面输出内容,表达式脚本 翻译到Servlet程序中的Service方法中用out.print打印输出,out是JSP的内置对象,用于生成HTML的源代码

  • 表达式脚本可以输出任何类型:

    1. 整型
    2. 浮点型
    3. 字符串
    4. 对象

代码脚本

  1. <% java代码 %>
  1. 代码脚本里可以书写任意的java语句
  2. 代码脚本的内容都会被发你到service方法中
  3. 所以service方法中可以写的Java代码,都可以写到代码脚本中

JSP中的注释

  1. //单行注释
  2. /*
  3. 多行注释
  4. */
  5. 单行注释和多行注释能在翻译后的Java源码中看见
  6. <%-- JSP注释 --%>
  7. JSP注释在翻译的时候直接会被忽略掉
  8. <!-- HTML注释 -->
  9. HTML的注释会被翻译到Java代码输出到HTML中页面查看

JSP中的九大内置对象

对象名称 对象的介绍
request 请求对象
response 响应对象
pageContext JSP上下文对象
session 会话对象
application ServletContext对象
config ServletConfig对象
out JSP输出流对象
page 只想当前JSP对象
exception 异常对象

JSP四大域对象

  • 域对象是可以像Map一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围 | 域对象名称 | 具体类型 | 存取范围 | | —- | —- | —- | | pageContext | PageContextImpl类 | 当前JSP页面范围有效 | | request | HttpServletRequest类 | 一次请求内有效 | | session | HttpSession类 | 一个会话范围内有效(打开浏览器访问服务器,直到浏览器关闭) | | application | ServletContext类 | 整个Web工程范围内都有效(Web工程不停止) |

JSP中out输出流和response输出流


out输出流和writer流的两个缓冲区如何工作

  1. 所有JSP中out输出流的内容都必须要先flush写入到Response的对象缓冲区中,才能最终输出到客户端(浏览器)
  2. 而JSP的out输出到Response的Writer对象缓冲区,永远是追加到Response的末尾

更加推荐使用out输出避免JSP页面出现输出错误

JSP的常用标签

静态包含

  1. 静态包含是把包含页面内容元封装不动的输出到包含的位置
  2. 静态包含不会翻译被包含的JSP页面
  1. <%-- 地址中第一个斜杠表示为 http://ip地址:端口号/工程路径/ 映射到代码的Web目录 --%>
  2. <%@ include file="/include/test.jsp" %>

动态包含

  1. 动态包含会把包含的JSP页面也翻译成Java代码
  2. 动态包含底层代码使用 JspRuntimeLibray.include() 方法调用到被包含的JSP页面执行输出
  1. <jsp:include page=""></jsp:include>

页面转发

  1. <%-- 使用page属性进行转发 --%>
  2. <jsp:forward page=""></jsp:forward>

静态包含和动态包含的区别

静态包含 动态包含
是否生成Java文件 不生成 生成
service方法中的区别 把包含的内容原封拷贝到service中 JspRuntimeLibrary.include方法
是否可以传递参数 不能 可以
编译次数 1 包含的文件+1
适用范围 适用包含纯净态内容(CSS,HTML,JS),或没有非常耗时操作 包含需要传递参数,含有大量Java代码