javaWEB之jsp

一、JSP简介

1.1 JSP是什么?

JSP是动态网页开发技术,也就是说网页里的数据不再是死的,与数据库会互动数据。

JSP的代码是以在HTML中镶嵌java的代码,HTML生成静态内容,java生成动态内容。

JSP中的HTML代码称为模版元素,java代码称为JSP脚本片段。

1.2 JSP的优点

(1)可以直接在HTML网页中动态嵌入元素,性能更加优越

(2)服务器调用的是已经编译好的JSP文件

(3)拥有强大的企业级Java API

(4)JSP页面可以与处理业务逻辑的servlet一起使用

(5)编写和修改HTML网页比较容易,不需要在servlet中使用大量的输出语句

(6)JSP开发的web应用可以跨平台使用

1.3 JSP的缺点

(1)JSP技术极大的增加了产品的复杂性.为了获得 系统的跨平台功能和产品伸缩能力,java系统开发了多种产品,如,JRE,JDK,J2EE,EJB,JSWDK,JavaBeans ,只有有效地将它们组合在一起,才能产生强大的功能.(部署有难度)

(2)java的高效率运行需要占用大量的内存和硬盘空间. 一方面,java的高速运行是通过 .class文件常驻内存来实现的.另一方面,还需要硬盘空间来存储一系列的.java 文件和.class文件以及对应的版本文件.(硬件要求高)

(3)JSP程序调试困难.JSP页面执行时, 首先被转换为 .java文件(Servlet), 然后将.java文件编译为字节码文件. 这样,出错信息实际上指向的是转换后的那个.java文件(Servlet), 而不是JSP本身. (调试有难度)

1.4 JSP的处理流程

(1)浏览器发送一个HTTP请求

(2)web服务器将请求传递给JSP引擎

(3)JSP引擎将JSP文件转化成servlet

(4)JSP引擎将servlet编译成可执行类,并将请求传递给servlet引擎

(5)servlet引擎载入并执行servlet类,生成HTML格式的输出并嵌入到HTTP响应中,上传给web服务器

(6)web服务器以静态HTML网页的形式将HTTP响应返回到浏览器

1.5 JSP的生命周期

JSP的生命周期就是从创建到销毁的整个过程。与servlet的生命周期类似,只是还包括将JSP文件编译成servlet的阶段。

1、编译阶段

当浏览器请求JSP页面时,JSP引擎首先会检查是否需要编译这个JSP文件。只有在该文件从没有被编译过,或在上次编译之后有过变更,才会编译该文件。

编译过程包括三个步骤:解析JSP文件、将JSP文件转化成servlet、编译servlet

2、初始化阶段

加载编译生成的servlet类,调用jspInit()方法进行初始化,如建立数据库连接或打开文件等。和servlet一样,程序一般只初始化一次。

3、执行阶段

调用_jspService()方法,处理与请求相关的交互行为。该方法在每个请求中被调用一次并产生与之对应的响应。

4、销毁阶段

调用jspDestroy()方法执行清理工作,如释放数据库连接或关闭文件等。

1.6 JSP运行原理及过程?

-本质上jsp只是一个带有.jsp后缀的脚本语言文件,并不能直接在jvm(虚拟机)上运行,所以需要将其转换为一个Servlet类,才能通过jvm解释执行:

1)客户端发送请求到服务器,web容器通过jsp引擎将jsp文件转换为一个Servlet类源文件(.java)(如果是第一次访问或jsp文件被修改过,那么将会重新转换为一个新的Servlet类)

2)转换过来的Servlet类进一步被java编译器编译成字节码文件(.class)

3)字节码文件被系统类加载器装载到jvm上,开始初始化、执行


三、JSP注释

1、HTML注释:

2、JSP注释:<%-- 注释内容 --%>

注:它们有一个区别,HTML注释内容在网页中查看源代码时可以看见,而JSP注释内容看不见,且JSP注释可能会阻止java代码的执行。

四、基本语法

1、脚本程序

脚本程序包含任意的Java语句、变量、方法或表达式。任何文本、HTML标签、JSP元素必须写在脚本程序的外面。

<% %>

2、JSP声明

声明语句可以声明任意变量、方法,供后面的Java代码使用。

<%! declaration; %>

3、JSP表达式

表达式的值先被转化成String,再将其插入到表达式所在的地方。

<%= expression %>

4、JSP注释

可以为代码行注释,也可以为代码块注释。

<%-- annotation --%>

5、JSP指令

用来设置与整个JSP页面相关的属性。JSP有三种指令标签:page、include和taglib。

5.1 page指令

定义页面的依赖属性,提供当前页面的使用说明,如脚本语言、error页面、缓存等。

<%@ page attribute="value" %>

与page指令相关的属性:

·buffer,指定out对象使用的缓冲区大小

·autoFlush,控制out对象的缓冲区

·contentType,指定当前页面的MIME类型和字符编码

·errorPage,指定当页面发生异常时转向的错误处理页面

