0
点赞
收藏
分享

微信扫一扫

Servlet学习(5)—— HttpServletResponse类

菜菜捞捞 2022-03-13 阅读 85
java

HTTPServletResponse类和HTTPServletRequest类一样,每次有请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HTTPServletRequest表示请求的信息,HTTPServletResponse表示响应的信息。我们可以通过HTTPServletResponse对象来设置返回给客户端的信息。

HTTPServletResponse通过字节流或者字符流的方式进行响应,字节流(getOutputStream())常用于下载,字符流(getWriter())常用于回传字符串,两个流只能使用一个。

一. 往客户端回传字符串数据

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        PrintWriter writer = resp.getWriter();
        writer.write("response");
        writer.write("张三");        //会有中文乱码问题

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>ResponseServlet</servlet-name>
        <servlet-class>TestServlet.ResponseServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ResponseServlet</servlet-name>
        <url-pattern>/responseServlet</url-pattern>
    </servlet-mapping>

</web-app>

解决响应的中文乱码问题:

方式1:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置服务器字符集为UTF-8
        resp.setCharacterEncoding("UTF-8");
        //通过响应头,设置浏览器也是用UTF-8字符集
        resp.setHeader("Content-Type", "text/html; charset=UTF-8");

        PrintWriter writer = resp.getWriter();
        writer.write("response");
        writer.write("张三");
    }
}

方式二(推荐):

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
        resp.setContentType("text/html; charset=UTF-8");

        PrintWriter writer = resp.getWriter();
        writer.write("response");
        writer.write("张三");
    }
}

二. 请求重定向

当客户端发起请求(http://ip:port/工程路径/response1)时,Response1程序可能由于某些原因已经废弃,由新的接口Response2代替,他需要告诉客户端他已经不存在(响应码302)且返回新的地址(Location响应头:http://ip:port/工程路径/response2),然后客户端会自动重新发起新的请求(http://ip:port/工程路径/response2),由Response2程序执行响应。

浏览器的地址栏会发生变化,由http://ip:port/工程路径/response1变为http://ip:port/工程路径/response2;发生了两次请求;不共享Response域数据。

方式一:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应状态码302,表示重定向
        resp.setStatus(302);

        //设置响应头,告诉客户端新的地址
        resp.setHeader("Location","http://localhost:8080/WebProject_war_exploded/response2");
    }
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("response2");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>Response1</servlet-name>
        <servlet-class>TestServlet.Response1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Response1</servlet-name>
        <url-pattern>/response1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Response2</servlet-name>
        <servlet-class>TestServlet.Response2</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Response2</servlet-name>
        <url-pattern>/response2</url-pattern>
    </servlet-mapping>
</web-app>

方式二(推荐):

在Response1里直接使用resp.sendRedirect即可

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("http://localhost:8080/WebProject_war_exploded/response2");
    }
}
举报

相关推荐

0 条评论