title: 【学习之路】JSP学习
draft: true
tags:
- 学习之路
- JavaEE
- JSP
categories: - JavaEE
- JSP
description: JSP学习,为什么使用JSP,JSP的底层原理,九大内置对象和四个作用域
cover: ‘https://cdn.jsdelivr.net/gh/CodeZixuan/Blog_Images/JSP/image.jpg‘
abbrlink: 57679
date: 2020-10-23 10:06:33
什么是JSP
- JSP全称(Java Server Pages)是由Sun公司为了解决动态生成的HTML文档
使用Servlet程序输出HTML页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置返回的数据内容的数据类型和编码
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
Writer writer = response.getWriter();
//输出页面内容!
writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
writer.write("<html>");
writer.write("<head>");
writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
writer.write("<title>Insert title here</title>"); writer.write("</head>");
writer.write("<body>");
writer.write("这是由 Servlet 程序输出的 html 页面内容!");
writer.write("</body></html>");
}
从这里我们可以看出来使用Servlet来输出一个页面将会非常繁琐,当页面变复杂时就更加困难,也不利于页面的维护
用IDEA创建一个JSP动态页面程序
- 启动Web项目在浏览器访问页面输入http: //ip:端口号/工程名/文件名
注意事项:
- JSP页面也是一个类似于HTML的页面,JSP文件直接存放到Web目录下,和HTML一样访问JSP的时候也和访问HTML一样
- JSP的默认编码集是:ISO-8859-1 需要修改编码集为UTF-8
JSP的运行原理
JSP的本质,其实是一个Servlet程序
- 首先去Tomcat下的work\catalina\localhost目录。当我们发布工程,并启动Tomcat服务器后,就会看到work\catalina\localhost下有一个当前工程目录点击进去还是空目录,当我们访问JSP文件时就会马上生成org\apache\jsp 并且会有两个文件
- 打开index_jsp.java 文件查看里面的内容
- 发现自动生成的Java文件继承与HttpJspBase类
- 进入HttpJspBase类可以看到HttpJspBase继承与HttpServlet证明HttpJspBase就是一个Servlet程序
JSP语法
JSP头声明
<%@ 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中的三种脚本
声明脚本
<%!
java代码
%>
在声明脚本块中,我们可以做四件事情
- 可以定义全局变量
- 定义static静态代码块
- 定义方法
- 定义内部类
表达式脚本
<%= 表达式 %>
表达式脚本用于向页面输出内容,表达式脚本 翻译到Servlet程序中的Service方法中用out.print打印输出,out是JSP的内置对象,用于生成HTML的源代码
表达式脚本可以输出任何类型:
- 整型
- 浮点型
- 字符串
- 对象
代码脚本
<% java代码 %>
- 代码脚本里可以书写任意的java语句
- 代码脚本的内容都会被发你到service方法中
- 所以service方法中可以写的Java代码,都可以写到代码脚本中
JSP中的注释
//单行注释
/*
多行注释
*/
单行注释和多行注释能在翻译后的Java源码中看见
<%-- JSP注释 --%>
JSP注释在翻译的时候直接会被忽略掉
<!-- HTML注释 -->
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流的两个缓冲区如何工作
- 所有JSP中out输出流的内容都必须要先flush写入到Response的对象缓冲区中,才能最终输出到客户端(浏览器)
- 而JSP的out输出到Response的Writer对象缓冲区,永远是追加到Response的末尾
更加推荐使用out输出避免JSP页面出现输出错误
JSP的常用标签
静态包含
- 静态包含是把包含页面内容元封装不动的输出到包含的位置
- 静态包含不会翻译被包含的JSP页面
<%-- 地址中第一个斜杠表示为 http://ip地址:端口号/工程路径/ 映射到代码的Web目录 --%>
<%@ include file="/include/test.jsp" %>
动态包含
- 动态包含会把包含的JSP页面也翻译成Java代码
- 动态包含底层代码使用
JspRuntimeLibray.include()
方法调用到被包含的JSP页面执行输出
<jsp:include page=""></jsp:include>
页面转发
<%-- 使用page属性进行转发 --%>
<jsp:forward page=""></jsp:forward>
静态包含和动态包含的区别
静态包含 | 动态包含 | |
---|---|---|
是否生成Java文件 | 不生成 | 生成 |
service方法中的区别 | 把包含的内容原封拷贝到service中 | JspRuntimeLibrary.include方法 |
是否可以传递参数 | 不能 | 可以 |
编译次数 | 1 | 包含的文件+1 |
适用范围 | 适用包含纯净态内容(CSS,HTML,JS),或没有非常耗时操作 | 包含需要传递参数,含有大量Java代码 |