欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp内置对象之session等其他

程序员文章站 2024-03-20 12:55:46
...

session内置对象

session是与请求有关的会话期,它是java.servlet.http.HttpSession类的对象,用来表示和存储当前页面的请求信息。

在实际的Web应用开发过程会经常遇到这样的一个问题:会话状态的维持。当然有很多种方法可以用来解决这个问题,例如:Cookies、隐藏的表单输入域或者将状态信息直接附加到URL当中去,但是这些方法使用非常不便。

Java Servlet提供了一个可以在多个请求之间持续有效的会话对象HttpSession,此对象允许用户存储和提取会话状态的信息。JSP同样也支持了Servlet中的这个概念。JSP中的session内置对象就是对应于Servlet中的HttpSession对象。当Web应用系统希望通过多个页面完成一个事务的时候,session的使用是非常有用和方便的。

session对象的常用方法

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)。

session一般在服务器上设置了一个30分钟的过期时间,当客户端停止操作后30分钟,session中存储的信息会自动失效。

另外读者要非常注意的,session中保存和查找的信息不能是基本的类型,如int、double等,而必须是Java相对应的对象,例如Integer、Double等。

问题回答操作实例

接下来本书将创建三个页面来模拟一个多页面的Web应用,使得读者能够对session的使用有深入的了解。第一个页面(session1.jsp)仅仅包含了一个要求输入用户名的HTML表单,代码如下:

<html>
    <body>
    <center><h3>用户名输入页面</h3></center>
    <!—提交表单 -->
    <form action="session2.jsp">
        <table border="1" align="center">
        <tr><td>用户名:<input type="text" name="username" size="10"></td></tr>
        <tr><td align="center"><input type="submit" value="提交"></td></tr>
        </table>
    </form>
    </body>
</html>

程序说明:通过<form>把参数提交给session2.jsp页面进行处理。这一页面的效果如图8.4所示。

第二个页面(session2.jsp)需要通过request对象获取session1.jsp页面中的username参数值,并把它保存在session中。session对象是以哈希表存储信息的。session2.jsp的另外一个操作是询问第二个问题,具体的代码如下:

<html>
<body>
    <center><h3>回答问题页面</h3></center>
<%
    String username = request.getParameter("username"); //获得传递参数username
    session.setAttribute("theusername",username); //把用户名保存在session中,String可以当着对象
%>
    <p>您的用户名为:<%=username%><p>
    <!—提交表单 -->
    <form action="session3.jsp">
        <table border="1" align="center">
            <tr><td>您喜欢吃什么:<input type="text" name="food" size="10"></td></tr>
            <tr><td align="center"><input type="submit" value="提交"></td></tr>
        </table>
    </form>
</body>
</html>

程序说明:使用request内置对象中的getParameter()方法获取到session1.jsp页面传递过来的参数值,并使用session对象中的setAttribute()方法把用户名当着对象存储在session的哈希表中,这里需要指定一个关键字theusername。另外页面使用<form>向session3.jsp页面递交了另外一个参数food。

第三个页面(session3.jsp)主要任务是显示回答结果。具体代码如下:

<html>
<body>
    <center><h3>显示答案</h3></center>
<%! String food="";%>
<%
    food = request.getParameter("food"); //取得food参数值
    String name = (String)session.getValue("theusername"); //从session取出关键字为theusername的对象
%>
    您的用户名:<%=name%>
    <br>您喜欢吃:<%=food%>
</body>
</html>

程序说明:通过关键字theusername使用session对象中的getAttribute(String key)方法获取到用户名,并把用户名和第二个问题的答案显示出来。

session内置对象的使用非常频繁,例如,使用session来存储用户的信息,并可以根据session中的用户对象是否为空来判断用户是否已经登陆。所以读者对此对象的使用要熟练掌握。

application内置对象

application是javax.servlet.ServletContext类对象的一个实例,用于实现用户之间的数据共享(多使用于网络聊天系统)。

application对象与session对象的区别

它的作用有点类似于前一节介绍的session内置对象。但是它们之间还是有区别的,一般来说,一个用户对应着一个session,并且随着用户的离开session中的信息也会消失,所以不同客户之间的会话必须要确保某一时刻至少有一个客户没有终止会话;而applicat则不同,它会一直存在,类似于系统的“全局变量”,而且只有一个实例。