·isErrorPage,指定当前页面是否可以作为其他页面的错误处理页面

·extends,指定servlet继承的类

·import,导入使用的Java类

·info,定义页面的描述信息

·language,定义页面使用的脚本语言,默认是Java

·session,指定页面是否使用session

·isThreadSafe,指定页面的访问是否为线程安全

·isELIgnored,指定是否执行EL表达式

·isScriptingEnabled,指定脚本元素能否被使用

5.2 include指令

通过该指令来包含其他文件,被包含的文件如同页面的一部分,会被同时编译执行。

<%@ include file="name" %>

指令中的文件名实际上是一个相对的URL地址,默认是当前路径。

5.3 taglib指令

引入标签库,可以是自定义标签。

<%@ taglib uri="uri" prefix="prefixOfTag" %>

uri属性确定标签库的位置,prefix属性指定标签库的前缀。

6、JSP行为

JSP行为标签是一些预定义的函数,用来控制servlet引擎,实现特殊操作。

所有的动作元素都有两个属性:id和scope。id属性是元素的唯一标识,scope属性是元素的生命周期。

6.1 jsp:include元素

在当前页面中包含静态或动态资源。插入文件的时间是在页面被请求的时候。

page属性是被包含的资源的相对URL地址。flush属性是定义在包含资源前是否刷新缓冲区。

6.2 jsp:useBean元素

用来加载一个在页面中使用的JavaBean组件。

class属性指定Bean的完整包名。type属性指定引用该对象的变量类型。

6.3 jsp:setProperty元素

用来设置已经实例化的Bean对象的属性。

name属性表示要设置属性的Bean。property属性表示要设置哪个属性。value属性用来指定Bean属性的值。param属性指定用哪个请求参数来设置Bean属性的值。

如果jsp:setProperty元素位于jsp:useBean元素外部,不管是新创建一个Bean实例,还是已有一个Bean实例,都会执行。如果jsp:setProperty元素位于jsp:useBean元素内部,只有在新创建一个Bean实例时才会执行。

6.4 jsp:getProperty元素

获取指定Bean对象的属性值。

name属性是要检索的Bean的名称。property属性表示要获取的属性。

6.5 jsp:forward元素

将请求转发给其他页面。

page属性是一个相对URL。

6.6 jsp:plugin元素

用于在生成的HTML页面中包含JavaBean对象。

6.7 jsp:element、jsp:attribute、jsp:body元素

定义动态的XML元素、元素的属性以及元素的内容。

6.8 JSP:text元素

允许在JSP页面和文档中使用写入文本的模板,该模板只能包含文本和EL表达式。

template

7、JSP四种作用域

JSP中的四种作用域包括page、request、session和application,具体来说:

a、page是代表一个页面相关的对象和属性。一个页面由一个编译好的java servlet类(可以带有include指令,但不可以带有include动作)表示。这既包括servlet又包括编译成servlet的jsp页面。


b、request是代表与web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个web组件(由于forware指令和include动作的关系)


c、session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个web回话也可以经常跨域多个客户机请求。


d、application是代表与整个web应用程序相关的对象和属性。这实质上是跨域整个web应用程序,包括多个页面、请求和回话的一个全局作用域。


五、JSP内置对象(隐含对象)

1、内置对象简介

JSP内置对象是Web容器创建的一组对象,不使用new关键字就可以使用的内置对象。


2、四种作用域范围

  application_SCOPE:作用于整个Web应用,多个用户之间共享。

session_SCOPE:作用于整个Web应用,单个用户之间共享。

request_SCOPE:作用于请求,转发间请求共享。

page_SCOPE:作用于当前页面,当前页面可见。

3、out对象

缓冲区:Buffer,即内存中的一块区域用来保存临时数据

out对象:是JspWriter类的实例,是向客户端发送文本常用的对象,是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。当缓冲区满足如下条件是才会写入Servlet引擎提供的缓冲区:设置page指令的buffer属性关闭了out对象的缓存功能;out对象的缓冲区已满。整个JSP页面结束。      

<%

   out.println("aaa");

   response.getWriter().write("bbb");%>

"bbb会比aaa先输出"

4、request对象

客户端的请求信息被封装在request对象中,通过它才能了解到客户端的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。             

//request常用方法:

String getParameter();返回指定参数的参数值

String[] getParameterValues();返回指定参数的所有值

void setAttribute();存储此请求中的属性

object getAttribute();返回指定属性的属性值

String getContentType();得到请求体的MIME类型

String getProtocol();返回请求用的协议及版本号

String getServerName();返回接受请求的服务器主机名

int getServerPort();返回服务器接受此请求的端口号

String getCharacterEncoding();返回字符编码方式

void setContentEncoding();设置请求的字符编码方式

int getContentLength();返回请求体的长度(以字节数)

String getRemoteAddr();返回发送此请求的客户端IP地址

String getRealPath(String path);返回一个虚拟路径的真实路径或相对路径的绝对路径

