JSP拾遗(三)——jsp内置对象

    在看本章介绍的jsp内置对象之前,你有必要回看一下上篇MyJsp_jsp.java的源代码。当那个代码框架在你的脑海中打上印记以后,你会发现很多关于jsp的容易混淆的问题,都将迎刃而解。

 
    request:

    HttpServletRequest的一个实例。 继承自ServletRequest接口,是对Http请求信息的封装。从前面的代码可以看到,web容器已经实例化了一个request对象作为参数传入_jspService()方法中,因此这些内置对象我们可以不用考虑他们的创建。


    作为http请求信息的封装,可以想象,我们使用到request对象的方法,应该是一系列的getXXX方法。但request仍然有两个很特别的set方法,它们是setCharacterEncoding()和setAttribute()方法。其中setAttribute()是显式地往request里面储存对象,这在分发请求时会经常用到。


    String getParameter(String name);  // jsp编程里面用得最多的方法,根据一个标识名,取得它的值,如文本框、选择框等;
    String  getParameterValues(String name); //根据一个标识名,取得它的所有的值。用在同名数组提交的web控件的取值,如复选框等;
    Map getParameterMap() ; //request里面所有参数及值的map集合。当你的一次请求提交里面超过了20个参数要通过getParameter()获取并验证时,你可以尝试用这个方法一次性的取出来,然后构建一个VO对象,通过反射来把request里面的值设置到VO对象里面。Apache的一个团队做的更好,他们开发出了Struts。


    ServletInputStream getInputStream() ; //request里面的二进制输入流。在使用file控件上传文件时,你必须使用这个方法来获取文件流。


    String getRealPath(java.lang.String); //获取所输入资源在操作系统中的绝对地址。在读取服务器文件流时,这个方法将会非常方便。当输入""时,返回当前文件所在目录的绝对地址。从Java Servlet API 2.1开始,这个方法已被废除,取而代之的是ServletContext.getRealPath(String)方法。因此,request需要用这个形式调用了request.getSession().getServletContext().getRealPath(String)


    String getRemoteAddr(); //获取客户端的IP地址。做登录日志记录时必不可少。你既可以根据IP地址库查询显示出客户端所在的城市,也可以禁止这个IP的用户登录。还记得有些网站的登录吗?当连续几次登录错误后,你就无法在一定时间内登录了,但这个一般是在session里面做的,用IP的话,就太“狠”了。(因为客户端可能是局域网登入,封IP将会封掉局域网中的所有用户)


    Cookie[] getCookies(); //获取客户端Cookie。你也可以选择用javascript来操作cookie,但javascript的不安全性很可能暴露你的处理逻辑,比如保存在客户端的用户密码的解密算法,而java则不存在这个问题。Cookie一般用来记录用户的操作习惯,方便用户的操作。特别地在自动登录时,几乎都是用cookie的解决方案。


    response:
    作为服务端的响应对象,HttpServletResponse定义了所有的服务器返回值,包括我们常见的404和500错误代码。与request相对应,response包括了cookie、head等的设值方法。


    setContentType(java.lang.String)设置响应的MIME(Multipurpose Internet Mail Extensions)类型.例如: "text/html;charset=UTF-8"同时包括了编码格式;tomcat的config目录的web.xml里面定义了绝大多数的MIME类型,对于没有定义的类型,必须在web.xml里面定义了以后,这里的设置才起作用。例如Excel的xls类型,需要在web.xml中定义为:

<mime-mapping>
        <extension>xls</extension>
        <mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>

 
    ServletOutputStream getOutputStream() 获取servlet输出流,提供写入二进制数据的功能。和setContentType(java.lang.String)结合使用,你可以用你的jsp货servlet输出任意格式的二进制文件,比如各种影音文件等。特别是在提供下载时,这种做法可以有效地控制权限并隐藏你的实际文件地址。

 

    pageContext

 

     抽象类javax.servlet.jsp.PageContext的一个实例,通过JspFactory.getPageContext()获得。pageContext提供了有用的servlet/jsp上下文的信息,从上文jsp源码中可见:

 

     

application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();

 

        这几个内置对象都是用pageContext获得。同时pageContext提供了getAttribute()和setAttribute()方法,已经相当于页面include的include()方法以及对异常的处理方法handlePageException()。
由上可以看出,在实际jsp代码中,将会很少用到pageContext对象。

 

    session
    HttpSession是无状态的http协议的有力补充,可以认为是表示客户端和服务器之间的一个会话或连接,在一定的连接时间内,这个对象保持不变。如果没有session对象,我这里每发表一篇博客或做次修改,都要重新登录一次。


    我们经常用到session的方法很简单,就是getAttribute()和setAttribute()方法。在一个用户登录了以后,我们会在他的session里面设定一个值,在处理用户的其他请求时,通过检测session的那个值,来避免用户重复登录,更重要的是,保存一些用户相关的临时信息,如购物车等,这个在购物网站中应用最广。而结合SessionListener,我们还可以做到系统的单点登录。


    服务端保持的session需要客户端提供一个标识来唯一确定,这个标识就是sessionId。一般来说sessionId是存储在客户端的cookie里面的,当每次向服务端发送请求时,这个sessionId会自动包含进去。如果客户端禁用了cookie,这就需要显式的用url重写来传入sessionId,比如浏览器会自动加入;jsessionId=.xxxx到URL的后面。

 

    application


    ServletContext的实例。表示整个web应用的上下文,因此在一个web应用中,只有一个application对象,它的生命周期也是最长的(从应用启动到停止的整个过程中有效)。在web容器里面,web.xml里面的app属性来定义一个web应用,:

<web-app version="2.4" 
 xmlns="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <context-param>
  <description>DB Connection URL</description>
  <param-name>URL</param-name>
  <param-value><![CDATA[jdbc:mysql://localhost:3306/test?user=root&password=root]]></param-value>
 </context-param>
</web-app>

 
    application里面除了可以set/get整个应用共用的资源(例如数据库连接)外,还提供了对应用上下文配置(<web-app>里面<param>设置的参数),对资源的读取等功能。

 

    config
    ServletConfig用来访问web应用启动时初始化的配置信息,主要是 getInitParameter() 和getInitParameterNames() 方法,和application中的方法调用相同。


    out

    当前页的JspWriter对象。通过上文的源代码可以看出,所有的jsp中的html代码都将通过out对象的write ()方法输入。出来write()方法外,jsp里调用最多的应该是Print()和println()方法了。在jsp中,你会经常用到在数据处理页中用out输出一段javascript代码来提示并控制页面转向。例如:

out.println(“<script type=’text/javascript’>alert(‘用户名或密码错误,请重新输入’); history.back();</script>”);

 
 
    page
    从上文的代码可以看出,page就是jsp中this的引用,只是向上转型了Object而已。你可以将其转型为Servlet来调用其方法,但一般来说,你没有必要这么用它。正因为它的不常用,往往在java代码段中会忽视了它,比如你分页时自己又定义了一个表示页数的整型page,当然,jsp在编译时就会把这个错误给报出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值