📄 请求的重定向
字号:
deleteAllInvalidSessions方法的声明如下:public void deleteAllInvalidSessions()它首先把所有会话文本文件的名字读入files字符串数组:File dir = new File(path); String[] files = dir.list();deleteAllInvalidSessions方法比较文本文件的最后修改时间(加上超时时间)和系统当前时间,确定会话是否过期。long类型的变量now用于保存系统的当前时间。long now = System.currentTimeMillis();接下来,deleteAllInvalidSessions方法通过循环访问files数组,依次检查每个文件的lastModified属性。所有与过期会话关联的文件都将被删除:for (int i=0; i now) f.delete(); // 删除过期的会话文本文件}五、应用实例编译好PseudoSessionBean这个JavaBean之后,我们就可以利用伪会话管理机制来管理Web应用的会话状态信息了。由于不必再使用服务器的会话管理机制,我们可以在page指令中把session属性设置为false关闭默认的JSP/Servlet会话管理功能。然后,我们用JSP的标记告诉JSP容器程序要使用PseudoSessionBean:在上面这个标记中,class属性值是“包.类名字”形式。当然,对于不同的包名字,class属性的值应该作相应的修改。注意Bean的 scope属性是“application”,这是因为我们要在应用的所有页面中使用这个Bean。在这个应用中,把Bean的scope属性设置为 “application”具有最好的效率,因为我们只需创建Bean对象一次就可以了。另外,正如前面所提到的,getSessionID方法必须在所有其他代码之前调用。为了说明PseudoSessionBean的应用,下面我们来看两个JSP页面,它们是index.jsp和secondPage.jsp。index.jsp页面在伪会话变量中保存用户的名字,而secondPage.jsp则提取这个用户名字。index.jsp页面的代码如下:伪会话管理机制>点击此处>输入数据:注意,包括标记的action属性在内,所有的超级链接都已经改写,现在都包含了会话标识符。另外也请注意页面的最后调用了deleteAllInvalidSessions方法。secondPage.jsp页面只简单地返回以前保存的用户名字。杰普 ----- 程 兴在探索的道路上,愿快乐与喜悦与你一起分享! Servlets 动态生成图片chengx管理员发贴: 1246积分: 0 于 2005-06-03 10:27 user profilesend a private message to usersearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list Image I/O 包及对 JDK 的要求 如果你的 servlet 要动态生成图象,首先你需要 image I/O,明确的说,你需要生成一图片来响应HTTP请求。核心 Java API 没有直接提供用于保持任何图象的功能。然而,你可以用 Sun 的 Java 1.1 类库来做 image I/O。而且 Sun 的 1.2 版的 image I/O 提供了对 JPEG 图象进行编码和解码的包。因为这些代码在 com.sun 包中,不是核心API的一部分,也不是标准的扩展包,因此,会影响代码的可移植性。 使用 jdk 1.2 将比 jdk 1.1 版容易的多,本文介绍 jdk 1.2 下的实现方法。示例有三个步骤:创建、绘制、保存。在本例仅仅示范如何画一个椭圆,当然你可以根据你的需要修改。例子使用了 com.sun.image.codec.jpeg 包生成 JPEG 文件。如果要生成 GIF 文件,你可以使用第三方的包,如 Acme Labs 的 GIF Encoder。1. 使用适当的尺寸创建一个 BufferedImage 对象:BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);2. 在 image 对象上绘制你想要的图象。假设你想要一个白色的背景,你需要画一个白色填充的矩形。否则背景将是缺省的黑色: Graphics g = image.getGraphics(); g.setColor(Color.white); g.fillRect(0,0, width, height); g.setColor(Color.red); g.drawOval(0, 0, width, height);3. 使用 com.sun.image.codec.jpeg 包输出 BufferedImage: response.setContentType("image/jpeg"); ServletOutputStream out = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close();Servlet中如何捕获Session事件?chengx管理员发贴: 1246积分: 0 于 2005-06-03 10:18 user profilesend a private message to usersearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list 捕获Session事件的意义:1、 记录网站的客户登录日志(登录,退出信息等)2、 统计在线人数3、 等等还有很多,呵呵,自己想吧……总之挺重要的。Session代表客户的会话过程,客户登录时,往Session中传入一个对象,即可跟踪客户的会话。在Servlet中,传入Session 的对象如果是一个实现HttpSessionBindingListener接口的对象(方便起见,此对象称为监听器),则在传入的时候(即调用 HttpSession对象的setAttribute方法的时候)和移去的时候(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)Session对象会自动调用监听器的valueBound和valueUnbound方法(这是 HttpSessionBindingListener接口中的方法)。由此可知,登录日志也就不难实现了。另外一个问题是,如何统计在线人数,这个问题跟实现登录日志稍微有点不同,统计在线人数(及其信息),就是统计现在有多少个Session实例存在,我们可以增加一个计数器(如果想存储更多的信息,可以用一个对象来做计数器,随后给出的实例中,简单起见,用一个整数变量作为计数器),通过在 valueBound方法中给计数器加1,valueUnbound方法中计数器减1,即可实现在线人数的统计。当然,这里面要利用到 ServletContext的全局特性。(有关ServletContext的叙述请参考Servlet规范),新建一个监听器,并将其实例存入 ServletContext的属性中,以保证此监听器实例的唯一性,当客户登录时,先判断ServletContext的这个属性是否为空,如果不为空,证明已经创建,直接将此属性取出放入Session中,计数器加1;如果为空则创建一个新的监听器,并存入ServletContext的属性中。举例说明:实现一个监听器:// SessionListener.javaimport java.io.*;import java.util.*;import javax.servlet.http.*;//监听登录的整个过程public class SessionListener implements HttpSessionBindingListener{public String privateInfo=""; //生成监听器的初始化参数字符串private String logString=""; //日志记录字符串private int count=0; //登录人数计数器public SessionListener(String info){this.privateInfo=info;}public int getCount(){return count;}public void valueBound(HttpSessionBindingEvent event){count++;if (privateInfo.equals("count")){return;}try{Calendar calendar=new GregorianCalendar();System.out.println("LOGIN:"+privateInfo+" TIME:"+calendar.getTime());logString="\nLOGIN:"+privateInfo+" TIME:"+calendar.getTime()+"\n";for(int i=1;i<1000;i++){File file=new File("yeeyoo.log"+i);if(!(file.exists()))file.createNewFile(); //如果文件不存在,创建此文件if(file.length()>1048576) //如果文件大于1M,重新创建一个文件continue;FileOutputStream foo=new FileOutputStream("yeeyoo.log"+i,true);//以append方式打开创建文件foo.write(logString.getBytes(),0,logString.length()); //写入日志字符串foo.close();break;//退出}}catch(FileNotFoundException e){}catch(IOException e){}}public void valueUnbound(HttpSessionBindingEvent event){count--;if (privateInfo.equals("count")){return;}try{Calendar calendar=new GregorianCalendar();System.out.println("LOGOUT:"+privateInfo+" TIME:"+calendar.getTime());logString="\nLOGOUT:"+privateInfo+" TIME:"+calendar.getTime()+"\n";for(int i=1;i<1000;i++){File file=new File("yeeyoo.log"+i);if(!(file.exists()))file.createNewFile(); //如果文件不存在,创建此文件if(file.length()>1048576) //如果文件大于1M,重新创建一个文件continue;FileOutputStream foo=new FileOutputStream("yeeyoo.log"+i,true);//以append方式打开创建文件foo.write(logString.getBytes(),0,logString.length()); //写入日志字符串foo.close();break;//退出}}catch(FileNotFoundException e){}catch(IOException e){}}}登录日志的实现:下面再来看看我们的登录Servlet中使用这个监听器的部分源代码:……HttpSession session = req.getSession (true);……///////////////////////////////////////////////////////////////////////SessionListener sessionListener=new SessionListener(" IP:"+req.getRemoteAddr()); //对于每一个会话过程均启动一个监听器session.setAttribute("listener",sessionListener); //将监听器植入HttpSession,这将激发监听器调用valueBound方法,从而记录日志文件。///////////////////////////////////////////////////////////////////////当系统退出登录时,只需简单地调用session.removeAttribute(“listener”);即可自动调用监听器的valueUnbound方法。或者,当Session Time Out的时候也会调用此方法。登录人数的统计:ServletContext session1=getServletConfig().getServletContext();//取得ServletContext对象实例if((SessionListener)session1.getAttribute("listener1")==null){SessionListener sessionListener1=new SessionListener("count");//只设置一次,不同于上面日志文件的记录每次会话均设置。即当第一个客户连接到服务器时启动一个全局变量,此后所有的客户将使用相同的上下文。session1.setAttribute("listener1",sessionListener1);//将监听器对象设置成ServletContext的属性,具有全局范围有效性,即所有的客户均可以取得它的实例。}session.setAttribute("listener1",(SessionListener)session1.getAttribute ("listener1"));//取出此全局对象,并且将此对象绑定到某个会话中,此举将促使监听器调用valueBound,计数器加一。在此后的程序中随时可以用以下代码取得当前的登录人数:((SessionListener)session.getAttribute("listener1")).getCount()getCount()是监听器的一个方法,即取得当前计数器的值也就是登录人数了。ervlet的2种重定向方法kevin管理员发贴: 330积分: 0 于 2005-06-02 13:35 user profilesend a private message to usersearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list 在servlet/JSP编程中,服务器端重定向可以通过下面两个方法来实现:1,运用javax.servlet.RequestDispatcher接口的forward方法,2,或者运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法。要运用RequestDispatcher接口的forward方法,首先要得到一个RequestDispatcher对象。servlet技术提供了三种方式来得到它:1. 通过运用javax.servlet.ServletContext接口的getRequestDispatcher方法,将一个包含路径的String传递给其它资源。该路径是相对于ServletContext的根路径的。2. 通过运用javax.servlet.ServletRequest接口的getRequestDispatcher方法,将一个包含路径的String传递到其它资源。该路径是相对于当前的HTTP请求的。3. 通过运用javax.servlet.ServletContext接口的getNamedDispatcher方法,传递一个包含其它资源名字的String。但要注意,你只有在客户端没有输出时才可以调用forward方法。如果当前页面的缓冲区(buffer)不是空的,那么你在调用forward 方法前必须先清空缓冲区。否则,会抛出一个IllegalStateException。forward方法也可以用来将请求发送到一个静态的页面。在运用RequestDispatcher对象的forward方法来将一个控件从一个叫做ABCServlet的servlet传递到另一个叫做 XYZServlet的servlet时,最简单的方法就是把ABCServlet和XYZServlet的类文件放在同一个目录中。通过这种方法,你就可以从URL http://domain/VirtualDir/servlet/ABCServlet来调用ABCServlet,从URL http://domain/VirtualDir/servlet/XYZServlet来调用XYZServlet了。然后运用forward方法就很简单了。你可以从ServletRequest接口运用getRequestDispatcher ,传递第二个servlet的名字。在ABCServlet中,你可以写下面的代码:RequestDispatcher rd =request.getRequestDispatcher("SecondServlet");rd.forward(request, response);你不需要在XYZServlet前放 / 符号。这种方法是最简单的,因为你根本不需要担心两个servlets的路径。稍复杂的方法就是把下面这个String传递到ServletRequest的getRequestDispatcher:"/servlet/XYZServlet"如果你必须调用一个从ServletContext的getRequestDispatcher得到的RequestDispatcher对象的 forward方法,你需要将“/VirtualDir/servlet/XYZServlet”作为路径参数来传递,如下:RequestDispatcher rd =getServletContext().getRequestDispatcher("/servlet/XYZServlet");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -