心得8--重定向详解、控制浏览器定时刷新网页详解及response细节

61 篇文章 63 订阅
19 篇文章 0 订阅

1.   相对路径就是最前面没有反斜杠或是./的;绝对路径相反,绝对路径就是本地路径。Web应用中的html文件中写的绝对路径是相对于站点而言的,就是客户端浏览器,而并不是你当前的web应用。

大多数网站都不用servlet来直接向浏览器发显示效果。servlet注意是做服务的。浏览器直接读jsp的后html的

2. 转发和重定向的区别:

     打个比方,比如借钱;转发是你向我借钱,我没有,但我知道他有,我帮你向他借;重定向是我告你说他有,然后让你向他借。

1).向服务器发出两次请求,有2个response和request对象,发是发一次;2).重定向地址栏会发生变化,而转发不会。

3.  设置字符编码的时候,引号中间的值分割一定要是分号,不能错写成逗号,否则用浏览器测试的时候会出现提示:是否下载response.setContentType("text/html;charset=UTF-8");

4. response常见应用

l     通过response实现请求重定向。

•      请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。

l     应用场景:用户登陆、购物车(京东商城上的购物车就存在bug,也许是网站站长故意这么编码的,购物时放到购物车的商品这个过程本来应该用重定向的,他却用的转发,你刷新一次他就自动给你添加一件商品)。

l     实现方式

•      response.sendRedirect()

•      实现原理:

•      302状态码和location头即可实现重定向

例子:

package com.response;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

 * 重定向的特点

1.浏览器向服务器发2次请求,有2个response和request对象

2.地址栏会发生变化。

3.重定向的速度很快,达到瞬间刷到另一个页面

 * */

public class ResDemo5 extends HttpServlet {

   public voiddoGet(HttpServletRequest request, HttpServletResponse response)

        throwsServletException, IOException {

   /*第一种重定向的方法:设置状态吗和头实现,这是实现原理

      response.setStatus(302);

      Web应用中的html文件中写的绝对路径是相对于站点而言的

      response.setHeader("location","/WebDemo/index.jsp");

      */

      //第二种重定向的方法:直接调用方法sendRedirect(),该方法中封装了第一种方法的过程

      response.sendRedirect("/WebDemo/index.jsp");

   }

   public voiddoPost(HttpServletRequest request, HttpServletResponse response)

        throwsServletException, IOException {

      doGet(request,response);

   }

}

5.response细节

l     getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。但是前者兼容后者,因为后者输出的东西前者都可以输出。

l     getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。如果两种方法同时调用会出现错误:java.lang.IllegalStateException: getOutputStream() has already beencalled for this response就是说这个servlet类已经发送过响应了)

l     Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

l     Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。 也就是说会自动关闭上面说的流

6.发送http头,控制浏览器定时刷新网页(REFRESH);一个例子详细解说

package com.response;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ResDemo4 extends HttpServlet {

   public voiddoGet(HttpServletRequest request, HttpServletResponse response)

        throwsServletException, IOException {

      //test3(response);

        //一般编程都用这种方法设置登录界面的刷新,需要两个jsp界面,由于String类型的message是作为参数传给jsp页面的,所以在这个servlet类中就不用设置编码,只保证jsp跟浏览器编码一直就ok

      Stringmessage = "<meta http-equiv='refresh'content='3;url=/WebDemo/index.jsp'>登陆成功,3秒后自动跳转到首页,如果没有跳到请点击<a href='/WebDemo/index.jsp'>首页</a>";

   this.getServletContext().setAttribute("message",message);

   this.getServletContext().getRequestDispatcher("/message.jsp").forward(request,response);     

   }

   //3秒后自动跳转到新浪首页

   public voidtest2(HttpServletResponse response) {

   response.setHeader("refresh","3;url=http://www.sina.com");

   }

    //编写一个显示本地时间,并随时更新的时间程序

   public voidtest1(HttpServletResponse response) throws IOException {

      response.setHeader("refresh","1");

      response.getWriter().write(newjava.util.Date().toLocaleString());

   }

   //假设这是一个处理登陆的servlet,登陆成功后自动跳转到一个首页

   public voidtest3(HttpServletResponse response){

   response.setHeader("refresh","3;url=/WebDemo/index.jsp");

      response.setContentType("text/html;charset=UTF-8");

      try {

        response.getWriter().write("登陆成功,3秒后自动跳转到首页,如果没有跳到请点击<a href='/WebDemo/index.jsp'>首页</a>");

      } catch(IOException e) {

        e.printStackTrace();

      }

   }

   public voiddoPost(HttpServletRequest request, HttpServletResponse response)

        throwsServletException, IOException {

      doGet(request,response);

   }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值