jsp知多少?

时间:2023-02-01 10:00:50


一、jsp介绍
JSP(全称Java Server Pages)是由Sun 公司专门为了解决动态生成HTML文档的技术。
jsp页面的访问千万不能像HTML页面一样。托到浏览器中。只能通过浏览器访问Tomcat服务器再访问jsp页面。
二、jsp原理解析
jsp的本质 ,其实是一个Servlet程序
运行原理:
①:启动tomcat服务器,在tomcat的work\Catalina\localhost目录下多出来一个项目目录
②:当我们去访问http://localhost:8080/atguigu6_jsp/helloJsp,(默认访问index.jsp)这个jsp文件
在项目目录下会生成org\apache\jsp目录,并且有两个文件index_jsp.class和index_jsp.java
③:index_jsp.class文件是index_jsp.java源文件编译后的字节码文件,
index_jsp.java是web容器生成的java文件名,是以原来的文件名加上_jsp得到, xxxx_jsp.java文件的名字
④:查看index_jsp.java文件内容,发现这个类文件继承于HttpJspBase类,
HttpJspBase类是一个所有jsp文件生成Servlet程序要继承的基类,且HttpJspBase类继承于HttpServlet类,所以jsp本质也是一个Servlet小程序
⑤:查看index_jsp.java文件发现,jsp中的html页面内容都被翻译到Servlet中的service方法中直接原样输出

三、jsp头部声明介绍(page指令)
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8” %>
这是jsp文件的头声明。表示这是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继承于什么类

四、jsp三大脚本
(1)声明脚本 <%!%>
声明脚本可以在jsp页面中定义自己需要的变量能让代码块,以及方法,甚至是内部类.
(2)表达式脚本 <%=%>
1 表达式脚本都会被翻译到_jspService()方法中
2 表达式脚本都会被翻译成为out.print() 输出给客户端
3 表达式脚本中的表达式,不能以分号结尾.
4 在_jspService方法中有对象,表达式脚本都可以直接使用.
(3)代码脚本 <%%>
1 代码脚本都会被翻译到 _jspService() 方法中
2 由于代码脚本都会被翻译到 _jspService() 方法中,所以在_jspService() 方法中存在的对象都可以直接使用.
3 一个完整的java语句,可以由多个代码脚本组合完成
4 代码脚本还可以和表达式脚本组成完成复杂的输出

五、jsp九大内置对象(我们可以在【代码脚本】或【表达式脚本】中直接使用的对象)
①:request 对象 请求对象,可以获取请求信息
②:response 对象 响应对象。可以设置响应信息
③:pageContext 对象 当前页面上下文对象。可以在当前上下文保存属性信息
④:session 对象 会话对象。可以获取会话信息。
⑤:exception 对象 异常对象只有在jsp页面的page 指令中设置 isErrorPage=“true” 的时候才会存在
⑥:application 对象 ServletContext对象实例,可以获取整个工程的一些信息。
⑦:config 对象 ServletConfig对象实例,可以获取Servlet的配置信息
⑧:out 对象 输出流。
⑨:page 对象 表示当前Servlet对象实例(无用,用它不如使用this对象)
六、jsp四大域对象
①:pageContext 可以保存数据在同一个jsp页面中使用
②:request 可以保存数据在同一个request对象中使用。经常用于在转发的时候传递数据
③:session 可以保存在一个会话中使用
④:application(ServletContext) 就是ServletContext对象
见—context1.jsp 和 congtext2.jsp
域对象测试方式:
①:测试pageContext作用域步骤:
直接访问context1.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>context1页面</title>
</head>
<body>
<%--设置域对象数据--%>
<%
/*设置page域对象数据*/
pageContext.setAttribute("pageKey","pageContext-value");
/*设置request域对象数据*/
request.setAttribute("reqKey","request-value");
/*设置session域对象数据*/
session.setAttribute("sesKey","session-value");
/*设置application域对象数据*/
application.setAttribute("appKey","application-value");
%>
<%--获取域对象数据--%>
<%=pageContext.getAttribute("pageKey")%><br/>
<%=request.getAttribute("reqKey")%><br/>
<%=session.getAttribute("sesKey")%><br/>
<%=application.getAttribute("appKey")%><br/>
<%--测试request作用域--%>
<%
/*request.getRequestDispatcher("/context2.jsp").forward(request,response);*/
%>
</body>
</html>
②:测试request作用域步骤:
1.在context1.jsp文件中添加转发到context2.jsp(有数据)