application对象的常用方法

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内置对象中常用方法的使用。

在模块helloworld中创建一个setappattr.jsp页面,用于获取application内置对象中的信息以及设置计数初始值,详细代码如下:

<html>
<h4>获得application信息</h4>
<br>ServletInfo:<%=application.getServerInfo()%>
<br>application.jsp real path: <%=application.getRealPath("/application.jsp")%>
<br>HelloServlet Real Path: <%=application.getRealPath("/servletsample/HelloServlet")%>
<br>Major Version: <%=application.getMajorVersion()%>
<br>get MIME: <%=application.getMimeType("/servletsample/demo.htm")%>
<br>getResource: <%=application.getResource("/HelloJSP.jsp")%>
<% 
    out.println("<br><h4>设置数值</h4>");
    application.setAttribute("name","zzb"); //把字符串“zzb”对象保存在application中
    application.setAttribute("counter","1"); //把字符串值“1”保存在application中
    out.println("set name=zzb");
    out.println("<br>set counter=1");
%>
</body>
</html>

程序说明:此处调用了application内置对象中的setAttribute()方法来存储用户名信息以及计数初始值。

另外在相同目录下创建另外一个getappattr.jsp文件,用于获取计数值。具体的代码如下:

<html>
<body>
<br>获得用户名:<%=application.getAttribute("name")%>
<br>计数值:
<%
    //将保存在application中的关键字为counter的字符串对象取出,然后强制转化成整数型
    int mycounter = Integer.valueOf(application.getAttribute("counter").toString()).intValue();
    out.println(mycounter);
    //将数值加一,然后用新的值来更新保存再application中的counter对象
    application.setAttribute("counter",Integer.toString(mycounter+1));
%>
</body>
</html>

程序说明:和session对象一样,application存储的是对象类型而不是普通的数值类型。此处调用了application对象中的getAttribute()方法来获取前一个页面所存储的信息,并把读取出的计数值加一,然后重新存储在application当中去。

当关闭以上运行的两个浏览器窗口,再多次交替地打开和关闭getappattr.jsp窗口,会看到计数值一直在递增,只用tomcat服务不关闭。而session对象存储的信息会随着窗口的关闭而释放。

config内置对象

config内置对象是ServletConfig类的一个实例。在Servlet初始化的时候,JSP引擎通过config向它传递信息。这种信息可以是属性名/值匹配的参数,也可以是通过ServletContext对象传递的服务器的有关信息。

config内置对象中常用的方法如下。
getServletContext():此方法将返回一个含有服务器相关信息的ServletContext对象。
getInitParameter(String name):返回初始化参数的值。
getInitParameterNames():返回包含了Servlet初始化所需要的所有参数,返回类型是枚举型。
一般在JSP开发过程很少使用到config内置对象。只有在编写Servlet时,需要重载Servlet的init()方式时才用到。

pageContext内置对象

pageContext对象是一个比较特殊的对象。它相当于页面中所有其他对象功能的最大集成者,即使用它可以访问到本页面中所有其他对象,例如前面已经描述的request、response以及application对象等。

pageContext对象的常用方法

这个对象中常使用的方法如下:

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):使用当前位置包含的另一个页面。

之上提到的scope范围的取值含义:

1:Page scope
2:Request scope
3:Session scope
4:Application scope

pageContext对象的简单实例

下面为应用pageContext对象的示范例子:

<html>
<body>
<% 
    request.setAttribute(“MyName”,”zzb1”); //把MyName保存在request范围中
    session.setAttribute(“MyName”,”zzb2”); //将MyName再保存再session范围中
    application.setAttribute(“MyName”,”zzb3”); //将MyName保存在application范围中
%>
request: <%=pageContext.getRequest().getAttribute(“MyName”)%>
<br>session: <%=pageContext.getSession().getValue(“MyName”)%>
<br>application: <%=pageContext.getServletContext().getAttribute(“MyName”)%>
</body>
</html>

pageContext对象在实际JSP开发过程中很少使用,因为像request和response等对象本来就可以直接调用方法进行使用,如果通过pageContext来调用其他对象就有点舍近求远。

out就不说了,和java一样负责输出,但是out.print();和out.println();在jsp中不是回车关系,是空格关系,out.println()可以为空值,out.print()不可以为空值