how2j.cn


工具版本兼容问题
response是HttpServletResponse的实例,用于提供给浏览器的响应信息


示例 1 : 设置响应内容   
示例 2 : 设置响应格式   
示例 3 : 设置响应编码   
示例 4 : 301或者302客户端跳转   
示例 5 : 设置不使用缓存   

示例 1 :

设置响应内容

edit
通过response设置响应已经用得比较多了,在前面的Servlet学习中都是用到
PrintWriter pw= response.getWriter();
通过response.getWriter(); 获取一个PrintWriter 对象
可以使用println(),append(),write(),format()等等方法设置返回给浏览器的html内容。
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response){ try { PrintWriter pw= response.getWriter(); pw.println("<h1>Hello Servlet</h1>"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
示例 2 :

设置响应格式

edit

response.setContentType("text/html");


"text/html" 是即格式 ,在request获取头信息 中对应的request.getHeader("accept").
"text/html" 是存在的,表示浏览器可以识别这种格式,如果换一个其他的格式, 比如 "text/lol" ,浏览器不能识别,那么打开此servlet就会弹出一个下载的对话框。

这样的手段也就常常用于实现下载功能
设置响应格式
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { try { PrintWriter pw = response.getWriter(); pw.println("<h1>Hello Servlet</h1>"); response.setContentType("text/lol"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
示例 3 :

设置响应编码

edit
设置响应编码有两种方式

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


这两种方式都需要在response.getWriter调用之前执行才能生效。

他们的区别在于

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

不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文

2. response.setCharacterEncoding("UTF-8");

仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动再进行一次设置。
设置响应编码
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { try { response.setContentType("text/html; charset=UTF-8"); // response.setCharacterEncoding("UTF-8"); PrintWriter pw = response.getWriter(); pw.println("<h1>第一次 使用 Servlet</h1>"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
示例 4 :

301或者302客户端跳转

edit
客户端有两种跳转
302 表示临时跳转
301 表示永久性跳转

302就是前面在客户端跳转章节用到过的

response.sendRedirect("fail.html");


301要使用另外的手段:

response.setStatus(301);
response.setHeader("Location", "fail.html");

用户感受不出这两种跳转的区别,但是可以借助火狐的调试工具看到响应的头信息是:
301 Moved Permanently。
301和302的区别主要在搜索引擎对页面排名的时候有影响,这是属于SEO范畴的概念,在此就不展开了。
301或者302客户端跳转
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 LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String password = request.getParameter("password"); if ("admin".equals(name) && "123".equals(password)) { request.getRequestDispatcher("success.html").forward(request, response); } else { response.setStatus(301); response.setHeader("Location", "fail.html"); } } }
示例 5 :

设置不使用缓存

edit
使用缓存可以加快页面的加载,降低服务端的负担。但是也可能看到过时的信息,可以通过如下手段通知浏览器不要使用缓存


response.setDateHeader("Expires",0 );
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");
import java.io.IOException; import java.util.Date; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { try { response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-cache"); response.setHeader("pragma", "no-cache"); response.getWriter().println("<h1>Hello Servlet!</h1>"); response.getWriter().println(new Date().toLocaleString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-07-18 状态码301和302区别
佛说

状态码301和302的区别 ①301表示请求url永久转移到新的url 302表示请求url临时转移到新的url ②301搜索引擎会索引新url和新url页面内容 302搜索引擎会索引旧url和新url页面内容 引用csdn博主https://blog.csdn.net/meism5/article/details/90414212?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase







回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-04-25 关于步骤2的下载,提醒一下
长叹

经测试,Chrome是不会弹出下载界面的,而edge和火狐则会弹出。请一些朋友们注意一下吧




5 个答案

胡乱起个名
答案时间:2024-03-26
111
Chrome 版本 99.0.****.**(正式版本)并不会弹出下载框!

yjxjn
答案时间:2020-03-25
其实是会的 但是需要在chrome的下载设置中勾选 "下载前询问" Chrome 80 路过,表示并不会。还是会把H1标签打印出来

tll
答案时间:2019-06-12
勾选了还是不打印,显示<h1>Hello Servlet!</h1>

leevanes
答案时间:2019-05-06
其实是会的 但是需要在chrome的下载设置中勾选  "下载前询问"

丽丽哒云儿
答案时间:2019-04-22
谢谢



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-07-29 我的tomcat显示的是上一节的内容
2017-07-13 大佬我没有出现下载,浏览器显示的是 <h1>Hello Servlet</h1>。
2017-05-14 关于客户端跳转


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 1 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-Servlet-response 用法 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图