java之jsp
什么是jsp:
jsp的全称是 java server page。java的服务器页面。
JSP是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。—百度百科
为什么学习JSP
jsp技术可以很好的解决Servlet程序在回传html页面时代码过于繁锁的问题。也不便于开发,调试,以及后期维护。
jsp的本质是什么
jsp的本质,就是一个Servlet程序。
当我们第一次访问jsp页面的时候。我们会现。Tomcat目录下work目录中,中会产生一些文件。打开java源代码,它是一个类的源文件,并且继承了HttpJspBase这个类。
jsp的编译过程
- 客户端发送请求给web容器zhi
- web容器将jsp首先转译成servlet源代码dao
- web容器将servlet源代码编译成.class 文件
- web容器执行.class 文件
- web容器将结果响应给客户端
注意:如果用浏览器直接打开jsp文件则显示的是源码。
jsp生命周期
几个阶段:
-
编译阶段:
servlet容器编译servlet源文件,生成servlet类
-
初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
-
执行阶段:
调用与JSP对应的servlet实例的服务方法
-
销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
jsp的三种语法
jsp头部的page指令
page指令可以设置jsp页面的一些属性。
<%@page contentType="text/html;charset=utf-8" language="java"%>
属性 | 作用 |
---|---|
language | 设置jsp翻译之后转成为什么语言。值只能是java。 |
contentType | 设置当前jsp页面返回的数据类型。同时也是response.setContentType()方法的参数值。 |
pageEncoding | 设置jsp文件本身的字符集 |
import | 它可以用来给jsp页面导入需要的包和类 |
autoFlush | 设置当out缓冲区满了之后。是否自动刷新缓冲区,默认值是true。 |
buffer | 设置out缓冲区的大小,默认是8kb |
errorPage | 设置当jsp页面执行时,出错。自动跳转的错误页面路径。 |
isErrorPage | 设置当前jsp页面,是否是错误页面。默认值是false,设置为true,可以启动Exception异常对象。 |
session | 设置访问当前jsp页面的时候,是否会创建Session对象。默认是true。 |
extends | 这是预留给服务器厂商使用的属性。可以修改jsp页面翻译之后生成的类继承哪个类 |
jsp中的三种脚本
声明脚本(很少用)
作用是:可以在jsp页面中定义各种代码(跟在类中定义代码一样)
声明脚本的格式是:
<%!
代码
%>
- 定义全局变量。
- 定义static静态代码块
- 定义方法
- 定义内部类
表达式脚本(常用)
表达式脚本的作用:可以在jsp页面上输出数据。
表达式脚本的格式是:<%=表达式 %>
作用:
-
输出整型
-
输出浮点型
-
输出字符串
-
输出对象
特点:
-
表达式脚本都会被翻译到_jspService方法中
-
表达式脚本都会被翻译成为out.print进行输出
-
表达式脚本中的表达式不能以分号结束
-
由于表达式脚本是翻译到了_jspService方法中,所以在_jspService方法中的对象都可以直接使用
代码脚本(常用)
作用:可以编写任意在方法体内书写的java代码。
格式:<% 代码 %>
特点:
-
代码脚本也都被翻译到_jspService方法中
-
代码脚本可以书写任意在_jspService方法中可以写的代码。
-
代码脚本可以由多个合成一个完整的java语句。
- 代码脚本----if 语句
- 代码脚本----for 循环语句
- 翻译后java文件中_jspService方法内的代码都可以写
<%--jsp声明 --%>
<%! int anInt =15; %>
<%-- jsp表达式<%@attribute name="" type="" required=""%>--%>
<%= "你家"%>
<%--jsp代码域 || 脚本片段--%>
<%
for (int i = 0; i < 10; i++) {
System.out.println(1);
}
%>
jsp中的三种注释
html注释
html注释翻译之后都是out.write输出到客户端。
客户端浏览器,右键查看源代码是可以看到注释内容
java注释
// 单行
/* 多行 */
java注释翻译之后会在Servlet源代码中可以直接看到。
jsp注释
<%-- jsp 注释 --%>
jsp注释翻译的时候会被完全忽略掉。
jsp九大内置对象
对象 | 简介 |
---|---|
out | 用于向客户端、浏览器输出数据。 |
request | 封装了来自客户端、浏览器的各种信息。 |
response | 封装了服务器的响应信息 |
exception | 封装了jsp程序执行过程中发生的异常和错误信息。 |
config | 封装了应用程序的配置信息。 |
page | 指向了当前jsp程序本身 |
session | 用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数。 |
application | 代表了当前应用程序的上下文。可以在不同的用户之间共享信息。 |
pageContext | 提供了对jsp页面所有对象以及命名空间的访问。 |
jsp四大域对象
对象 | 简介 |
---|---|
pageContext | 在jsp页面范围内有效 |
request | 一次请求(转发可用) |
session | 同一个会话中(打开浏览器请求服务器,至此有了一个会话对象,只要浏览器不关) |
application | 整个Web工程。(只要工程不停止) |
四个域对象,从域的大小来排序。从小到大分别是:
pageContext reqeust session application
四个域对象,在使用的时候优先顺序(由低到高)分别是(对内存的使用更合理):
pageContext reqeust session application
jsp的常用标签
jsp静态包含
静态包含特点:
1、静态包含的jsp页面不会被翻译成为servlet源代码。
2、静态包含的jsp页面内容会被原封不动地拷贝到被包含的位置输出。
<%--
<%@ include file="" %> 是静态包含file 属性设置你要包含的jsp页面的路径静态包含中的斜杠表示到http://ip:port/工程名/ 映射到代码的WebContent目录
--%>
<%@ include file="/include/footer.jsp" %>
jsp标签-动态包含
动态包含的特点:
-
动态包含会翻译被包含的jsp页面成为Servlet源代码。
-
动态包含是通过调用JspRuntimeLibrary.include(request, response, “/include/footer.jsp”, out, false); 去执行被包含jsp页面的Servlet程序。
-
动态包含还可以传递参数(极少使用)
<%--
<jsp:include page="/include/footer.jsp"></jsp:include> 是动态包含
page 属性设置要包含的jsp页面的路径
静态包含中的斜杠表示到http://ip:port/工程名/ 映射到代码的WebContent目录
--%>
<jsp:include page="/include/footer.jsp"></jsp:include>
jsp标签-转发
<%--
<jsp:forward page="/Context2.jsp"></jsp:forward>
这是jsp中的转发标签,功能跟以下代码完全一致
request.getRequestDispatcher("/Context2.jsp").forward(request, response);
page属性就是设置转发的路径地址。
转发中的斜杠表示到http://ip:port/工程名/ 映射到代码的WebContent目录
--%>
<jsp:forward page="/Context2.jsp"></jsp:forward>
静态包含和动态包含的区别
静态包含 | 动态包含 | |
---|---|---|
是否生成java文件 | 不会 | 会翻译 |
service方法中的区别 | 把被包含的jsp页面中的内容原封不动的拷贝到包含的jsp页面中执行。 | 是通过调用JspRuntimeLibrary.include代码来执行被包含的Servlet程序。 |
是否可以传递参数 | 不传递 | 可以传递 |
编译次数 | 1 | n+1(n是你包含了几个jsp页面) |
适用范围 | 仅适用于包含那些jsp页面中,只有输出html页面数据的jsp页面。 | 适合于包含那些在jsp页面中有大量java脚本的jsp页面。 |
随着整个JavaEE技术体系的不断升级,jsp页面的功能慢慢的越来越被弱化。jsp页面中慢慢的就只有一件事件可做,就是输出html页面数据。
所以对于静态包含和动态包含而言。慢慢地就只有使用静态包含。(静态包含会比动态包含快一点点)
<%--本质是一个--%>
<%@include file="common/header.jsp"%>
<h1>主体</h1>
<%@include file="common/foot.jsp"%>
<%--jsp: 本质还是三个--%>
<jsp:include page="common/header.jsp" />
<h1>主体</h1>
<jsp:include page="common/foot.jsp" />
什么是Listener监听器?
Listener监听器是JavaWeb三大组件之一。
javaWeb的三大组件分别是:Servlet程序(最重要)、Listener监听器、Filter过滤器(其次)。
监听器顾名思义,就是用来监听某个事物状态的变化 。然后在变化的时候,反馈结果。
ServletContextListener监听器
-
ServletContextListener监听器,它可以监听ServletContext对象创建和销毁。
-
ServletContextListener在ServletContext对象创建的时候会调用一个方法反馈用户。
-
在ServletContext对象销毁的时候,也会调用一个方法反馈用户。
-
如何创建ServletContextListener监听器监听ServletContext对象
- 创建一个类去实现ServletContextListener
- 实现它里面的两个反馈方法(一个是创建的时候调用,一个是销毁的时候调用)
- 到web.xml中去配置这个监听器。
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerImpl implements ServletContextListener {
/*
* 在ServletContext对象创建的时候调用。
* web工程启动的时候调用*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建了");
}
/*
* 在ServletContext对象销毁的时候调用。
* web工程启动的时候销毁*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁了");
}
}
web.xml文件配置如下:
<listener>
<!-- 配置监听器全类名 -->
<listener-class>ServletContextListenerImpl</listener-class>
</listener>