JSP--JSP内置对象

3.1JSP内置对象的概述

为了简化Web程序开发过程,JSP提供了由容器实现和管理的内置对象,也可以将其称为固有对象,隐含对象。这些内置对象在所有的JSP页面中都可以直接使用,不需要JSP页面编写者来实例化。

JSP中采用Java语言作为脚本编程语言,这样不但是系统具有了强大的对象处理能力,还可以动态创建Web页面内容。但Java语法在使用一个对象之前进行实例化,比较繁琐,为了简化开发,JSP提供了一下内置对象,这也是JSP语法结构中的独特语句变量,又被称为JSP预定义变量。它们都是由系统容器实现和管理,在JSP页面中不需要定义,可以直接使用。

在JSP中一共预先定义了9个这样的对象。

  • request
  • response
  • session
  • application
  • out
  • pageContext
  • config
  • page
  • exception

3.2request对象

request对象是javax.servlet.http.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接收通过HTTP协议传送到服务器端的数据(包括头信息,系统信息,请求方式以及请求参数等)。request对象的作用域为一次请求。

获取请求参数值

在一个请求中,可以通过“?”的方式来传递参数,然后通过request对象的getParameter()方法来获取参数的值。

String id=request.getParameter("id");
使用getParameter()方法从request对象中获取参数id的值,如果request对象中不存在此参数,那么该方法将返回null.

(1)创建index.jsp页面,在其中加入一个超链接按钮用来请求show.jsp页面,并在请求后加一个参数id。


         获取请求参数的值

(2)新建show.jsp页面,在其中通过getParameter()方法来获取id参数与name参数的值,并将其输出到页面中。


         id参数的值为:<%=request.getParameter("id")%>
name参数的值为:<%=request.getParameter("name")%> 运行结果: id参数的值为:001 name参数的值为:null
解决中文乱码

在显示参数值是中文内容时变成乱码,是因为请求参数文字编码方式与页面中的不一致造成的。所有的request请求都是iso-8859-1的,而在此页面采用的是GBK的编码方式。

要解决此问题,只要将获取到的数据通过String的构造方法使用指定的编码类型重新构造一个String对象即可正确地显示出中文。

(1)创建index.jsp页面,在其中加入一个超链接,并在该超链接中传递两个参数:name和sex,其值全部为中文。

<%@ page import="java.net.URLEncoder"%>

          & sex=<%=URLEncoder("男")%>">解决中文乱码

在超链接中传递中文和参数时,这个中文的参数需要应用java.net.URLEncoder.encode()方法进行编码处理,否则在IE6浏览器运行时,有些文字会产生中文乱码。

(2)创建show.jsp页面,在其中将第一个参数name的值进行编码转换。


        name的参数值为:<%=new String(request.getParameter("name").getBytes("iso-8859-1"),"gbk")%>
        sex的参数值为:<%=request.getParameter("sex")%>
 
运行结果:
name的参赛值为:无语
sex的参数值为:??
获取Form表单的信息
除了获取请求参数中传递的值之外,还可以使用request对象获取从表单中提交过来的信息。

在一个表单中会有不同的标签元素,对于文本元素,单选按钮,下拉列表框都可以使用getParameter()方法来获取其具体的值。

对于复选框以及多选列表框被选定内容就要使用getParameterValues()方法来获取了,该方法会返回一个字符串数组,通过循环遍历这个数组就可以得到用户选定的所有内容。

(1)创建index.jsp页面,在该页面中创建一个form表单。

  • please input username:
  • select sex:
  • please choose question for password :
  • please input the answer of question:
  • please choose your habits:
    跳舞 唱歌 阅读