StringgetContextPath();返回上下文路径,即项目的根目录

中文乱码问题:request.setCharacterEncoding("UTF-8");

URL中中文乱码问题:Tomcat的/conf/server.xml 的添加属性。

5、response对象

response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,及访问一个页面时,该页面内的response对象只能对这次访问有效,其他的response对象对当前页面无效。           

//response对象的常用方法

String getCharacterEncoding();返回响应用的是何种字符编码

void setContentType();设置响应的MIME类型,一般为"text/html, charset=UTF-8"

PrintWriter getWriter();返回可以向客户端输出字符的一个对象("注意比较:PrintWriter与内置out对象的区别,PrintWriter对象的其输出总是提前于内置out对象,或者在out中手动flush")

sendRedirect(loaction);重新定向客户端的请求

请求重定向:是客户端行为,response。sendRedirect(),从本质上将等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。

请求转发:是服务器行为,request.getRequestDispatcher().forward();是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。

6、session对象

session表示客户端与服务器的一次会话,Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。

在服务器的内存中,为不同的用户保存着不同的session。

session对象是一个JSP内置的对象。

session对象在第一个JSP页面被装载是自动创建,完成会话期管理。

从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。

当一个客户访问一个服务器时,肯能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。

session对象是HttpSession类的实例。

//session的常用方法

long getCreationTime();返回session创建时间

String getId();返回session创建时JSP引擎为它设的唯一ID号

Object setAttribute();使用指定名称将对象绑定到此会话

Object getAttribute();返回与此会话中的指定名称绑定在一起的对象,没有返回null

String[] getValueNames();返回一个包含此session中所有可用属性的数组

int getMaxInactiveInterval();返回两次强求间隔多长时间此session被取消(单位秒)

void setMaxInactiveInterval();设置session存活时间。

session的生命周期:

创建:当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。

活动: 某次会话当中通过超链接打开的新页面属于同一次会话。只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。除非本次会话的所有页面都关闭后,在重新访问某个jsp或者Servlet将会创建新的会话(但此时原有会话还存在,这个就的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后教育服务端校验,直到该会话超时。)。

销毁:有三种销毁方式

1、调用了session.invalidate()方法

2、Session过期(超时)可以在web.xml中配置Session超时时间1单位是分钟

3、服务器重新启动

7、application对象

      application对象实现了用户间数据的共享,可存放全局变量。

application开始于服务器的启动,终止于服务器的关闭。

在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。

在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。

服务器的启动和关闭决定了application对象的生命。

application对象是ServletContext类的实例。     

//application的常用方法

void setAttribute();使用指定名称将对象绑定到此会话

Object getAttribute();返回与此会话中的指定名称绑定在一起的对象,如果没有,返回null

Enumeration getAttributeNames();返回所有可用属性名的枚举

String getServerInfo();返回JSP(Servlet)引擎名及版本号

8、page对象

  page对象就是指向当前jsp页面本身,有点像类中的this指针,它是java.lang.Object类的实例。常用方法就是Object类的成员方法。

9、pageContext对象  

pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其他8个隐式对象的引用,其自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如include,forward其他资源、检索其他域对象中的属性等。

pageContext对象提供了对jsp页面内所有的对象及名字空间的访问。该对象可以访问到本页所在的Session,也可以取本页所在的application中的属性值。该对象相当也页面中所有功能的集大成者。该对象的本类名也叫pageContext。             

//pageContext的常用方法

JspWriter getOut();返回当前客户端响应被使用的out对象

HttpSession getSession();返回当前页中的Session对象

Object getPage();返回当前页的page对象

ServletRequest getRequest();返回当前页的Request对象

ServletResponse getResponse();返回当前页的Response对象

void setAttribute();设置属性及属性值

Object getAttribute();在指定范围内取属性的值

int getAttributeScope();返回某属性的作用范围

void forward();跳转到另一个页面,地址栏不变

void include();包含另一个页面,

PageContext.APPLICATION_SCOPE代表各个域的常量

PageContext.SESSION_SCOPE

PageContext.REQUEST_SCOPE

PageContext.PAGE_SCOPE

findAttribute();查找各个域中的属性

10、Config对象

Config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)              

//Config的常用方法

ServletContext getServletContext();返回含有服务器信息的ServletContext对象

String getInitParameter();返回初始化参数的值

Enumeration getInitparameterNames();返回Servlet初始化所需所有参数的枚举

11、Exception对象

Exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个jsp页面要应用此对象,就必须报isErrorPage设为true,否则无法编译。它实际上是java.lang.Throwable的对象。页面要想在有异常时得到处理,就要指定异常处理页面<% page errorPage="exception.jsp"%>         

//exception的常用方法

String getMessage();返回描述异常的消息

String toString();返回关于异常的简短描述消息

void printStackTrace();显示异常及其栈轨迹

ThrowableFillInStackTrace();重写异常的执行栈轨迹

你可能感兴趣的:(javaWEB之jsp)