学习笔记二(jsp九大高手和四大门派)

来源:互联网 发布:matlab mac版 编辑:程序博客网 时间:2024/04/29 14:57

话说武林有四大门派,他们分别是少林、武当、峨眉、南拳。四大门派各有特色而又相辅相成,而在我们的jsp里面也有四大门派,我们一般称之为四大作用域,他们分别是application,session,request,page。这四大作用域也是相辅相成的,互相作用才能形成我们的jsp。好了先从功夫最高的开始讲起。功夫最高的自然就是application,它就像少林一样,俗话说得好,天下功夫出少林。而我们的application的作用域自然也很广,它是属于服务器的作用域,只要服务器启动了,你不关闭它,它就一直存在,就如同我们少林一样,只要武林还在就一定会有我们少林派。接下来登场的自然就是我们的武当派,太极拳,太极剑不可谓不厉害,在jsp的作用域中它的范围也仅次于我们的application。就如同在江湖中的地位,我们的武当仅次于少林一样,它就是session作用域,相当于是浏览器作用域,也就是说,只要当前浏览器还开着,不管你怎么跳转都是属于session作用域,有一点要记住的就是,在同一台电脑上打开两个不同的浏览器,访问同一个jsp页面,这个时候会生成两个不同的session。好了再说说requser吧,她就像我们的峨眉一样,江湖地位不及两个霸主。但是任然可以迷倒我们的南拳派。所以他的作用域只有一次请求有用,举个简单的例子吧。我们有一个登陆页面,登陆的时候需要在里面填写账号和密码,然后我们让它提交到另外一个页面,这个时候他的作用域是有效的,我们可以得到他的值。

点击提交到了request.jsp页面。


这个时候获取到了request作用域的参数。当我们点击跳吧少年的时候又跳到了另外一个

jsp页面,这个页面的内容和上一个是一样的。来看一下这个页面的值


为空了,事实证明request作用域只是在一次请求中有效。

最后说一下四大门派中的老末吧。page对象;顾名思义啊,就是在当前页面中有效.这个作用域中的值都讲会在页面跳转之后被释放出来。或者将page对象的引用提交到服务器端之后也会得到释放。

好了,四大门派说完了,再说说九大高手吧。九大高手可谓一个比一个强,他们特色分明,就连武功也各具特色。我们来看看第一高手吧。当只无愧的武林盟主。他就是application门派里面的application对象。人称少林寺的创始人,达摩祖师。我们来看看他到底有多强。

application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。 

  序号 方 法 说 明 

  1 Object getAttribute(String name) 返回给定名的属性值 

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

  3 void setAttribute(String name,Object obj) 设定属性的属性值 

  4 void removeAttribute(String name) 删除一属性及其属性值 

  5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本号 

  6 String getRealPath(String path) 返回一虚拟路径的真实路径 

  7 ServletContext getContext(String uripath) 返回指定WebApplication的application对象 

  8 int getMajorVersion() 返回服务器支持的Servlet API的最大版本号 

  9 int getMinorVersion() 返回服务器支持的Servlet API的最大版本号 

  10 String getMimeType(String file) 返回指定文件的MIME类型 

  11 URL getResource(String path) 返回指定资源(文件及目录)的URL路径 

  12 InputStream getResourceAsStream(String path) 返回指定资源的输入流 

  13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象 

  14 Servlet getServlet(String name) 返回指定名的Servlet 

  15 Enumeration getServlets() 返回所有Servlet的枚举 

  16 Enumeration getServletNames() 返回所有Servlet名的枚举 

  17 void log(String msg) 把指定消息写入Servlet的日志文件 

  18 void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件 

  19 void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件。


只要是达摩祖师传授的功夫,在所有门派里都可以使用,它就是怎么强大.就是牛。

接下来再看看session,

session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例. 

  方法说明: 

  1 long getCreationTime() 返回SESSION创建时间 

  2 public String getId() 返回SESSION创建时JSP引擎为它设的惟一ID号 

  3 long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间 

  4 int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms) 

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

  6 void invalidate() 取消SESSION,使SESSION不可用 

  7 boolean isNew() 返回服务器创建的一个SESSION,客户端是否已经加入 

  8 void removeValue(String name) 删除SESSION中指定的属性 

  9 void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms)

session属于session作用域的,值得指出的是,在很多面试的时候,有一些面试官会问到session的生命周期,session超时,和怎么能让session不超时这个问题?

下面我就来解答一下,一个session是在一个客户端访问一个jsp或者server的时候创建的。这个阶段属于他的创建期,我们会把session保存到本地的Cookie中,这个cookie是由服务器创建的,其实也就是调用了session.getid()这个方法,返回了session的id。改Cookie只在当前浏览器中有效,子窗口里面可以继承父窗口的Cookid所以就是共享同一个sessionid。我们用这个Cookie来跟踪用户的浏览状态。这个阶段叫做session的存活期。当我们调用session的invalidate方法时,就会结束了这个session。因此我们称之为session的消亡期。session失效有三种办法一种是调用session的invalidate方法,一种是session长时间没有活动了,比如你打开了一个网站,然后去买了个菜又吃了个饭,回来发现session已经失效了,这就是session超时。还有一种就是关闭服务器,这个更彻底。

那么我们说怎么样才能让一个session不超时啦,其实理论上来讲是不可能的,因为session总有超时的一天。就算你服务器也有坏的一天吧。我们只能延缓session超时的时间。一般有三种方法,第一种是在web.xml里面进行配置 里面的时间是以分钟为单位的.

<session-config>
    <session-timeout>10</session-timeout>
  </session-config>

第二种是直接在jsp页面里面进行配置的这里的时间是以秒为单位的

session.setMaxInactiveInterval(60*60);

网上还有一种说法是在tomcat的serverxml里面配置,但是我试验发现不行。所以就不推荐了。

接着再说说requset对象,他是属于request作用域的,在一次请求页面中有效。可以得到客户端的参数和提交方式,版本号。

request对象(作用域) 

  客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。 

  方 法 说 明: 

  1 object getAttribute(String name) 返回指定属性的属性值 

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

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

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

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

  6 ServletInputStream getInputStream() 得到请求体中一行的二进制流 

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

  8 Enumeration getParameterNames() 返回可用参数名的枚举 

  9 String[] getParameterValues(String name) 返回包含参数name的所有值的数组 

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

  11 String getScheme() 返回请求用的计划名,如:http.https及ftp等 

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

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

  14 BufferedReader getReader() 返回解码过了的请求体 

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

  16 String getRemoteHost() 返回发送此请求的客户端主机名 

  17 void setAttribute(String key,Object obj) 设置属性的属性值 

  18 String getRealPath(String path) 返回一虚拟路径的真实路径

最后说一说四大门派里面功夫最弱,但是人员最多的一个家庭。他就是page作用域,只在当前页面中有效

先从简单的说起

out对象是JspWriter类的实例,是向客户端输出内容常用的对象 

  方 法 说 明: 

  1 void clear() 清除缓冲区的内容 

  2 void clearBuffer() 清除缓冲区的当前内容 

  3 void flush() 清空流 

  4 int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0 

  5 int getRemaining() 返回缓冲区还剩余多少可用 

  6 boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常 

  7 void close() 关闭输出流 

值得注意的是,在使用clear()前不允许再使用flush();这样的话控制台会报异常。因为flush就已经把流给清空了,而clear再去清除缓存当然会报错;而使用clearBuffer()则不会报错。

page对象是为了执行应答请求和设置的Servlet类的实体,即显示JSP页面自身,只有在JSP页面内才是合法的。Page隐含对象本质上包含当前Servlet接口引用的变量,可以看作是this变量的别名,因此该对象对于开发JSP比较有用
1 page.getClass()//获得page对象的类
2 page.hashCode()//获得page对象的hash码
3 page.toString()//将此page对象转换为String类对象
4 page.notify()//唤醒一个等待的进程
5 page.notifyAll()//唤醒所有等待的进程
6 page.wait()//使一个线程处于等待直到被唤醒
7 page.wait(long timeout)//使一个线程处于等待直到timeout或被唤醒

pageContext对象提供存取所有关于jsp程序执行时期所要用到的属性方法,他被封装成java.servlet.jap.pageContext接口,他的创建和初始化都是容器来完成的,jsp页面里可以直接使用pageContext对象的句柄,pageContext对象的getXXX()、setXXX()和findXXX()方法可以用来根据不同的对象范围实现对这些对象的管理
1  forward(String UriPath) 重定向
2 getAttribute(String name,[int scope] )    scope可选。用来检索一个特定的已经 命名的对象的范围,并且还可以通过调用 getAttributeNamesInScope()方法 ,检索对鞭个特定范围的每个属性String字符串名称的枚举。
3  getException()返回当前的exception对象
4  getRequest()返回当前的request对象
5  getResponse()返回当前的response对象
6  getServletConfig()返回当前页面的ServletConfig对象
7  getServletContext()返回ServletContext对象。这个对象对所有页面都是共享的
8  getSession() 返回当前的session对象
9  findAttribute() 可以用来按照页面,请求,会话以及应用程序范围顺序实现对某个已经命名的属性的搜索。
10 setAttribute() 可以用来设置默认页面范围或特定范围之中的已命名对象。removeAttribute()可以用来删除默认范围或特定范围内的已命名对象

exception指的是Web应用程序能够识别并处理的问题,在Java中利用明为try/catch的关键字来处理异常情况,如果在JSP页面中没有捕捉到的异常,就会生成exception对象,并把这个exception对象传送到在page指令中设定的错误页面中,然后在错误提示页面中处理相应的exception对象
1 exception对象只有在错误页面(在页面指令里有isErrorPage=true的页面)才可以使用
2 getMessage()//获取异常消息字符串
3 getLocalizeMessage()//获取本地化语言的异常错误
4 printStackTrace()//显示异常的栈跟踪轨迹
5 toString()//返回关于异常错误的简单消息描述
6fillInStackTrace()//重写异常错误的栈执行轨迹

7 errorPage="在这里面给它指定错误处理的页面"

config对象被封装成javax.servlet.ServletConfig接口.标识servlet的配置。当一个servlet初始化时,容器把某些信息通过此对象传递给servlet
1 getServletContext() 返回执行者的Servlet上下文
2 getServletName()返回Servlet的名字
3 getInitParameter(String name) 返回名字为name的初始参数的值
4 getInitParameterNames() 返回这个JSP的所有的初始参数的名字

最后来说一说response

response对象和request对象的性质相反,它所包含的是服务器向客户端做出的应答信息.实现过程中response被包装成HttpServletResponse接口,它包含装了JSP产生的响应,然后被发送到客户端以响应客户端的请求
addCookie(Cookie cook) 添加一个Cookie对象,用来保存客户端的用户信息
addHeader(String name,String value) 添加HTTP文件头信息。该Header信息将传达到客户端,如果已经存在同名的则会覆盖
containsHeader(String name) 判断指定字句的Header是否已经存在,返回真假
encodeURL() 使用sessionId封装URL。如果没有封装URL则返回原值
flushBuffer() 强制把当前缓冲区的内容发送到客户端
getBufferSize() 返回缓冲区的大小
getOutputStream() 返回到客户端的输出流
sendError(int)    向客户端发送错误信息。如404 指网页不存在 
sendRedirect(String location) 把响应发送到另一个位置 进行处理 即请求重定向
setContent(String contentType) 设置响应的MIME类型
getWriter() 此方法返回一个PrintWriter对象
getCharacterEncoding() 该方法获得此时相应所采用的字符编码类型
setDateHeader(String name,heaername,long date)把指定的头名称以及日期设置为响应头信息 其值是从新纪元算起的毫秒数
setHeader(String name,String value) 设置指定名字的HTTP文件头的值,若存在则会覆盖。

在这里有一个关键点就是重定向和转发的区别。转发使用的是forward方法,他的作用域是属于request的,也就是说他提交的时候会把客户端的参数给提交过去,属于是一次请求,我们可以得到它的参数值。而重定向使用的是page作用域的response对象的sendRedirect(String location) 方法,他实际上是两次请求,参数并不会传过去。

0 0
原创粉丝点击