JSP
JSP的介绍
- jsp全称为java server page ,也即java的服务器页面。主要用于服务器代替Servlet程序向客户端回传html页面的数据。实际上,jsp就是Servlet程序。
- 由于使用Servlet程序向浏览器回传html页面非常繁琐,所需的开发维护成本很高,因此使用jsp代替Servlet执行。
//使用Servlet回传Html页面数据的操作
public class PrintHtmlServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException , IOException{
//通过响应的输出流回传HTML页面数据
resp.setContentType("text/html;charset=UTF-8");
Writer writer = resp.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write(" <html lang=\"en\">\r\n");
writer.write(" <head>\r\n");
writer.write(" <meta charset=\"UTF-8\">\r\n");
writer.write(" <title>Title</title>\r\n");
writer.write(" </head>\r\n");
writer.write(" <body>\r\n");
writer.write(" 这是 html 页面数据 \r\n");
writer.write(" </body>\r\n");
writer.write("</html>\r\n");
writer.write("\r\n");
}
}
由上可以看出使用Servlet回传页面非常繁琐
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用jsp回传html页面<title>
<head>
<body>
这是html页面数据
<body>
<html>
jsp页面与html页面十分相似,书写起来只需要参照html页面的格式即可。
- jsp如何访问
jsp页面和html页面一样,都存放在工程的web目录下,因此访问时的方法也和html页面一致
a.htmlhttp://ip:port/工程路径/.../a.html
b.jsphttp://ip:port/工程路径/.../b.jsp
JSP的本质
实际上JSP页面本质是一个Servlet程序。当第一次访问JSP页面时,Tomcat会将JSP页面翻译称为一个java源文件,并编译为.class字节码文件,打开java源文件发现这是一个继承了HttpJspBase的以JSP页面名称命名的Servlet程序。而其底层对于html页面的输出也是基于响应获取输出流从而将页面数据发送给客户端的。
JSP的三种语法
-
jsp头部的page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
,这是jsp页面的标志之一,通过page指令可以修改jsp页面中一些重要的属性及行为- language属性:表示jsp经过服务器翻译后使用的语言类型,目前只支持java
- contentType属性:表示jsp返回的数据类型,即源码中的response.setContentType()
- pageEncoding属性:表示当前jsp页面使用的字符集
- import属性:用于导入包和类,与java中的使用类似
- autoFlush属性:给jsp中的out输出流对象使用,设置当out输出流缓冲区满后是否执行自动刷新操作,默认为true
- buffer属性:给jsp中的out输出流对象使用,设置out缓冲区的大小。默认是8kb
- errorPage属性:设置当jsp页面运行出错时自动跳转去的页面路径
- isErrorPage属性:设置当前jsp页面是否是错误信息页面,默认为false。如果是true可以获取异常信息。
- session属性:设置访问当前的jsp页面,是否会创建HttpSession对象。默认是true。
- extends属性:设置jsp翻译出来的java类默认继承谁
-
jsp中的常用脚本
- 声明脚本
<%! 声明java代码 %>
可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块、内部类等(也就是说为了方便需要使用jsp页面写成html页面,然后在html页面里写java代码…) - 表达式脚本
<%=表达式%>
在jsp页面上输出数据。所有的表达式脚本都会被翻译到_jspService()方法中;表达式脚本都会被翻译成为out.print()输出到页面上;由于表达式脚本翻译的内容都在_jspService()中,因此该方法中的对象都可以在表达式脚本中直接使用;表达式脚本中的表达式不能以分号结尾 - 代码脚本
格式为:
<%
java语句
%>
代码脚本的作用是——可以在jsp页面中,根据需要编写java语句来实现功能。同样表达式脚本会被翻译到_jspService()方法中,给方法中的对象均可使用。还可以有多个代码脚本块或者表达式脚本组合使用,在jsp页面上输出数据
- 声明脚本
-
jsp中的三种注释
- html注释
<!-- 这是html注释 -- >
- java注释(在表达式脚本中书写)
- jsp注释
<%-- 这是jsp注释 --%>
- html注释
jsp中的九大内置对象
jsp中的九大内置对象是指Tomcat在翻译jsp页面成为Servlet程序后,内部自动提供的九大对象,叫做内置对象(需要注意的是,JSP本质上是Servlet程序,因此Servlet中应该有或者说可以有的对象,JSP都会自动提供)
- request :请求对象
- response:响应对象
- pageContext:jsp的上下文对象
- session:会话对象
- application:ServletContext对象
- config:ServletConfig对象
- out:jsp输出流对象
- page:指向当前的jsp对象
- exception:异常对象,可以通过page指令的isErrorPage属性设置
jsp四大域对象
jsp中的四大域对象分别是:
- pageContext :当前jsp页面范围内有效
- request :一次请求有效
- session : 一次会话范围内有效
- application : 整个web工程范围内有效
域对象可以像Map一样存取数据,四个域对象不同的是他们对数据的存取范围不同。在使用上,四个域对象的优先顺序为他们从小到大的范围顺序,即优先使用pageContext,最后使用application。
jsp中的out输出和response.getWriter输出的区别
Servlet中的resp.getWriter()用于获取输出流,而jsp中的out也是输出流。这两个输出流的区别在于jsp翻译之后,会先执行out.flush操作,将out缓冲区的所有数据写入response缓冲区的末尾,随后进行response缓冲区的刷新操作,将数据写给客户端。因此在jsp页面中,应当统一使用out输出流进行数据的输出,避免数据顺序出现差错。
- out.write():可以输出字符串数据
- out.print():会将数据统一转化为字符串后调用write输出,因此可以输出任意类型的数据。
因此在jsp页面中,应当统一使用out.print()方法来进行数据的输出
jsp中的常用标签
-
静态包含
<%@ include file="" %>
就是静态包含的格式
file属性用于指定要包含的jsp页面的路径- 静态包含不会翻译被包含的jsp页面
- 静态包含会将被包含的jsp页面代码直接拷贝到相关位置执行输出
(通常用于一些页眉页脚、友情链接等公共的重复性的页面部分输出)
-
动态包含
<jsp:include page=""></jsp:include>
是动态包含的格式
动态包含可以像静态包含一样将包含的内容执行输出到指定位置,page属性即为需要执行动态包含的jsp页面路径- 动态包含会吧jsp页面翻译为java代码
- 底层会使用
JspRunTimeLibrary.include(request,response,url,out,false);
来进行调用执行页面输出 - 动态包含可以传递参数
- 动态包含会将执行包含页面的request、response、out等内置对象以及动态包含自身传递的参数传递给被包含页面使用
<jsp:include page="">
<!-- 即为动态包含传递的参数 -->
<jsp:param name="" value="">
<jsp:param name="" value="">
</jsp:include>
- jsp标签-请求转发
<jsp:forward page=""></jsp:forward>
改标签的功能就是请求转发,page属性用于设置请求转发的目标路径
Listener监听器
-什么是Listener监听器
- Listener监听器是JavaWeb三大组件之一
- 是JavaEE的规范,也就是接口
- 监听器的作用是监听某种事物的变化,然后通过回调函数反馈给程序做一些相应的处理
- ServletContextListener监听器
ServletContextListener监听器可以用于监听ServletContext对象的创建和销毁,监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈
public interface ServletContextListener extends EventListener{
//在ServletContext对象创建后马上调用
public void contextInitialized(ServletContextEvent sce);
//在ServletContext对象销毁之后立即调用
public void contextDestroyed(ServletContextEvent sce);
}
使用ServletContextListener监听器监听ServletContext对象的步骤如下
- 编写一个类实现接口ServletContextListener
- 实现其中的两个回调函数,做相关处理
- 在web.xml中配置Listener
<listener>
<listener-class>com.jarvis.listener.ServletContextListenerImplTest</listener-class>
</listener>