Java Web -- Servlet(11) HttpServletResponse详解(重定向)

当Web服务器收到客户端的http请求,(在程序继承HttpServlet的前提下)容器在调用Servlet的doGet()或doPost()方法时,会针对每一次请求创建一个HttpServletRequest接口的实例和一个HttpServletResponse接口的实例,封装成参数传给doGet()或doPost()方法。

request和response分别代表客户端对Web服务器的请求 和 服务器对客户端的响应。

HttpServlet的继承结构如下:

ServletResponse的常用方法:

getOutputStream():返回一个ServletOutputStream对象,它被用于发送对客户端的响应(二进制的形式)

//回送字符数据的方法

//ServletOutputStream sos = response.getOutputStream();

//sos.write(“hello,focus”.getBytes());

public ServletOutputStream getOutputStream()

throws java.io.IOException

//getWriter():返回将字符文本发送到客户端的PrintWriter对象,

public java.io.PrintWriter getWriter()

throws java.io.IOException

//设置响应到客户端的编码方式

//如:response.setCharacterEncoding(“utf-8”);

public void setCharacterEncoding(java.lang.String charset)

//设置响应到客户端时的类型

//如:response.setContentType(“text/html”);

public void setContentType(java.lang.String type)

HttpServletResponse的方法:

(1)模拟使用getOutputStream和getWriter两个方法输出字符到浏览器。

创建一个Servlet(demo3.java)

代码如下:

import java.io.FileInputStream;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo3 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType(“text/html;charset=utf-8”);

PrintWriter out = response.getWriter();

out.println(“hello focus”);

//当执行到sos.write(“hello focus”) 时,把hello focus字符封装后返回给web服务器

//把response的内容进行拆解后返回给浏览器,

//查看该流的还有没有输出的内容,如果没有了,检测该流是否关闭,如果没有关闭,

则关闭该流。

ServletOutputStream sos = response.getOutputStream();

sos.write(“hello focus_18”.getBytes());

}

}

抛出异常:

java.lang.IllegalStateException: getWriter() has already been called for this response

这个response的getWriter()方法已经在访问。

总结:

1.getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream、Printwriter对象。

2.在同一个response对象中getOutputStream或getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一个方法。

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

4.Servlet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经使用过close()方法,如果没有,Servlet引擎将调用close()方法关闭该输出流对象。

(2)灵活使用 重定向

在Servlet类的请求处理方法中,可以获取客户端提交的参数数据,也可以编写逻辑代码对请求数据进行处理,最后进行对客户端进行响应。

有时该Servlet类处理不了你的请求或不能独立处理完毕这个请求,需要其他Servlet类进行辅助处理,这时就需要用到“重定向”或“请求分派”了。

重定向

HttpServletRequest接口提供的sendRedirect()方法用于生成302响应吗和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL,语法如下:

public void sendRedirect(java.lang.String location)

throws java.io.IOException

其中,Location参数指定了重定向的URL,它可以使用绝对URL和相对URL,Servlet容器会自动将相对URl转换成绝对URL后,在生成Location头字段。

sendRedirect()不仅可重定向到本地容器的资源,也可以重定向到网络站点。

例子:

demo3.java代码如下:

import java.io.FileInputStream;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo3 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.sendRedirect(“/demo/demo4”);//重定到指定的路劲的资源

}

}

demo4.java代码如下:

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo4 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    request.setCharacterEncoding("utf-8");
    out.println("用户名为:");
    out.println(request.getParameter("name"));
}

}

当在浏览中输入:

http://localhost:8080/demo/demo3?name=focus

显示效果如下:

服务器调用demo4实例的相应方法来处理demo3这个方法时,HttpServletRequest实例不会再包含第一次请求中的参数了,request和response都是全新的,所以参数name的值为null。

而通过下面的这种方式,就可获得name的值。

response.sendRedirect(“/demo/demo4?name=focus”);

当username是用户提交过来的值,即可这样设置

String username = request.getParameter(“username”);

response.sendRedirect(“/demo/demo4?name=”+username);

总结:

sendRedirect(“URL?username=focus”);

优点:传送信息的速度比较快

缺点:它只能传送字符串,而不能传送一个对象

注意:

(1)Servlet的url名和变量之间有?号

(2)如果传递两个以上的值,它们间要用&号分开:

如:sendRedirect(“Servlet地址?参数名=参数值&参数名=参数值…”);

总结:

1.通过HttpServletResponse可回送最基本的字符,控制浏览器的显示。

2.通过HttpServletResponse回送的http头,可以控制浏览器的行为。

3.通过HttpServletResponse提供的函数,可以完成相应的功能(比如下载文件,生成随机验证码)

时间: 2024-10-12 22:41:50

Java Web -- Servlet(11) HttpServletResponse详解(重定向)的相关文章

Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(2)

                                    HttpServletRequest ---------------------------------------------------------------- (4)请求分派 Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器. 它有两个方法 forward(ServletRequest request,ServletResponse response) include(Serv

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前

Java web中WEB-INF目录详解

1.它是java的web应用的安全目录.所谓安全就是客户端无法访问,只有服务端可以访问的目录. 2.web.xml项目部署文件. 3.classes文件夹,用以防止*.class文件 4.lib文件夹,用于存放需要的jar包. WEB-INF中配置web.xml文件,添加<welcome-file-list> <welcome-file> 设定的首页文件名 <welcome-file> <welcome-fiel-list>

Servlet基础知识详解

Servlet基础知识详解 Servlet基础知识详解 Servlet程序执行全过程 Servlet映射路径 Servlet映射练习 Servlet生命周期 为什么要学习Servlet生命周期 Servlet重要的生命周期方法 模拟通过反射构造Servlet对象 Servlet单实例多线程 Servlet留给开发者的init方法 Servlet中核心对象学习 HttpServletRequest对象 HttpServletResponse对象 ServletConfig对象 ServletCon

Web容器中DefaultServlet详解

Web容器中DefaultServlet详解 https://blog.csdn.net/qq_30920821/article/details/78328608 Web容器中DefaultServlet详解一.什么是defaultServlet 我们以最熟悉的Tomcat服务器为例.我们都知道Jsp和servlet都需要web容器才能运行.但是实际上呢我们的web应用中可以没有任何servlet或者jsp(至少表面上是这样的)只需要一个web.xml,设置在servlet 3.0中,这个也可以

开启 J2EE(六)— Servlet之Filter详解及乱码处理实例

定义和功能 Filter:过滤器,它能够在request到达Servlet之前预处理request,也可以在离开Servlet时处理response,通过对request或response的处理已达到过滤功能.但是Filter只是对request和response请求进行了拦截处理,通常不产生请求或者响应. 实现的接口 我们写Servlet需要继承一个类,Filter也一样,要实现一个接口(扩展性的体现啊):javax.servlet.Filter,并实现该接口的三个方法: <span styl

Java网络编程和NIO详解开篇:Java网络编程基础

Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introduction/ netty是基于NIO实现的异步事件驱动的网络编程框架,学完NIO以后,应该看看netty的实现,netty框架涉及的内容特别多,这里只介绍netty的基本使用和实现原理,更多扩展的内容将在以后推出. 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法