jsp中内置对象详解

在jsp技术中,有些变量是需要声明之后才能应用的,而有些变量不需要在jsp的脚本语言里声明就能够使用的,被称为jsp页面的内置对象,内置对象有request、response、session、application;下面逐个进行介绍。

一、request对象

顾名思义,request是处理请求信息的对象;用户和服务器之间进行交互是通过遵守“http协议”进行的,“http协议”又叫“请求与响应”协议,当用户通过在浏览器地址栏里输入服务器的地址和页面的名字来请求该页面时,就向服务器发送了一个请求,这个请求里包含了客户的请求信息,被封装在request对象里,通过request对象的响应方法来调取信息;

(1)、request对象获取用户的提交信息

当用户用form表单向服务器提交信息时,该信息会被tomcat封装在request对象里;request通过getRequest()方法来获取这些信息,getRequest()也是request对象许多方法中最常用的方法,下面用例子来进行说明:

request.getParameter()方法


首次打开结果

注意:此处代码的第18行必须加入异常处理,因为当第一次打开页面时变量str1为空值,此时不能作类型转换;

(2)、处理汉字信息

当用request对象获取信息时可能出现中文乱码问题,这里可以采用以下办法:对获取的信息作重新编码,如:Stinger str=request.getParameter("name");Byte b[]=str.getByte("ISO-8859-1");str=new String(b);另外对于jsp通过另两种办法处理post方式和get方式提交的中文乱码问题的对应解决方案请点击链接:解决jsp页面中文乱码问题;例子如下:

exzample4_2
showMessage4_2

(3)、request对象的常用方法

getProtocol():获取请求使用的通信协议;

getServletPath():获取请求的jsp页面所在的目录;

getContentLength():获取http请求的长度;

getmethod():获取表单提交信息的方式;

getHeader(String s):获取请求中头的一个值;

getHeaderNames():获取头名字的一个枚举;

getRemoteAddr():获取客户的IP地址;

getRemoteHost():获取客户机的名称(如果获取不到就获取IP地址);

getServerName():获取服务器的名称;

getServerPort():获取服务器的端口号;

getParameterNames():获取表单提交的信息体部分中name参数值的一个枚举;

二、response对象

和request对象相对应的是response对象,这个对象用来设置服务器对用户的回应信息;

(1)、改变contentType属性的值

在page指令中,contentType属性只能被赋值一次,但在动态的回应用户这方面是极不方便的,而通过response对象的setContentType(String s)方法就可以实现这一点,其中s可以取值为text/html,text/plain,image/gif,image/jpeg,image/x-xbitmap,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword等,实例如下:

response.setContType()
点击按钮1结果

(2)、设置响应的http头

在对用户进行响应时,可以设置响应头以便控制响应;response对象可以使用addHeader(String head,String value);setHeader(String head,String nalue)进行添加,如果添加之前已经添加过则先前添加的将被覆盖;下面例子将实现使用户的浏览器5秒钟刷新一次的功能:

refresh代码
显示结果

(3)、重定向

response对象的sendRedirect()方法可以把客户机从当页面引导到另一页面,示例如下:

sendRedirect()方法

三、session对象

上面的request对象和response对象的信息在一个页面的一次请求和响应有效,而在用户和服务器进行连接和多个页面之间进行跳转时就不能共享request信息和response信息,这就需要使用session对象;

(1)、session对象的id

服务器通过session对象来实现一个用户的多个页面之间进行共享信息,当用户和服务器进行一次连接,服务器将对该用户分配一个唯一的id,当用户提交信息时,服务器可以使用session对象的相应方法把信息存储下来,以便用户在在同一服务器的其他页面使用;只要用户不关闭浏览器或者session对象的生存空间没有达到最大,用户的id就不会改变,用户保存的信息就能够一直保存下去;session可以通过getId()方法得到服务器为用户分配的id;

(2)、session对象存储数据

public void setAttribute(String key,Object obj):该方法将指定的obj对象存储在session对象中,并为该对象提供key索引,如果两次添加的对象的索引相同则第一次添加的对象将被覆盖;

