第六章 JSP技术
1.JSP的简介
-
什么是JSP
JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品
在JSP中java代码与HTML共同存在,其中HTML代码用于展示静态的内容,java代码用来展示动态的内容 -
为什么出现JSP技术
1997年Java Web中只有Servlet。生成html技术也需要在Servlet中完成,虽然servlet也可以完成所有的输出工作,但是使用过程比较麻烦,部署也比较复杂。为了克服这些缺点,1999年SUN公司退出JSP技术,该技术在生成HTML代码的时候相比servlet方便了许多。 -
对于servlet和JSP技术的理解:
servlet:在java代码中嵌入html代码,更擅长编写java业务代码 JSP:在html中嵌入java代码,更擅长页面展示
2.JSP运行原理
jsp运行原理
jsp在第一次被访问时会被Web容器翻译成servlet,即 jsp本质上就是Servlet
过程: 第一次访问——->helloServlet.jsp—>helloServlet_jsp. java---->编译运行
被翻译后的servlet在Tomcat的work目录中可以找到,使用IDEA会单独为项目维护一个目录
通过观察发现 jsp会转化为java文件,并且间接的继承了HttpServlet,实现了其中的主要方法,init、service、destory,并且将html代码通过java方式输出给浏览器
3.JSP脚本与注释
JSP脚本
- <%java代码%>-----内部的java代码翻译到service方法的内部
- <%=java变量或表达式>-----会被翻译成service方法内部out print()
- <%/java代码%>----会被翻译成servlet的成员的内容
JSP注释
- Html注释:<!–注释内容–>----可见范围jsp源码、翻译后的servlet、页面显示html源码
- java注释://单行注释 “多行注释*/-----可见范围jsp源码、翻译后的servlet
- sp注释:<%–注释内容–%>----可见范围jsp源码
4JSP指令
jsp指令(3个)
jsp的指令是指导jsp翻译和运行的命令,jsp包三大指令:
page指令----属性最多的指令(实际开发中page指令默认)
属性最多的一个指令,根据不同的属性,指导整个页面特性
格式:<%@ page 属性名1=“属性值1”属性名2=“属性值2”.…%>
常用属性如下: language:Jsp脚本中可以嵌入的语言种类
contentType:response.setContentType(text/html:charset=UTF-8)
session:是否jsp在翻译时自动创建session import:导入java的包 errorPage:
当当前页面出错后跳转到哪个页面
include指令
页面包含(静态包含)指令:可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file="被包含的文件地址" %>
taglib指令
在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:< %@ taglib url="标签库地址" prefix="前缀" %>
5.JSP隐式对象概述
- 什么是隐式对象?
JSP的隐式对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。
6.JSP九大隐式对象详解
1、application:
1.1 application对象有效的范围是从web应用程序服务器一开始执行,到web服务器结束服务为止。
1.2 对于一个网站中所有的JSP页面,application对象只有一个。它们操作的是同一个application对象。
1.3 application是一个全局变量,所有访问同一服务器的客户都可访问application对象。
使用下面一个小例子来证明,在开启了服务器后,在不同的浏览器中访问,可以看到计数器是不断上升的,而不会从1开始。
1.4 获取服务器系统相关信息
application对象负责提供应用程序在服务器中运行时的一些全局信息,因此我们可以利用application来获取一些系统相关信息。
2、config
2.1 config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数及服务器的有关信息。
2.2 主要是对web.xml的数据进行读取。实际上是通过getServletContext()方法获得application对象,再根据application对象获得。
可以直接在网页中获得web.xml中设置的数据
3、exception
作用如名所示,用来处理页面异常的。
3.1 exception对象常用方法如下
(1)getMessage()方法
(2)toString()方法
(3)printStackTrace()方法
(4)getLocalizedMessage()方法
(5)fillStackTrace()方法
3.2 用法:
注意:exception对象只能在定义了<%@ page isErrorPage=”true”%>中使用,否则没有该对象
testException.jsp
4、out
4.1 out对象主要用于向浏览器端输出数据
4.2 out实际上是带有缓冲特性的PrinterWriter,可以称之为JspWriter。缓冲区容量是可以设置的,甚至也可以关闭,
只要通过page指令的buffer属性就可以达到此目的。
4.3 JSP文件代码中的文件内容会自动生成out.print()或者out.println()输出。
5、page
5.1 page对象指代JSP页面本身、代表了正在运行的由JSP文件产生的类对象。
5.2 page对象的常用方法如下。
(1)getClass()方法
(2)equals()方法
(3)clone()方法
实际上就是从Object中继承的方法
6、request
6.1 请求有效:请求页面A,并向A中传递某些参数。
6.2 请求有效对象在处理结束时就会失效。
6.3 request对象可以获取哪些信息
6.3.1 建立HTML表单
6.3.2 用REQUEST对象处理
JSP页面将数据存放在request对象里,并将该请求传递到下一个页面,下一个页面访问request对象,处理上一个JSP页面传递过来的数据。
6.3.3 通过超链接来传递
<a href="aaa.jsp?aa=aa&bb=bb&cc=cc">aaa</a>
6.3.4 通过jsp动作标签param来进行传递
6.4 传递一组数据
7、response
7.1 response对象负责将服务器端的数据发送回浏览器的客户端。主要用于向客户端发送数据,如Cookie、HTTP文件头等信息。
7.2 利用response实现自动刷新
7.2.1 刷新当前界面
response.setHeader("refresh", "3");
out.print(new Date().toString());
结果:每隔3秒刷新一次界面,显示当前时间
7.2.2 跳转界面
<%
out.print("3秒后刷新...");
response.setHeader("refresh", "3;url=count.jsp");
%>
7.3 添加Cookie
<%
Cookie cookie = new Cookie("username", "Chalmers");
//设置保存时间为60*60秒
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
%>
8、pageContext
8.1 pageContext对象能够存取其他隐含对象。
8.2 当隐含对象本身也支持属性时,pageContext对象也提供存取那些属性的方法。
pageContext对对象就是jsp页面的上下文对象
- pageContext是一个域对象
- setAttribute(String name, Object obj)
- getAttribute(String name)
- removeAttrbute(String name)
- pageContext可以向指定的其他域中存取数据
setAttribute(String name, Object obj, int scope)
getAttribute(String name,int scope)
removeAttrbute(String name, int scope)
findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
3.可以获得其他8大隐式对象
例如:pageContext.getRequest()
pageContext.getSession()
9、session
9.1 session对象用于存储一个用户的会话状态,也就是说,session对象是对某个用户的会话过程中的信息存储。
9.2 当客户端访问服务器时,会在服务器中搜索对应的sessionID,如果没有找到,那么便会创建一个,如果找到了便直接使用。
所以在session 的有效时间内,每个客户端只有一个sessionID。
四大作用域的区别
page域;当前jsp页面范围
request域,一次请求
session域;一次会话
application域;整个web应用
pageContext,request、session、application传递参数的使用范围:
10.1 设置参数值
<%
pageContext.setAttribute("pageContext", "true");
request.setAttribute("request", "true");
session.setAttribute("session", "true");
application.setAttribute("application", "true");
%>
10.2 当前页面中,所有的对象都可以通过getAttribute获得值
10.2 在request的forward方法传递中,pageContext接收数据失败,所以pageContext只能在定义页面中使用。
10.3 request的include方法同上
10.4 如果使用response的sendRedirect方法,那么request也将接收失败。原因:客户端向服务端请求数据,服务端在向客户端发送数据
完成后,该request便已经结束,客户端访问url时已经是一个新的request了,所以request的使用范围是一个request内。
10.5 在session的有效时间内,数据都是存在的,特别强调的是,关闭浏览器不会清除掉session。
10.6 而application只有在关闭服务端后才会被清除,可见上面的application介绍。
10.7 总结:范围大小: application>session>request>pageContext
7.JSP标签
什么是Jsp标签
JSP标签用来控制JSP行为,执行一些常用的JSP页面动作,通过标签可以实现很多行java代码才能够实现的功能,比如请求转发的功能
常用的JSP标签
- 页面包含(动态包含):
<jap:include page="被包含的页面/">
- 请求转发:<jsp:forward page="要转发的资源’/>