发表于: 2017-10-10 21:34:40

1 676


一、今日完成

1.今天主讲小课堂:JSP有几个内置对象,总结和整理JSP页面跳转方式以及session相关知识;


2.重定向与转发

(1)转发:一个web组件(jsp/servlet)将未完成的处理转交给另一个web组件继续处理,转发的各个组件会共享request和response对象。

特点:a.转发的目的地只能是一个应用内部的某个组件;

           b.转发之后,浏览器的地址栏的地址没有改变;

           c.转发所涉及的各个组件可以共享同一个request,response对象。

(2)重定向:服务器向浏览器发送一个状态码302及一个消息头location,浏览器收到后,会立即向location所指向的地址发送请求。

特点:a.重定向的地址是任意的;

           b.重定向之后,浏览器的地址栏的地址变成了location所指定的地址。

(3)二者区别:a.转发是在服务器端,重定向是在用户的浏览器端工作;

                            b.转发只能访问本地地址,重定向可以是任意的地址;

                            c.转发之后浏览器地址没有变化,而重定向的地址变成当前指定的地址;

                            d.转发的效率比重定向的效率高,因为重定向请求两次服务器,转发则是用户请求一次可能经过N个jsp页面返回给用户。


3.JSP页面跳转的实现

(1)RequestDispatcher.forward()

  在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet或者是JSP到另外的一个Servlet、JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递. 但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面。重定向后浏览器地址栏URL不变。

在Servlet中进行重定向:

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException,IOException{

  response.setContentType("text/html; charset=utf-8");
  ServletContext sc = getServletContext();
  RequestDispatcher rd = null;
  rd = sc.getRequestDispatcher("/index.jsp"); //定向的目标页面
  rd.forward(request, response);
  }

通常在servlet中使用,不在jsp中使用。

(2)response.sendRedirect()

  在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.

  重定向后在浏览器地址栏上会出现重定向页面的URL。

在servlet中重定向:

public void doPost(HttpServletRequest request,HttpServletResponse response)
   throws ServletException,IOException{
  response.setContentType("text/html; charset=utf-8");
  response.sendRedirect("/index.jsp");
  }

需要注意:

1) 使用response.sendRedirect时,前面不能有HTML输出;但是关闭了cache,或者使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。

2) response.sendRedirect之后,应该紧跟一句return。

3)response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。


二者区别:a. Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;

  b. response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

  c.前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使HttpServletResponse.sendRequest()方法。


(3) <jsp:forward page="" />

  它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。

  如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用。另外,它不能改变浏览器地址,刷新的话会导致重复提交。


(4) 修改HTTP header的Location属性来重定向

  通过设置直接修改地址栏来实现页面的重定向。

  jsp代码如下:

  <%

  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

  String newLocn = "/newpath/jsa.jsp";

  response.setHeader("Location",newLocn);

  %>

(5)JSP中实现在某页面停留若干秒后,自动重定向到另一页面

  在html文件中,添加下面的代码:

  <meta http-equiv="refresh" content="300; url=target.jsp">

  含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为转向的目标页面,若为本页则为自动刷新本页。

  可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。

  String content=stayTime+";URL="+URL;

  response.setHeader("REFRESH",content);


5.session

在小课堂讨论中,有师兄提出关于session有效期和创建与销毁问题,如下是总结的session机制介绍:

(1)当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 

(2)大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。 

       恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。 

二、明日计划

为了准备小课堂相关知识点,花费了较长时间导致过去两天里任务进度被耽搁,今天开始处理任务5扫尾工作,完成呢个并提交它。


三、遇到问题

以上。


四、收获

以上。



返回列表 返回列表
评论

    分享到