JSP的内置对象
大家好,我是IT修真院深圳分院第4期的学员,一枚正直纯洁善良的JAVA程序员
今天给大家分享一下,修真院官网JAVA任务四,深度思考中的知识点——JSP的内置对象。
分享人:魏振恒
1.背景介绍
JSP内置对象
虽然目前web开发更为常见的组合SpringMVC+AJAX,但作为一个合格的java工程师还是很有必要了解一下JSP的九大内置对象的。像request、response、session这些常用的对象,即便使用其他框架也是会经常用到的。因此十分有了解的必要。
这些对象可以在JSP页面中调用,而不需要事先定义,这使得JSP编程更加的方便和快捷。其实这些内置对象都对应着某个Servlet类,在JSP被翻译成Servlet之后,这些内置对象会相应转换成对应的类实例。
九大内置对象
request客户端请求-----response服务器响应-----page页面本身
session会话-----applicationWEB 应用本身-----out输出流
exception错误异常-----config JSP配置信息-----pageContext页面上下文
request
request内置对象是最常用的对象之一,它代表的是java.servlet.HttpServletRequest类的对象。request内置对象中包含了有关浏览器请求的信息,并提供了多个用于获取cookie、header以及session内数据的方法。所以他的方法很多。
getMethod():返回HTTP请求信息中所使用到的方法名称;
getServletPath():返回请求信息中调用Servlet的URL部分;
getQueryString():返回HTTP GET请求信息中URL之后的查询字符串;
getContentType():返回请求实体的MIME类型;
getProtocol():返回请求信息中的协议名名字与版本号;
getPathInfo():返回有关任何路径信息;
getServletName():返回接受请求的服务器主机;
getServletPort():返回服务器的端口号;
getRemoteHost():返回提交请求的客户机的规范名字;
getRemoteAddr():返回提交请求的客户机的IP地址;
getScheme():返回请求使用的模式(协议)名字;
getParameter():返回客户端通过表单提交过来的参数值。例如request.getParameter(“myname”),通过该语句来获取客户端传递过来的myname 参数。
getContextPath():返回HTTP 请求中指示请求上下文的部分。
getHeaderNames():返回一个枚举类型,此枚举集合中包含了请求所含有的所有请求名。
getAuthType():返回用于保护Servlet 的认证模式的名字。例如,BASIC,SSL 或者NULL(没有保护)。
gtRequestURL():返回HTTP 请求信息中的第一行从协议名开始直至查询字符串之间的URL 部分。例如,对HTTP GET 请求http://www.zzbsite.com/helloworld?name=johnson&age=20,这个方法将返回http://www.zzbsite.com/helloworld 字符串。
gtCountLength():返回整数,表示请求实体的长度(以字节为单位)。
gtUestPrincipal():返回java.security 类的Principal 对象,其中包含有目前授权用户的名字。
iUserInRole(String role):返回一个布尔值,指示某个授权用户是否包含在某个具体的逻辑角色role 中。
gtRemoteHost():如果用户已经被授权,则返回提交请求的用户的注册名字,否则返回一个NULL。
response
response对象提供了多个方法用来处理HTTP响应,可以调用response中的方法修改ContentType中的MIME类型以及实现页面的跳转等等
以下列出常用的方法
setContentLength(int len):此方法用于设置响应头的长度。
setContentType(String type):用于设置HTTP响应的contentType中的MIME类型,其中可以包含字符编码的规则。例如可以把contentType设置为“text/html;char
set=GBK”。在Servelet编写过程中,需要调用此方法进行设置,但是在JSP中一般都是使用page指令直接指定contentType的属性。
getOutputStream():此方法返回一个Servlet的输出流。用于在响应中写入二进制数据。Servlet容器不对二进制数据进行编码。
getWriter():此方法返回一个PrintWriter对象,在Servlet编写过程使用的比较频繁,而在JSP文件中,由于out是用getWriter()创建的PrintWriter对象的隐含对象,所以可以直接调用out对象作输出响应。
getCharacterEncoding():该方法获得此时响应所采用的字符编码类型。
sendError(int status):使用指定错误状态码向客户机发送相应的错误信息。
sendError(int status, String message):使用自定义的错误状态码以及描述信息向客户机发送错误的提示信息。
sendRedirect(String location):将请求重新定位到一个不同的URL(页面)上。此方法在实际开发过程中会经常使用到。
setDateHeader(String headername, long date):把指定的头名称以及日期设置为响应头信息。其中日期是用long值表示的,这是按照从新纪元开始算起的毫秒数。
ContainsHeader(String name):检测指定的头信息是否存在。返回一个布尔类型。
setHeader(String headername, String value):此方法使用指定的头名字以及相应的值来设置头信息。如果此头信息已经设置,则新的值会覆盖掉旧的值。如果头信息已经被发送出去,则此方法的设置将被忽略。
addheader(String headername, String value):把指定的头名字以及相应值添加到头信息当中去。
addIntHeader(String headername, int value):把指定的头名字以及整数值设置为头信息。如果头信息已经设置了,则新的设置值将覆盖掉以前的值。
setStatus(int sc):给响应设置状态的代码。
setStatus(int sc, String sm):为响应设置状态代码以及信息。这是在没有错误的时候使用的。
上述方法中,getWriter()和sendRedirect(String location)在实际开发中使用的最为频繁。 getWriter()常出现在Servlet编写中。所以这个代码展示就用这两个。
page
page对象有点类似于Java编程中的this指针,就是指当前JSP页面本身。page是java.lang.Object类的对象。
以下列出常用的方法
getClass():返回当时Object的类。
hashCode():返回此Object的哈希代码。
toString():把此时的Object类转换成字符串。
equals(Object o):比较此对象是否和指定的对象是否相等。
copy(Object o):把此对象复制到指定的对象当中去。
clone():对此对象进行克隆。
session
session是与请求有关的会话期,它是java.servlet.http.HttpSession类的对象,用来表示和存储当前页面的请求信息。
在实际的Web应用开发过程会经常遇到这样的一个问题:会话状态的维持。当然有很多种方法可以用来解决这个问题,例如:Cookies、隐藏的表单输入域或者将状态信息直接附加到URL当中去,但是这些方法使用非常不便。
Java Servlet提供了一个可以在多个请求之间持续有效的会话对象HttpSession,此对象允许用户存储和提取会话状态的信息。JSP同样也支持了Servlet中的这个概念。JSP中的session内置对象就是对应于Servlet中的HttpSession对象。当Web应用系统希望通过多个页面完成一个事务的时候,session的使用是非常有用和方便的。
session一般在服务器上设置了一个30分钟的过期时间,当客户端停止操作后30分钟,session中存储的信息会自动失效。
此外需要注意的,session中保存和查找的信息不能是基本的类型,如int、double等,而必须是Java相对应的对象,例如Integer、Double等。
以下列出常用的方法
getId():此方法返回唯一的标识,这些标识为每个session而产生。当只有一个单一的值与一个session联合时,或当日志信息与先前的sessions有关时,它被当作键名用。
getCreationTime():返回session被创建的时间。最小单位为千分之一秒。为得到一个对打印输出很有用的值,可将此值传给Date constructor 或者GregorianCalendar的方法setTimeInMillis。
getLastAccessedTime():返回session最后被客户发送的时间。最小单位为千分之一秒。
getMaxInactiveInterval():返回总时间(秒),负值表示session永远不会超时。
getAttribute(String key):通过给定的关键字获取一个存储在session中相对应的信息。例如,Integer item = (Integer) session.getAttrobute("item")。
setAttribute(String key, Object obj):提供一个关键词和一个对象值,然后存在session当中。例如,session.setAttribute("ItemValue", itemName)。
application
application是javax.servlet.ServletContext类对象的一个实例,用于实现用户之间的数据共享(多使用于网络聊天系统)。
application对象与session对象的区别
它的作用有点类似session内置对象。但是它们之间还是有区别的,一般来说,一个用户对应着一个session,并且随着用户的离开session中的信息也会消失,所以不同客户之间的会话必须要确保某一时刻至少有一个客户没有终止会话;而applicat则不同,它会一直存在,类似于系统的“全局变量”,而且只有一个实例。
application常用方法
getAttribute(String key):通过一个关键字返回用户所需要的信息,返回类型为对象(Object),类似于session中的getAttribute(String key)方法。
getAttributeNames():返回所有可用的属性名,返回类型为枚举(Enumeration)。
setAttribute(String key, Object obj):保存一个对象信息,并指定给一个关键字。
removeAttribute(String key):通过关键字来删除一个对象信息。
getServletInfo():返回JSP引擎的相关信息。
getRealPath(String path):返回虚拟路径的真实路径。
getContext(String URLPath):返回执行Web应用的application对象。
getMajorVersion()和getMinorVersion():返回服务器所支持的Servlet API最大和最小版本号。
getMineType(String file):返回指定文件的MIME类型。
getResource(String path):返回指定资源的URL路径。
getResourceAsStream(String path):返回指定资源的输入流。
getRequestDispatcher(String URLPath):返回指定资源的RequestDispatcher对象。
getServlet(String name):返回指定名称的Servlet。
getServlets():返回所有的Servlet,返回类型为枚举型。
getServletNames():返回所有的Servlet名称,返回类型为枚举型。
log(String msg):把指定信息写入到Servlet的日志文件中。
log(String msg, Throwable throwable):把栈轨迹以及给出的Throwable异常的说明信息写入Servlet的日志文件。
本次用的是浏览器计数,本段代码证明application是基于服务器的,不会因为会话关闭就清除。 和session对象一样,application存储的是对象类型而不是普通的数值类型。此处调用了application对象中的getAttribute()方法来获取前一个页面所存储的信息,并把读取出的计数值加一,然后重新存储在application当中去。
out
out对象是在JSP开发过程中使用得最为频繁的对象,但使用也是最为简单的。
print():在页面中打印出字符串信息,不换行;
println():在页面中打印出字符串信息,并且换行;
clear():清除掉缓冲区中尚存在的内容。
clearBuffer():此方法清除掉当前缓冲区中尚存在的内容。
flush():清除掉数据流。
getBufferSize():返回缓冲区的内存大小,单位为字节流。如果不进行缓冲区的设置,大小为0。
getRemaining():此方法返回缓冲区还剩下多少字节数可以使用。
isAutoFlush():检查当前缓冲区是设置为自动清空,还是满了就抛出异常。
close():关闭输出流。
exception
exception内置对象是用来处理页面出现的异常错误,它是java.lang.Throwable类的一个对象。前面已经讲过,在实际JSP网站开发过程中,通常是在其页面中加入page指令的errorPage属性来将其指向一个专门处理异常错误的页面。如果这个错误处理页面已经封装了这个页面收到的错误信息,并且错误处理页面页面含有的isErrorpage属性设置为true,则这个错误处理页面可以使用以下方法来访问错误的信息:
getMessage()和getLocalizedMessage():这两种方法分别返回exception对象的异常消息字符串和本地化语言的异常错误。
printStackTrace():显示异常的栈跟踪轨迹。
toString():返回关于异常错误的简单消息描述。
fillInStackTrace():重写异常错误的栈执行轨迹。
config
config内置对象是ServletConfig类的一个实例。在Servlet初始化的时候,JSP引擎通过config向它传递信息。这种信息可以是属性名/值匹配的参数,也可以是通过ServletContext对象传递的服务器的有关信息。
getServletContext():此方法将返回一个含有服务器相关信息的ServletContext对象。
getInitParameter(String name):返回初始化参数的值。
getInitParameterNames():返回包含了Servlet初始化所需要的所有参数,返回类型是枚举型。
一般在JSP开发过程很少使用到config内置对象。只有在编写Servlet时,需要重载Servlet的init()方式时才用到。
pagecontext
pageContext对象是一个比较特殊的对象。它相当于页面中所有其他对象功能的最大集成者,即使用它可以访问到本页面中所有其他对象,例如前面已经描述的request、response以及application对象等。
getRequest():返回当前页面中的request对象。
getResponse():使用此方法将返回当前页面中的response对象。
getPage():此方法返回当前页面中的page对象。
getSession():返回当前页面中的session对象。
getOut():返回当前页面中的out对象。
getException():返回当前页面中的exception对象。
getServletConfig():返回当前页的config对象。
getServletContext():返回当前页中的application对象。
setAttribute(String name):给指定的属性名设置属性值。
getAttribute(String name):根据属性名称找到相应的属性值。
setAttribute(String name, Object obj, int scope):在给定的范围内设置相应的属性值。
getAttribute(String name, int scope):在指定的范围内获取到相应的属性值。
findAttribute(String name):寻找一个属性并返回,如果没有找到则返回一个null。
removeAttribute(String name):通过属性名删除掉某个属性。
removeAttribute(String name, int scope):在指定的某个范围内删除某个属性。
getAttributeScope(String scope):返回某属性的作用域。
getAttributeNamesInScope(int scope):返回指定范围内的所有属性名的枚举。
release():释放掉pageContext()所占的所有资源。
forward(String relativeURLpath):使用当前页面重导到另一个页面。
include(String relativeURLpath):使用当前位置包含的另一个页面。
提问与回答
1、request、session和application的作用域的区别?
答:request的作用域是当前页面,是生命周期最短的,只在一次提交中有效;session指的是会话,定义是只要不退出当前页面,这个session就一直存在;application是项目本身,作用域是所有用户共享的,生命周期和项目一样,项目关闭时销毁。
2、pagecontext怎么使用
pagecontext是页面上下文,相当于spring的配置文件,可以从里面加载内置对象中的所有对象。
3、Forword和SendRedirect区别
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。但在有些情况下,
比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,
浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。redirect就是服务端根据逻辑,发送一个状态码,
告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
7.参考文献
网络
8.更多讨论
欢迎大家交流和讨论
鸣谢
感谢大家观看
BY : 魏振恒