(一)JSP技术的产生
Servlet技术 用来动态生成 网页数据资源,Servlet生成HTML
页面数据时,所有内容都是通过 response.getWriter response.getOutputStream 向浏览器输出的:
用Servlet 输出流打印网页信息
Servlet生成网页缺点
1、通过print输出网页 开发很不方便
2、美工人员经常对页面进行CSS修饰,美工人员在java代码中调试CSS
3、无法使用开发工具对页面代码进行调试 JS CSS
什么是JSP技术
JSP是Java Server Pages
的简称,是一种运行在服务器端的Java页面,开发时是采用在HTML页面中嵌套Java页面来实现的。JSP
和Servlet技术一样,都是动态网页开发技术 (JSP在运行时,需要先翻译为Servlet才能运行)。
(二)JSP运行原理
当用户访问JSP页面时,JSP页面的处理过程如图所示。
(1)当客户第一次请求JSP页面时,JSP引擎会通过预处理把JSP文件中的静态数据(HTML文本)和动态数据(Java脚本)全部转换为Java代码。这个转换工作实际上是非常直观的,对于HTML文本只是简单的用out.println()方法包裹起来,对于Java脚本只是保留或做简单的处理。
(2)JSP引擎把生成的.java文件编译成Servlet类文件(.class)。对于Tomcat服务器而言,生成的类文件默认的情况下存放在< Tomcat>work目录。
(3)编译后的class对象被加载到容器中,并根据用户的请求生成HTML格式的响应页面。
在执行JSP网页时,Web容器执行字节码文件将生成的结果返回给客户端进行显示。通常可分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。在转译时期,JSP网页被转译成Servlet类,然后被编译成类文件;在请求时期,Servlet类执行后,响应结果至客户端。
尽管JSP文件看起来更像是HTML文件而不是Servlet文件,但事实上它将转换为Servlet文件,音标大全其中的静态HTML仅仅用来输出Servlet服务方法返回的信息。如果JSP页面已经被转换为Servlet且该Servlet被编译进而被转载(在第一次被请求时),这样再次请求次JSP页面时,将感觉不到延迟。一些Web服务器允许为JSP文件定义别名,好像一个URL是指向一个HTML,但事实上指向的是一个Servlet或JSP页面。
其中,对于编译阶段:
JSP页面在第一次被访问的时候,web容器(JSP引擎)会将JSP翻译成一个Servlet,然后调用servlet的service()方法,所以第一次访问的时候比较慢。
JSP编译后的Servlet会被放到< Tomcat>workCatalinalocalhostwebcontext
当jsp页面被再次访问的时候,web容器会去直接调用Servlet的 service()方法,所以通常来讲 jsp 只是在第一次被访问的时候比较慢。如果jsp页面做了修改,此时web容器会重新翻译jsp
(三)JSP的页面结构
构造一个JSP页面,除了可内嵌规则的HTML代码之外,还有三类主要的JSP元素:指令标识(Directive),脚本标识(Scripting)和动作标识(Action)。
指令标识
指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何内容输出到网页中,即指令标识对于客户浏览器是不可见的。
- 指令名:用于指定指令名称,在JSP中包含page,include和taglib 3条指令。
- 属性:用于指定属性名称,不同的指令包含不同的属性。在一个指令中,可以设置多个属性,各属性之间用逗号或空格分隔。
- 属性值:用于指定属性信息。
JSP指令标识的语法格式:
page指令
page指令用于向jsp引擎说明jsp的页面情况,page指令一般都放在页面的开头,但是不管放在哪都对整个页面起作用。
page指令是针对当前页面的指令,常用的page指令有8个:
1.<%@page language=”java”%>设置jsp中用到的语言,用到的是java,也是目前唯一有效的设定
2.<%@page extends=”mypackage.myclass”%>设置目前jsp要继承的父类,一般不需要设置,在默认情况下,jsp页面默认的父类是HttpJspBase。
3.<%@page import=”java.sql.*”% > jsp页面所用到的类
4.<%@page errorPage=”error.jsp”%> 设置该jsp页面出现异常时所要转到的页面,如果没设定,口语学习方法容器将使用当前的页面显示错误信息
5.<%@page isErrorPage=”true”%> 设置该jsp页面是否作为错误显示页面,默认是false,如果设置为true,容器则会在当前页面生成一个exception对象,和4拍配使用
6.<%@page contentType=”text/html;charset=gb2312”%> 设置页面文件格式和编码方式
7.<%@page isThreadSafe=”true”% > 设置容器以多线程还是单线程运行该jsp页面,默认是true,是多线程。设置为false,则以单线程的方式运行该jsp页面
8.<%@page session=”true”% > 设置该jsp页面是否可以用到session对象(jsp内置对象,为web容器创建),默认是true,能用到session.设置为false,则用不到
最后,对于page指令,还有几点需要注意:
1.<%@page %>指令作用于整个JSP页面,同样包含静态的包含文件。但是<%@page%>指令不能作用于动态的包含文件。
2.可以再一个页面中引用多个<%@page %>指令,但是除了import属性能多次使用之外,其他的属性都只能用一次。
3.<%@page %>指令可以放在JSP文件的任何地方,但是为了JSP程序的可读性及养成好的编程习惯,最好还是放在JSP文件的顶部。
include指令
文件包含指令include是JSP的另一条指令标识。通过该指令可以在一个JSP页面中包含另一个JSP页面。不过该指令是静态包含,也就是说被包含文件中所有内容会被原样包含到该JSP页面中,即使被包含的文件中有JSP代码,在包含时也不会被编译执行。使用include指令,最终将生成一个文件,所以在被包含和包含的文件中,不能有相同名称的变量。include指令包含文件的过程如下图所示:
include指令的语法格式如下:
使用include指令包含文件可以大大提高代码的重用性,而且也便于以后的维护和升级。
taglib指令
在JSP文件中,可以通过taglib指令标识声明该页面中所使用的标签库,同时引用标签库,雅思培训费并制定标签的前缀,在页面中引用标签库后,就可以通过前缀来引用标签库中的标签。taglib指令的语法如下:
脚本标识
脚本标识(Scripting Element)包含三个部分:Scriptlet(脚本程序)、Expression(表达式)和Declaration(声明)。
Scriptlet元素允许Java代码被直接嵌入到JSP页面。
语法:<% Java代码或是脚本代码 %>
功能:Scriptlet中可以包含有效的程序片段,只要是合乎Java本身的标准语法即可。通常主要的程序也是写在这里,Scriptlet是以<%为开始,%>为结尾。
注意:编译JSP时,编译器在_jspService()方法中只是简单地不做修改地包含Scriptlet的内容。
Scriptlet能够包含多个语句,方法,变量,表达式,可以完成以下功能。
(1) 声明将要用到的变量或方法;
(2)显示出表达式;
(3)使用任何隐含对象和使用声明过的对象;
(4)当JSP收到客户端的请求时,Scriptlet就好被执行,如同Servlet的doGet()和doPost()。
Expression元素是Java语言表达式,它的值用于计算以及作为字符串返回到页面。(JSP表达式用于向页面中输出信息)
语法:<%=表达式 %>
功能:JSP提供了一种简单方法访问可用的Java变量和Java表达式,并生成页面HTML字符串。Expression元素是以<%=为开始,%>为结尾的,其中内容包含一段合法Java的表达式。
主要:
(1)表达式会被自动转化为字符串然后显示出来;
(2)<%与=之间不能有空格;
(3)表达式不能以分号结尾。
Declaration元素用于声明在页面中初始化的变量、方法和类。
语法:<%! 声明变量或方法的代码%>
功能:在JSP程序中定义全局变量、方法和类。声明是以<%!为开始,%>为结尾的。不同于Scriptlet,通过声明标识定义的变量和方法可以被整个JSP页面访问。(服务器执行JSP页面时,会将JSP页面转为Servlet类,在该类中会把使用JSP声明标识定义的变量和方法转换为类的成员变量和方法)
通过上述代码声明全局变量和全局方法后,在后面如果通过表达式语句调用全局方法,则每次刷新界面,都会输出前一次值+1的值。
隐藏注释
通过在文档中添加的HTML注释虽然在浏览器中不显示,但是可以通过查看源代码看到这些注释信息。所以严格来说,这种注释是不安全的。不过JSP还提供了一种隐藏注释,这种注释不仅在浏览器中看不到,而且在查看HTML源码时也看不到,所以这种注释的安全性比较高。
其中与的区别在之后Blog会讲到。
动作标识
JSP动作不同于JSP指令,它利用XML语法格式的标记来控制Servlet引擎的行为。sat香港考试团JSP动作可以改变out流,以及创建和使用对象。遵循XML标准,JSP动作也可以有属性。有2个属性是所有JSP动作共有的:一是id属性;二是scope属性。
id属性唯一地标识JSP动作,这就允许在JSP页面内引入动作。
scope属性标识JSP动作的生命期。scope属性有4个可能的值:page、request、session、和application。
id属性和scope属性直接相关,因为scope属性决定与id相关联的对象的生命期。
JSP动作的语法如下:
JSP动作可以分为两类:Resource动作和JavaBean动作。
Resource动作
(1): 可以用于将静态和动态页面插入当前页面。
include动作的语法如下:
这里的flush参数必须为true。
静态包含:静态包含是指将被包含的文件插入JSP页面中,简单的说是将另一个文件中的代码复制到一个JSP页面中,被包含的文件代码将会在JSP中执行。先将页面包含,后执行页面代码,即将一个页面的代码复制到另一个页面中。
动态包含: 先执行页面代码,后将页面包含,即将一个页面的运行结果包含到另一个页面中。当包含静态页面时效果等同于静态包含。
注意:include动作和include指令有很大的不同。include动作在执行时才对包含的文件进行处理,如果对包含的文件进行了修改,那么运行时可以看到所包含文件修改后的结果。而include指令包含的文件如果发生了变化,雅思入门必须重新将JSP文件编译为Servlet文件才能看到所包含文件修改后的结果。
(2):终止当前页面的动作并将请求转发到另一个资源。
(3):根据浏览器的类型,插入通过Java插件运行Java Applet所必须的OBJECT和EMBED元素。
JavaBean动作
JavaBean动作都涉及在JSP页面内使用服务器端JavaBean,包括:
: 用于寻找或者实例化一个新的javaBean供以后在JSP页面中使用。
:设置JavaBean的属性。
:获取JavaBean的属性。
(四)JSP对象常见的四个作用域
page作用域:只在当前页面有效,一旦离开当前页面,则在该范围内创建的对象将无法访问。
request作用域:在同一个请求范围内,可以访问该范围内创建的对象,一旦请求失败,则创建的对象也随之失效。
session作用域:在会话没有失效或者销毁前,都可以访问该范围内的对象。
application作用域:在整个Web应用服务器没有停止前,都可以从application中进行数据存取。
范围由小到大: page(jsp有效) request(一次请求) session(一次会话) application(当前web应用)
page : PageContext对象
request : HttpServletRequest对象
session : HttpSession对象
application : ServletContext对象
什么是域?为什么把这4个对象叫做域对象呢?
域: 即范围的意思
web中的域对象,可以存储对象,在作用范围内都可以取到
内部是Map集合的实现 Map < String, Object>
哪种情况下用哪种域对象
原则: 四个域对象在选择的时候,能用范围小的绝不用范围大的
page: 数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)
什么时候需要用map了,就用page
request:数据只是做显示的,看完了就没用了,就存request域
请求转发, Servlet 产生的处理结果(数据) 交给jsp显示,
session: 数据给用户看完了,一会还要用,会话结束了就没用了
用户登陆,用户信息发给客户端看,看完了,外贸英语培训一会访问别的页面还要看用户信息
购物车,购物成功了,给用户看购物车,待会随时可以查看购物车
请求重定向,因为是两次请求,第一次请求的数据,第二次请求还要看
application : 数据给一个用户用完了,别人还要用
聊天室,聊天记录,需要给所有的用户看
统计网站在线人数,所有人看到的应该是一个数
总结: 需要定义Map不如用page,请求转发Servlet带给jsp的数据存request
请求重定向带过去的数据存Session,全局的数据存application
在整个Web应用的多个JSP、Servlet之间共享数据
看下面的页面, 该页面仅仅声明了一个整型变量, 每次刷新该页面时,该变量值加1,然后将该变量的值放入application 内。下面是页面的代码。
虽然使用application (即ServletContext 实例〉可以方便多个JSP 、Servlet 共享数据,但不要仅为了JSP、Servlet 共享数据就将数据放入application 中!由于application 代表整个Web 应用,所以通常只应该把Web应用的状态数据放入application 里。
使用application访问web应用的配置参数
application 还有一个重要用处:可用于获得Web 应用的配置参数。看如下JSP 页面,该页面访问数据库,但访问数据库所使用的驱动、URL、用户名及密码都在web.xml 中给出。
上面的程序中粗体字代码使用application 的getlnitParameter(String paramName)来获取Web 应用的配置参数,这些配置参数应该在web.xml 文件中使用context-param 元素配置,每个<context-param… />元素配置一个参数,英语国际音标该元素下有如下两个子元素。
- param-name ,配置Web 参数名
- param-value:配置Web 参数值
web.xml 文件,中使用<context-param.. ./>元素配置的参数对整个Web 应用有效,所以也被称为Web应用的配置参数。与整个Web 应用有关的数据,应该通过application 对象来操作。为了给Web 应用配置参数,应在web.xml 文件中增加如下片段。
通过这种方式,可以将一些配置信息放在web.xml 文件中配置,避免使用硬编码方式写在代码中,从而灵好地提高程序的移植性.