2.直接访问context2.jsp文件 (没有数据)

③:测试session作用域步骤:
1.访问完context1.jsp文件
2.关闭浏览器。但是要保持服务器一直开着
3.打开浏览器,直接访问context2.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>这是context2页面</title>
</head>
<body>
<%--通过request域对象获取请求中的数据,检测request域对象的作用范围--%>
<%=pageContext.getAttribute("pageKey")%><br/>
<%=request.getAttribute("reqKey")%><br/>
<%=session.getAttribute("sesKey")%><br/>
<%=application.getAttribute("appKey")%><br/>
</body>
</html>
④:测试application作用域步骤:
1.访问完context1.jsp文件,然后关闭浏览器
2.停止服务器。再启动服务器。
打开浏览器访问context2.jsp文件

七、out输出流对象和response中的writer输出
out对象的最后一次的输出,由于没有手动flush,会在整个页面输出到客户端的时候,自动写入到writer缓冲区
永远是追加输出到writer缓冲区的末尾

八、静态包含、动态包含、Jsp中的请求转发
(1)静态包含格式如下: --见include1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>静态包含</title>
</head>
<body>
顶部信息 <br>
页面主体信息 <br/>
<%--
静态包含格式如下:
<%@ include file="路径"%>
file 属性设置被包含的jsp页面的路径.
这个路径以斜杠打头,表示地址为:http://ip:port/工程路径/ 映射到代码的web目录

静态包含的特点:
1 被包含的jsp页面不会被翻译为java文件.
2 静态包含是把被包含的jsp页面的内容拷贝到包含的位置执行输出.
--%>
<%@ include file="/include/footer.jsp"%>
</body>
</html>
<%@ include file="路径"%>
file 属性设置被包含的jsp页面的路径.
这个路径以斜杠打头,表示地址为:http://ip:port/工程路径/ 映射到代码的web目录

静态包含的特点:
1 被包含的jsp页面不会被翻译为java文件.
2 静态包含是把被包含的jsp页面的内容拷贝到包含的位置执行输出.

(2)动态包含 --见include2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>动态包含</title>
</head>
<body>
<%--
动态包含
<jsp:include page="路径"></jsp:include>
page 属性设置被包含的jsp页面的路径.

动态包含的特点:
1 会翻译所有的jsp页面
2 动态包含是使用JspRuntimeLibrary.include() 调用被包含的jsp页面内容输出
3 动态包含还可以传递参数给包含的jsp页面
4 如果被包含的jsp页面中含有大量java动态,动态包含不会出现多次声明的错误
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="csInfo" />
<jsp:param name="password" value="123456" />
</jsp:include>
</body>
</html>
<jsp:include page="路径"></jsp:include>
page 属性设置被包含的jsp页面的路径.
动态包含特点:
1 会翻译所有的jsp页面
2 动态包含是使用JspRuntimeLibrary.include() 调用被包含的jsp页面内容输出
3 动态包含还可以传递参数给包含的jsp页面
4 如果被包含的jsp页面中含有大量java动态,动态包含不会出现多次声明的错误

(3)请求转发
<jsp:forward page=“路径” />
作用跟request.getRequestDispatcher("/scope2.jsp").forward(request,response);一样.

九、监听器–实时监视一些事物状态的程序
①:ServletContextListener监听器它可以监听ServletContext域对象的创建和销毁.
在web工程启动的时候创建,在web工程停止的时候销毁.

②:如何使用ServletContextListener监听ServletContext对象的创建和销毁呢?
使用步骤如下:
1 编写一个类去实现ServletContextListener接口.
2 实现监听器的回调方法
3 到web.xml中去配置,让它生效.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<listener>
<listener-class>com.com.swk.listener.MyListenerImpl</listener-class>
</listener>
</web-app>
③:JavaEE3.0规范。使用注解配置Listener监听器