Javaweb Servlet核心接口学习记录(4)—HttpServletResponse接口

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
运行

在这里插入图片描述

3.HTTP协议

客户端浏览器和服务器端Servlet通过HTTP协议进行通信,HTTP 协议采用请求/响应模型,协议的请求报文由请求行、请求头和可选的请求正文组成。

Http请求报文结构

在这里插入图片描述

4.构建响应消息头

响应头有两类设置方法,一类是addXxx()方法,另一类是setXxx()方法,addXxx()方法会添加属性,不会覆盖原来的属性。setXxx()会覆盖掉原来的属性

1.addXxx()

addHeader(String name;String value);

addIntHeader(String name;int value);

addDateHeader(String name;long date);

2.setXxx()

setHeader(String name;String value);

setIntHeader(String name;int value);

setDateHeader(String name;long date);

| 响应方法 | 说明 |

| — | — |

| setContentType(String mime) | 设定Content-Type消息头 |

| setContentLength(int length) | 设定Content-Length消息头 |

| addHeader(String name,String value) | 新增String类型的值到名为name的http头部 |

| addIntHeader(String name,int value) | 新增int类型的值到名为name的http头部 |

| addDateHeader(String name,long date) | 新增long类型的值到名为name的http头部 |

| addCookie(Cookie c) | 为Set-Cookie消息头增加一个值 |

示例:使用setHeader()方法设置消息头"Refresh"实现一个页面动态时钟效果

创建ResponseRefreshHeadServlet

package com;

import java.io.IOException;

import java.io.PrintWriter;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

  • Servlet implementation class ResponseRefreshHeadServlet

*/

@WebServlet(“/ResponseRefreshHeadServlet”)

public class ResponseRefreshHeadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

  • @see HttpServlet#HttpServlet()

*/

public ResponseRefreshHeadServlet() {

super();

// TODO Auto-generated constructor stub

}

/**

  • @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

  •  response)
    

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

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

response.setHeader(“refresh”, “1”);

PrintWriter out = response.getWriter();

out.print(“现在时间是:”);

Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);

out.print(sdf.format(date));

}

/**

  • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

  •  response)
    

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}

}

运行

在这里插入图片描述

5.创建响应正文

在 Servlet 中,向客户端输出的响应数据是通过输出流对象来完成的,HttpServletResponse 接口提供了两个获取不同类型输出流对象的方法:

| 方法 | 方法描述 |

| — | — |

| getOutputStream() | 返回字节输出流对象ServletOutputStream |

| getWriter() | 返回字符输出流对象PrintWriter |

  • ServletOutputStream 对象主要用于输出二进制字节数据 ,如配合setContentType() 方法响应输出一个图像、视频等。

  • PrintWriter 对象主要用于输出字符文本内容,但其内部实现仍是将字符串转换成某种字符集编码的字节数组后再进行输出 。

  • 当向ServletOutputStream或PrintWriter对象中写入数据后,Servlet容器会将这些数据作为响应消息的正文,然后再与响应状态行和各响应头组合成完整的响应报文输出到客户端。同时,在Serlvet的service()方法结束后,容器还将检查getWriter()或getOutputStream(方法返回的输出流对象是否已经调用过close()方法,如果没有,容器将调用close()方法关闭该输出流对象.

示例:使用ServletOutputStream对象响应输出一个服务器端的图案

创建OutputStreamServlet

package com;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.ServletContext;

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;

/**

  • Servlet implementation class OutputStreamServlet

*/

@WebServlet(“/OutputStreamServlet”)

public class OutputStreamServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

  • @see HttpServlet#HttpServlet()

*/

public OutputStreamServlet() {

super();

// TODO Auto-generated constructor stub

}

/**

  • @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

  •  response)
    

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType(“image/jpeg”);

ServletContext context = getServletContext();

InputStream is = context.getResourceAsStream(“/images/tupian.jpg”);

ServletOutputStream os = response.getOutputStream();

int i = 0;

while ((i = is.read()) != -1) {

os.write(i);

}

is.close();

os.close();

}

/**

  • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

  •  response)
    

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}

}

运行

在这里插入图片描述

6.响应输出中文问题

ServletResponse 接口中定义 了 setCharacterEncoding() 、setContentType()和 setLocale() 等方法 来指定 ServletResponse.getWriter() 方法 返回的PrintWriter 对象所使用的字符集编码。

示例:指定字符集编码

response.setCharacterEncoding (“UTF-8”);

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

response.setLocale (new java.util.Locale (" zh","CN "));// 简体中文

setCharacterEncoding () 、setContentType() 和 setLocale () 三种方法之间的差异分析:

  • setCharacterEncoding() 方法只能用来设置 PrintWriter 输出流中字符的编码方式,它的优先权最高,可以覆盖后面两种方法中的设置;

  • setContentType() 方法既可以设置 PrintWriter 输出流中字符的编码方式,也可以设置浏览器接收到这些字符后以什么编码方式来解码,它的优先权低于第一种方法,但高于第三种方法;

  • setLocale() 方法只能用来设置 PrintWriter 输出流中字符的编码方式,它的优先权最低,在已经使用前两种方法中的一个设置了编码方式以后,它将被覆盖而不再起作用。

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

[外链图片转存中…(img-82ih6Fm2-1714674252331)]

[外链图片转存中…(img-z2LGV1j8-1714674252332)]

[外链图片转存中…(img-JTcKejGH-1714674252332)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值