public Object getAttribute(String key):该方法通过查找索引来获取存储在session对象中的object对象,注意获得的对象要通过强制类型转换转换为原来的数据类型;

public Enumeration getAttributeNames():该方法获得一个枚举对象,该枚举对象使用nextElemets()方法遍历session保存的各个对象对应的关键字;

public void removeAttribute(String name):该方法移掉name索引对应的对象;

下面通过实例来模拟购物车、存储客户姓名和购买商品功能,代码如下: 

客户登记姓名页面
food4_6.jsp
count4_6.jsp主要代码

(3)、session对象的生存期限

session对象当满足以下三种情况会失效,用户关闭浏览器,session对象的生存时间达到最大和session对象调用了invalidate()方法;失效后如果还需用到sessio对象,服务器就会重新生成不同ID号的session对象;其中session对象的生存时间可以通过修改服务器下的web.xml文件来修改,系统默认生存时间为30分钟,将30修改为想要的时间即可,修改代码段如下:

web.xml代码段

另外session对象关于生存期限的信息处理有以下常用的方法:

public long getLastAccessedTime():获取session最后被操作的时间,单位为毫秒数(从1970年7月1日午夜起至该对象最后被操作时刻所走的毫秒数);

public int getCreationTime():获取session对象被创建的时间;

public int getMaxInactiveInterval():获取对象的最大生存时间;

public void setMaxInactiveInterval():设置对象的最大生存时间;

public boolean isNew():判断当前session是否是一个新建的会话;

invalidate():使session无效;

(4)、session对象与url重写;

当服务器为客户机的一个页面生成一个ID时,另一个页面是怎么得到该id并识别是同一个客户的呢?这就有必要说一下cookie的概念,当服务器为一个客户生成一个ID时会在客户的浏览器启用cookie,这个cookie在用户的浏览器上保存有生成的id,当客户再次发送请求时会验证该cookie的id,这就使得用户和服务器之间的是一一对应的关系;但是用户为了自己的隐私保密,可以在浏览器上设置禁用cookie这就使得同一个客户的同一次请求可能会有不同的id,导致session信息的不共享,为此,可以使用response的encodeURL()或者encodeRedirectURL()方法进行定向页面时在URL上保存session对象的id;例如上述food4_6.jsp代码可作如下修改:

url重写

`五、application对象

上面已经介绍了request、response、session对象,上面的三个对象的作用范围只能局限在同一个页面或者是同一个客户,但是有时候不同客户需要共享一些信息,这就需要一个作用范围在服务器上的对象,这个对象就是application对象,由服务器启动时生成且被所有客户共享;application对象的常用方法有下面几个:

public void setAttribute(String key,Object obj):该方法将指定的obj对象存储在application对象中,并为该对象提供key索引,如果两次添加的对象的索引相同则第一次添加的对象将被覆盖;

public Object getAttribute(String key):该方法通过查找索引来获取存储在application对象中的object对象,注意获得的对象要通过强制类型转换转换为原来的数据类型;

public Enumeration getAttributeNames():该方法获得一个枚举对象,该枚举对象使用nextElemets()方法遍历application保存的各个对象对应的关键字;

public void removeAttribute(String name):该方法移掉name索引对应的对象;

public String getServletInfo()该方法获取当前编译器的版本信息;

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 105,064评论 12 126
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 26,375评论 17 394
  • 百战程序员_ Java1573题 QQ群:561832648489034603 掌握80%年薪20万掌握50%年薪...
    Albert陈凯阅读 13,225评论 3 33
  • 景点推荐 霍顿平原 Horton's Plain(霍顿平原)是个美丽、安静、奇特的地方。所谓的“平原”,本身也是一...
    i小魔女琦琦阅读 57评论 0 0
  • 如果说起来我玩游戏的历史,可能就有点暴露年龄了,简书上恐怕没有几个人用过386电脑玩游戏吧。 那时甚至还没有网游,...
    章非阅读 93评论 0 2