JSP
Java Server Page
本质是:HTML模版+java代码,所有的java代码都可以在jsp中使用。
HTML定义了整个网页的骨架,页面的结构和外观。java代码用来操作数据的显示。
JSP简介
Servlet的缺陷:
- Servletde 的编码 部署,和调试任务繁琐
- 生成动态网页繁琐,不利于项目分工。
JSP编写动态页面:
- 有HTML语句和java代码编成的一个普通的文本文件。
- 页面的扩展名是.jsp
JSP API:
test.jsp 翻译为text.java代码。test类继承了HttpJspBase. 而HttpJspBase 继承了HttpServlet。 jsp本质就是servlet。
org.apache.jasper.servlet.JspServlet 类是jsp的引擎。用来执行jsp代码。
tomcat web.xml 里面已经配置了jsp的内容了。所有的注册和映射都配置ok。
tomcat 是一个jsp、servlet的容器。
jsp和servlet
相同点:
1. 都是servlet,都是服务器端动态网页的技术。
不同点:
1. jsp重在数据的显示,servlet主要是处理业务逻辑。
JSP代码操作
在JSP中如何书写:
<!--jsp 声明,可以声明变量,函数,静态块,jsp的声明主要定义全局的变量或方法-->
<%!
int i = 10 ;
%>
<!--jsp的 脚本片段,默认是放在service方法内部,可以调用外部的属性和方法-->
<!--jsp 脚本片段里面只能出现java代码,不能出现任何模版元素,jsp引擎在翻译jsp代码的时候,会将脚本片段里面的所有java代码都放在service方法里面。jsp脚本片段必须完全遵循java的语法规则。-->
<!--在一段脚本片段里面要嵌套模版元素,只能将脚本片段分开-->
<%
int num = 0 ;
%>
<!--jsp脚本表达式;用于将程序的数据输出到客户端,jsp引擎会将脚本表达式变成out.print();或者是out.write();-->
<%=num%>;
<!--相当于out.print(num);-->
JSP 运行机制
- web容器第一次接受到对某个jsp页面请求后,首先自动将该jsp页面翻译为servlet代码。(JSP引擎将jsp页面翻译为java代码)
- web容器负责将Servlet代码编译为字节码,与源文件放在同一个目录。
(第一步和第二步只会发生一次) 将字节码放在容器内部。(加载到容器)
容器装载并实例化Servlet
容器触发init()方法装载资源
请求达到触发service服务方法,处理请求产生相应
容器丢弃Servlet调用destroy()方法
JSP注释
<%-- jsp注释内容 --%>
在jsp脚本片段中可以使用java的注释。
jsp指令
- 提供整个页面的相关信息。
- 用于jsp和容器的通信。
JSP中有三种指令
- page:用于定义jsp页面的各种属性,无论page指令出现在jsp的哪个地方,他都是作用于整个页面。
- include :可以包含任意的文件,当然包含的是内容,include用于引入其他的一个文本文件内容。
- taglib :导入标签库的指令
page 指令
页面指令功能是设定整个jsp页面的属性和相关功能。
操作:
/*导包操作*/
<%@ page import ="com.lovo.bean.*" %>
/*是否创建session对象*
<%@ page session = "true" %>
/*捕获异常,然后跳转(出了异常就会跳到xxx)*/
<%@ page errorPage = "index.jsp"%>
/*是错误页面,才可以用exception对象*/
<%@ page isErrorPage ="true"%>
/*设置MIME类型和编码集*/
<%@ page %>
include 指令
主要是用来包含外部文件,可以是静态文件,也可以是动态文件。
<%@ include file = ""%>
include 称为静态包含:
先把其他文件的内容引入到当前这个页面,然后变成一个页面。最终只会产生一个servlet。
包含动态网页,包含的内容必须遵循jsp的语法。
被引入的文件可以是任意的扩展名。
静态引入会生成一个文件,再翻译成servlet,所以引入的文件不能有指令冲突。
taglab
JSP标准动作
<jsp:include>动作是一种包含
<jsp:forword>动作将客户端发出来的请求,从一个jsp网页转到另一个jsp网页
<!--动态包含:包含的是结果,有多少个动态页面就包含多少个结果。
动态包含要创建多个servlet,将所有servlet结果放在一起。
动态包含,如果包含的是静态文件,那就相当于静态包含
包含的每一个页面都可以设置自己的指令和变量,不会冲突-->
<jsp:include page ="文件地址" flush ="true" ></jsp:include>
<!--flush 是缓冲设置-->
<!--相当于servlet的请求派发(内部派发),运行到这个位置,就将控制权交给了下一个资源。-->
<jsp:forward page = "页面地址" ></jsp:forward>
JSP 隐式对象
在jsp中操作请求、响应,会话以及其他servlet中使用的对象。
共有9个
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
pageContext:
- 是JSP技术中最重要的一个对象。代表了jsp页面的运行环境。这个对象封装了其他的8个对象。他自身还是一个容器(域对象)。用当前这个对象来封装数据。
- 当前这个对象还包含了一些动作。跳转以及引入文件。
pageContext 包含了其他8个对象,通过findAttribute() 获取到其他对象的属性值。
查询内容首先找本身的对象,存在就返回,不存在就继续从其他对象查找。
查找其他对象的过程按照从小到大(对象作用范围的大小)的顺序去查找。
page - request - session -application 找不到就返回null
getAttribute()只能取到自己本身的值。
pageContext的动作
<%
pageContext.forward("/index.jsp");
<!--动作都可以执行-->
pageContext.include("head.jsp");
%>
7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
page对象:
表示当前jsp页面,相当于java中的this。可以理解为一个对象本身。相当于把jsp看成是一个对象。
9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=”true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
<!-九大隐式对象,可以直接在jsp中使用,不需要定义,jsp引擎已经定义好了->
<%
String name = request.getHeader("Host");
%>