(2)编写show.jsp页面,用来处理请求的。

  • please input username:<%=new String(request.getParameter("name").getBytes("iso-8859-1","gbk")%>
  • select sex: <%=new String(requset.getParameter("sex").getBytes("iso-8859-1","gbk")%>
  • please choose question for password :<%=new String(request.getParameter("question").getBytes("iso-8859-1","gbk")%>
  • please input the answer of question: <%=new String(request.getParameter("key").getBytes("iso-8859-1","gbk")%>
  • please choose your habits: <% String[] like=request.getParameterValues("like"); for(int i=0;i <%=new String(like[i].getBytes("iso-8859-1","gbk")+"  "%> <% } %>
获取请求客户端信息

在request对象中通过相关的方法,还可以获取客户端的相关信息,如HTTP报头信息,客户信息提交方式,客户端主机IP地址,端口号等

request获取客户端信息方法
方法 返回值 说明
getHeader(String name) String 返回指定名称的HTTP头信息
getMethod() String 获取客户端向服务器发送请求的方法
getContextPath() String 返回请求路径
getProtocol() String 返回请求使用的协议
getRemoteAddr() String 返回客户端IP地址
getRemoteHost() String 返回客户端主机名称
getRemotePort() int 返回客户端发出请求端口号
getServletPath() String 返回接受客户提交信息的页面
getRequestURI() String 返回部分客户端请求的地址,不包括请求的参数
getRequestURL() StringBuffer 返回客户端请求地址
使用方法:request.方法名

在作用域中管理属性

通过使用setAttribute()方法可以在request对象的属性列表中添加一个属性,然后在request对象的作用域范围内通过使用getAttribute()方法将其属性取出。

还可以使用removeAttribute()方法将一个属性删除掉。

request对象的作用域为一次请求,超出作用域后属性列表中的属性即会失效。

<%
      request.setAttribute("date",new Date());
%>
  • 获取Date属性:<%=request.getAttribute("date")%>
  • <%=request.removeAttribute("date");%>
  • 删除后再获取Date属性:<%=request.getAttribute("date")%>
cookie管理

cookie是小段的文本信息,通过使用cookie可以标识用户身份,记录用户名及密码,跟踪重复用户。

cookie在服务器端生成并发送给浏览器,浏览器将cookie的key/value保存到某个指定的目录中,服务器的名称与值可以由服务器端定义。

通过cookie的getCookies()方法可以获取所有的cookie对象集合,然后通过cookie对象的getName()方法获取到指定名称的cookie,再通过getValue()方法即可获取到cookie对象的值。

将一个cookie对象发送到客户端使用了response对象的addCookies()方法。

(1)创建index.jsp页面,在其中创建form表单。从request对象中获取cookie,判断是否含有此服务器发送过的cookie,如果没有,则说明该用户第一次访问本站,如果有,则直接将值读取出来,并赋给对应的表单

<%
     String welcome="第一次访问";
     String[] info =new String[]{"","",""};
     Cookie[] cook=request.getCookies();
     if(cook!=null){
             for(int i=0;i
<%=info[0]+welcome %>
           
  • 姓    名:
  • 出生日期:
  • 邮箱地址:
(2)创建show.jsp页面文件,在该页面中通过request对象将用户输入的表单信息提取出来;创建一个cookie对象,并通过response对象的addCookie()方法将其发送到客户端。

<%
      String name=request.getParameter("name");
      String birthday=request.getParameter("birthday");
      String mail=request.getParameter("mail");
      Cookie myCook=new Cookie("mrCooklnfo",name+"#"+birthday+"#"+mail);
      myCook.setMaxAge(60*60*24*365);//设置cookie有效期
      response.addCookie(myCook);
%>
表单提交成功
  • 姓名:<%=name%>
  • 出生日期:<%=birthday%>
  • 邮箱:<%=mail%>
  • 返回
第一次访问页面时用户表单中的信息是空的;当用户提交过一次表单之后,表单中的内容就会被记录到cookie对象中,再次访问时会从cookie中获取用户输入的表单信息并显示在表单中。
获取浏览器使用的语言

在一个支持国际化的站点中,一般都是根据浏览器设定的语言来显示对应内容,只需通过getLocale()方法就可以获取客户端浏览器的语言类型。

3.3response对象

response代表的是对客户端的响应,主要将JSP容器处理过的对象传回客户端。response对象也具有作用域,它只在JSP页面内有效。

response对象的常用方法
方法 返回值 说明
addHeader(String name,String value) void 添加HTTP文件头,如果同名的头存在,则覆盖
setHeader(String name,String value) void 设定指定名称的文件头的值,如果存在则覆盖
addCookie(Cookie cookie)
向客户端添加一个cookie对象 sendError(int sc,String msg) void 向客户端发送错误信息,如404网页找不到 sendRedirect(String location) void 发送请求到另一个指定位置 getOutputStream() ServletOutputStream 获取客户端输出流对象 setBufferSize(int size) void 设置缓冲区大小 重定向网页

重定向是通过使用sendRedirct()方法,将响应发送到另一个指定位置进行处理。

重定向可以将地址重新定向到不同的主机上,在客户端浏览器上将会得到跳转的地址,并重新发送请求链接。用户可以从浏览器的地址栏中看到跳转后的地址。

进行重定向操作后,request中的属性全部失效,并且进入一个新的request对象的作用域。

response.sendRedirect("www.baidu.com");将重定向到百度

注意:在JSP页面中使用该方法前面不要有HTML代码,并且在重定向操作之后紧跟一个return,因为重定向之后下面的代码已经没有意义啦,并且还可能产生错误。

处理HTTP文件头

setHeader()方法通过两个参数——头名称与参数值的方式类设置HTTP文件头。

response.setHeader("refresh","5");//设置网页每5秒自动刷新一次

response.setHeader("refresh","2;URL=welcome.jsp");//设置网页2秒后自动跳转至指定页面

refresh参数并不是HTTP1.1规范中的标准参数,但IE与Netscape浏览器都支持该参数。

response.setContentType("text/html");//设置响应类型

设置输出缓冲

通常情况下,,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区。

只有以下3种情况下,才会把缓冲区的内容写到客户端:

  • JSP页面的输出信息已经全部写入缓冲区。
  • 缓冲区已满
  • 在JSP页面中调用了flushbuffer()方法或out对象的flush()方法。

使用response对象的setBufferSize()方法可以设置缓冲区的大小。

response.setBufferSize(2KB);//缓冲区大小为2KB

还可以使用isCommitted()方法来检测服务器是否已经把数据写入到了客户端。

3.4session对象

session对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生产一个session对象,用于保存该用户的信息,跟踪用户的操作状态。

session对象内部使用Map类来保存数据,因此保存数据的格式为key/value。

session对象的value可以是复杂的对象类型,而不仅仅局限于字符串类型。

session对象的常用方法
方法 返回值 说明
getAttribute(String name) Object 获得指定名字的属性
getAttributeNames() Enumeration 获得session中所以属性对象
getCreationTime() long 获得session对象创建时间
getId() String 获得session对象唯一编号
getLastAccessdTime() long 获得session对象最后一次被操作的时间
getMaxInactiveInterval() int 获得session对象有效时间
isNew() boolean 获得session对象是否为新创建的
removeAttribute(String name) void 获得session对象中指定名称的属性
invalidate() void 获得session对象
setMaxInactiveInterval(int interval) void 设置session对象的最大有效时间
setAttribute(String key,Object obj) void 将obj以key名称保存在session中
创建及获取session信息

session是请求有关的会话对象,是java.servlet.http.HttpSession对象,用于保存和存储页面的请求信息。

session对象的setAttribute(String key,Object obj)方法可实现将信息保存在session范围内,而通过getAttribute(String name)方法可以获取保存在session范围内的信息。

setAttribute(String key,Object obj):key:保存在session范围内的关键字,obj:保存在session范围内的对象

getAttribute(String name) name:指定保存在session范围内的关键字

(1)在index.jsp页面中,实现将文字信息保存在session范围内


      <%
           String sessionMessage="session test";
           session.setAttribute("message",sessionMessage);
           out.print("保存在session范围内的对象为:"+sessionMessage);
        % >

(2)在default.jsp页面中,获取保存在session范围内的信息并在页面中显示


      <%
           String message=(String)session.getAttribute("message);
           out.print("保存在session范围内的对象为:"+message);
        % >
session默认在服务器上的存储时间为30分钟,当客户端停止操作30分钟后,session中存储的信息会自动失效。此时调用getAttribute()等方法,将出现异常。
从会话中移除指定的绑定对象

对于存储在session会话中的对象,如果想将其从session会话中移除,可以使用session对象的removeAttribute()方法。

removeAttribute(String key);key:保存在session范围内的关键字

销毁session

当调用session对象的invalidate()方法后,表示session对象被删除,即不可以再使用session对象。

session.invalidate();

如果调用了session对象的invalidate()方法,之后再调用session对象的任何其他方法时,都将报出Session already invalidated异常。

会话超时管理

应用session对象时应注意session的生命周期。一般来说,session的生命周期在20-30分钟。

当用户首次访问时将产生一个新的会话,以后服务器就可以记住这个会话状态,当会话生命周期超时时,或者服务器端强制使会话失效时,这个session就不能使用了。

为了避免用户登录网站后在session失效时操作,在开发系统时应该对session的有效性进行判断。

session对象提供了设置会话生命周期的方法:

  •  getLastAccessedTime():返回客户端最后一次与会话相关联的请求时间。
  • getMaxInactiveInterval():以秒为单位返回一个会话内两个请求最大时间间隔。超过这个范围session将失效。
  • setMaxInactiveInterval():以秒为单位设置session的有效时间。

session对象的应用

在index.jsp页面中,提供了用户输入用户名文本框;在session.jsp页面中,将用户输入的用户名保存在session对象中,用户在该页面中可以添加最喜欢去的地方;在result.jsp页面中,将用户输入的用户名与最想去的地方在页面中显示。

(1)index.jsp

 
您的名字是:
(2)session.jsp

<%
     String name=request.getParameter("name");
     session.setAttribute("name",name);
     %>
     
您的名字是: <%=name%>
您喜欢去的地方是:
(3)result.jsp
<%
     String name=(String)session.getAttribute("name");
     String address=request.getParameter("address");
      %>
显示
您的名字是:
<%=name%>
您喜欢去的地方是:
<%=address%>
3.5application对象
application对象可以将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象的生命周期更长,类似于系统的“全局变量”。

application对象的常用方法
方法 返回值 说明
getAttribute(String name) Object 通过关键字返回保存在application对象中的信息
getAttributeNames() Enumeration 获取所有application对象使用的属性名
setAttribute(String key,Object obj) void 通过指定的名称将一个对象保存在application对象中
getMajorVersion() int 获取服务器支持的Servlet版本号
getServerInfo() String 返回JSP引擎的相关信息
removeAttribute(String name) void 删除application对象中指定名称的属性
getRealPath() String 返回虚拟路径的真实路径
getInitParameter(String name) String 获取指定name的application对象属性的初始值
访问应用程序初始化参数

application提供了对应用程序环境属性访问的访问。application对象访问应用程序初始化参数的方法如下:

getInitParameter(String name):返回一个已命名的参数值

getAttributeNames():返回所有已定义的应用程序初始化名称的枚举

例:访问应用程序初始化参数

(1)在web.xml文件中通过配置元素初始化参数

              
                    

你可能感兴趣的:(JSP)