JAVAWEB——Response,response重定向问题。中文乱码解决问题,设置响应字节(在服务器上上传一张照片)

一、 HttpServletResponse概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

二、 通过抓包工具抓取Http响应

在这里插入图片描述因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行响应头响应体

三、 通过response设置响应行

设置响应行的状态码

  • setStatus(int sc)
response.setStatus(329);

开发中用的不多,一般Tomcat会自动设置状态码。我们可以百度状态码,最常见的状态码

在这里插入图片描述

四、 通过response设置响应头

列出了常用设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供其中,

  • addHeader(String name, String value) ——添加指定名称的响应头和string值
  • addIntHeader(String name, int value) ——添加指定名称的响应头和int值
  • addDateHeader(String name, long date) ——添加指定名称的响应头和日期值
  • setHeader(String name, String value) (重点)——使用指定名称和值设置响应头的名称和内容
  • setDateHeader(String name, long date) ——使用指定名称和值设置响应头的名称和内容
  • setIntHeader(String name, int value)——指定 int 类型的值到 name 标头

add以及set方法解析:

add表示添加,而set表示设置

案例一:

//设置响应头
Date date = new Date();
response.addHeader("name","张三");
//response.addIntHeader("age",28);
//response.addDateHeader("birthday",date.getTime());
response.setHeader("age","50");

重定向问题:设置状态码 设置响应头

步骤:

  • 设置状态码302
  • 设置响应头Location

理解:

  • 302 表示临时性重定向。访问一个url时,被重定向到另一个url上。
    常用于页面跳转。

  • 在响应头中加入Location参数。浏览器接受到带有location头的响应时,就会跳转到相应的地址。

案例二:

第一步:书写Servlet1

@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //没有响应 告知客户端去重定向到Servlet2
        //1.设置状态码302
        response.setStatus(302);
        //2.设置响应头Location
        response.setHeader("Location","/WEB14/Servlet2");
    }
}

第二步:书写重定向的Servlet2

@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().write("hhh");
    }
}

五、 通过response设置响应体

1.响应体设置文本

  • PrintWriter getWriter()
    获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
    最常见的写法就是
response.getWriter().write("我是response!!");

2.关于设置中文的乱码问题

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset)设置response的编码

但我们发现客户端还是不能正常显示文字

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,
通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8:
一般写成:

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

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写:response.setContentType("text/html;charset=UTF-8");
就可以解决页面输出中文乱码问题。

案例一:

public class TextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置response查询的码表
        response.setCharacterEncoding("UTF-8");
        //通过一个头Content-Type 告知客户端使用何种码表进行解码     
        response.setHeader("ContentType","text/html;charset=UTF-8");
		//该方法与上面方法等价,开发中常用
		response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer =  response.getWriter();
        writer.write("hello response!!");
        writer.write("中国");
    }

再次强调,开发中只要写response.setContentType("text/html;charset=UTF-8");即可解决乱码问题。如果不采用该方法,那么我们必须先设置response缓冲区以及设置浏览器的编码均为utf-8。

3.响应头设置字节

  • ServletOutputStream getOutputStream()
    获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

这样讲很空,还是做一个在服务器上上传一张照片的小demo来体会字节。

案例:

@WebServlet("/ByteServlet")
public class ByteServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用responce获得字节输出流
ServletOutputStream out=response.getOutputStream();
 //获得服务器上的图片
String RealPath = this.getServletContext().getRealPath("a.jpg");
InputStream in = new FileInputStream(RealPath);
        int len = 0;
        //字节数组,详细可以常看io流的内容
        byte [] buffer = new byte[1024];
        while ((len = in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }
}

六、 response细节点

  1. response获得的流不需要手动关闭,Tomcat容器会自动关闭
  2. getWriter()和getOutputStream不能同时调用
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb中,可以通过编写过滤器解决post请求方式中文问题。具体步骤如下: 1. 创建一个过滤器类,实现javax.servlet.Filter接口。 2. 在过滤器类中写doFilter方法。 3. 在doFilter方法中获取请求的编码方式,并将请求的数据按照该编码方式进行解码。 4. 在doFilter方法中修改请求的编码方式为UTF-8,并将修改后的请求递给下一个过滤器或Servlet进行处理。 具体代码如下: ```java import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @WebFilter(filterName = "EncodingFilter", urlPatterns = "/*") public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; // 获取请求的编码方式 String encoding = request.getCharacterEncoding(); if (encoding == null) { encoding = "UTF-8"; // 默认编码方式为UTF-8 } // 将请求的数据按照指定编码方式进行解码 servletRequest.setCharacterEncoding(encoding); // 修改请求的编码方式为UTF-8 servletResponse.setContentType("text/html;charset=UTF-8"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } } ``` 在上述代码中,我们使用@WebFilter注解来指定该类为过滤器,并且设置了过滤的urlPatterns为"/*",表示对所有请求进行过滤。 在doFilter方法中,我们首先获取请求的编码方式,并将请求的数据按照该编码方式进行解码。然后,我们将请求的编码方式修改为UTF-8,并将修改后的请求递给下一个过滤器或Servlet进行处理。 需要注意的是,如果你使用了Spring框架,则可以通过在配置文件中添加如下配置来解决中文问题: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在上述配置中,我们使用了Spring框架提供的CharacterEncodingFilter过滤器来解决中文问题。可以通过在配置文件中添加该过滤器来自动解决中文问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值