JSP篇
一、JSP中一共预先定义了9个这样的对象:
分别为:request、response、session、application、out、pagecontext、config、page、exception
1、request对象javax.servlet.http.HttpServletRequest
request对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对 象的作用域为一次请求。
2、response对象 javax.servlet.http.HttpServletResponse
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
具有动态响应contentType属性,当一个用户访问一个JSP页面时,如果该页面用page指令设置页面的contentType属性是text/html,那么JSP引擎将按照这个属性值做出反应。
如果要动态改变这换个属性值来响应客户,就需要使用Response对象的setContentType(String s)方法来改变contentType的属性值。response.setContentType(String s);参数s可取text/html,application/x-msexcel,application/msword等。
在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,可以使用Response的sendRedirect(URL)方法实现客户的重定向。
例如response.sendRedirect(index.jsp);
3、session对象 javax.servlet.http.HttpSession
Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。
当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的Session对象。
session对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”, session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象javax.servlet.ServletContext
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
服务器启动后就产生了这个Application对象,当客户再所访问的网站的各个页面之间浏览时,这个Application对象都是同一个,直到服务器关闭。但是与Session对象不同的时,所有客户的Application对象都时同一个,即所有客户共享这个内置的Application对象。
setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Application对象中,并为添加的对象指定一个索引关键字。
getAttribute(String key):获取Application对象中含有关键字的对象。
5、out 对象javax.servlet.jsp.jspWriter
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
Out对象时一个输出流,用来向客户端输出数据。Out对象用于各种数据的输出。其常用方法如下。
out.print():输出各种类型数据。
out.newLine():输出一个换行符。
out.close():关闭流。
6、pageContext 对象javax.servlet.jsp.PageContext
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象javax.servlet.ServletConfig
config 对象的主要作用是取得服务器的配置信息。通过pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、exception 对象java.lang.Throwable
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。
9、page 对象代表JSP本身,只有在JSP页面内才是合法的。page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的this指针。
二、JSP四种范围对象的作用域:
作用域范围从小到大顺序:
pageContext----request----session----application
pageContext:
作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。
request:
作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。
session:
session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。
application:
作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。Application不仅可以用于俩个JSP页面之间共享数据,还可以用于Servlet和JSP之间共享数据。可以把application理解成一个Map对象,任何JSP,Servlet都可以把某个变量放入application中保存,并为之指定一个属性名,而该应用里的其他的JSP,Servlet就可以根据该属性名来得到这个变量。
三、jsp静态引入<%@include%>动态引入<jsp:include>区别:
<%@include%>:
页面请求之前预编译,所有代码包含进来之后,一起进行处理,把所有代码合在一起,编译成一个servlet
<jsp:include>:
所有代码分别处理,在页面被请求的时候才编译,被编译成多个servlet,页面语法相对独立,处理完成之后再将代码的显示结果(处理结果)组合进来。同时可以用param来传参。
静态导入是将被导入页面的代码完全融入,俩个页面融合成一个整体的Servlet;而动态导入则在Servlet中使用include方法引入被导入页面的内容。静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则会失去作用,只是插入被导入页面的body内容,动态的分导还可以增加额外的参数。静态包含还会将被包含的页面的编译指令也包含进来,如果俩个页面的编译指令发生冲突,那么页面将会报错。
四、redirect和forward的区别:
forword是一次请求,地址的URL没有变化,请求的参数和属性是不会丢的
redirect重新发送一次新请求,地址的URL会变,请求的参数和属性全部会丢失
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
4.从效率来说forward:高.redirect:低.
实际上,forword动作指令和include动作指令十分相似(他们的语法就很相似),它们采用方法来引入目标页面,通过查看JSP页面所生成Servlet代码可以得出:forword指令使用_jspx_page_context的forword()方法来引入目标页面,而include指令则使用通过JspRuntimeLibrary的include()方法来引入目标页面。区别在于:执行forword时,被forword的页面将完全代替原有页面;而执行include时,被include的页面只是插入原有页面。简而言之,froword拿目标页面代替原有页面,而include则拿目标页面插入原有页面。
五、JSP中声明脚本,普通脚本,表达式脚步分别用什么标签表示
1.表达式
表达式: 是对数据的表示,系统将其作为一个值进行计算。
语法:<%= expression %>
例如:<%= user.getName()%>
表达式的本质:在将JSP页面转换成Servlet后,使用out.print()将表达式的值输出。这样如果user.getName()的返回值是"liky", 那么实际上在servlet中就将转换成out.print("liky");
因此这里要注意以下两点:
1) 如果表达式是调用一个方法,那么这个方法必须要有返回值,而不应是void,也就是说void getName()这样的方法是不能被调用的。
2) 在方法的后面不能有分号;例如<%=getName();%>这是不允许的。
2. 脚本
脚本:就是在<% %>里嵌入Java代码,这里的Java代码和我们一般的Java代码没有什么区别,所以每一条语句同样要以";"结束,这和表达式是不相同的
语法:<% code %>
脚本的本质:就是将代码插入到Servlet的service方法中。
3. 声明
声明:就是允许用户定义Servlet中的变量、方法
语法:<%! code %> 例如:<%! String
getName() {return name;%}>
声明的本质:其实就是将声明的变量加入到Servlet类(在任何方法之外),方法就成了Servlet的方法。
六、声明脚本中定义的变量和普通脚本中定义的变量有何区别,使用时要注意什么
JSP声明中定义的变量是全局的。脚本程序中定义的变量是局部的。
七、JSP的注释
<%-- 注释的内容 --%> jsp的注释不会显示在客户端
<!—注释的内容 --> Html的注释会显示在客户端
八、JSP的指令分为:
3个编译指令: page include taglib
7个动作指令:
Jsp:forword : 执行页面转向,将请求的处理转发到下一个页面。
Jsp:param : 用于传递参数,必须与其他支持参数的标签一起使用。
Jsp:include ,forword ,plugin.
Jsp:include:用于动态引入一个JSP页面
Jsp:plugin : 用于下载JavaBean或Applet
Jsp:useBean :创建一个JavaBean的实例
Jsp:setProperty :设置JavaBean实例的属性值
Jsp:getProperty: 输出JavaBean实例的属性值。
九、对于客户端的请求而言web服务器大致需要完成如下几个步骤
1、启动单独的线程
2、使用I/O流读取用户请求的二进制数据流
3、从请求数据中解析参数
4、处理用户请求
5、生成相应数据
6、使用I/O流向客户端发送请求数据(其中 1,2,6是通用的,要用web服务器来完成)
十、cookie和session最大的区别在于:
cookie是把积分卡发给顾客,上面记录了顾客所有的消费信息。Session则是把只有卡号(session id)的积分卡发给顾客,自家记录了顾客所有的消费信息。Cookie是保存在客户端的;session是保存在服务器端,而session id则是保存在客户端,通常也是一个cookie小文件,由于这个小文件除了session id(好比卡号)外什么也没有,因此比cookie安全多了。

浙公网安备 33010602011771号