博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java】servlet之response
阅读量:2240 次
发布时间:2019-05-09

本文共 11142 字,大约阅读时间需要 37 分钟。

文章目录

在我们真正开发的时候我们并不是直接使用servlet,而是使用httpservlet。

一、创建过程:

1、使用eclipse创建一个Dynamic web project。

在这里插入图片描述

在这里插入图片描述
dynamic web module version 需要选择2.5,否则没有web.xml 文件。

2、创建好项目后,在src路径下面创建包:httpservletResponseServlet

在这里插入图片描述

3、创建封装好的servlet。

右击包——new——servlet。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建好的servlet中的代码:

package httpservletResponseServlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class DemoServlet */public class DemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @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); }}

web.xml 文件中的内容也自动创建好了:

httpservlet_response
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
//以下servlet配置文件为自动创建。
DemoServlet
DemoServlet
httpservletResponseServlet.DemoServlet
DemoServlet
/demoservlet

二、http协议:

创建好一个demo后,我们来开始讲讲仅仅的主题response。

在中我们说过,访问servlet时 ,会自动创建response和request两个对象。现在我们使用httpservlet时,同样也会创建这两个对象,只不过他叫做HttpServletRequest 和HttpServletResponse。如下图:
在这里插入图片描述
今天我们要讲的的就是这个HttpServletResponse。
在之前,我们还需要连接http协议:

1.什么是Http协议

HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的 一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为 了提供一种发布和接收HTML页面的方法

2.Http协议的组成

Http协议由Http请求和Http响应组成,当在浏览器中输入网址访问某个网站时, 你的浏览器会将你的请求封装成一个Http请求发送给服务器站点,服务器接收到请 求后会组织响应数据封装成一个Http响应返回给浏览器。即没有请求就没有响应。

3、举例说明http请求:

编辑一个form.html的表单页面,如下:

在这里插入图片描述
当点击提交按钮的时候,可以抓包:
在这里插入图片描述

1)请求行

请求方式:POST、GET
请求的资源:/DemoEE/form.html
协议版本:HTTP/1.1
HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
HTTP/1.1,发送请求,创建一次连接,获得多个web资源,保持连接。
2)请求头
请求头是客户端发送给服务器端的一些信息,使用键值对表示key:value
在这里插入图片描述
3)请求体
当请求方式是post的时,请求体会有请求的参数,格式如下:
username=zhangsan&password=123
如果请求方式为get,那么请求参数不会出现在请求体中,会拼接在url地址后面

4、http响应:

此时我们抓包可以得到http响应:

在这里插入图片描述

1)响应行

Http协议
状态码:
常用的状态码如下:
200 :请求成功。
302 :请求重定向。
304 :请求资源没有改变,访问本地缓存。
404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
500 :服务器内部错误。通常程序抛异常。
状态信息:状态信息是根据状态码变化而变化的
2)响应头
响应也都是键值对形式,服务器端将信息以键值对的形式返回给客户端
在这里插入图片描述
3)响应体
响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染 显示页面内容

三、response

了解完http协议后,我们正式进入正题:(对不起,写了五千字才可是进入正题)先来看一个response运行图:

1.response的运行流程

在这里插入图片描述

接下来我们就来看看如何在servlet中设置response中的各个属性:

2、通过response设置——响应行

1)设置响应行的状态码 setStatus(int sc)

在响应行中,都是通过设置状态码来自动显示对象的状态信息的。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 手动设置http响应行中的状态码: response.setStatus(302); }

我们用postman捕捉到:

在这里插入图片描述

如果我们换成404:

在这里插入图片描述

3、通过response设置——响应头

addHeader(String name, String value) addIntHeader(String name, int value) addDateHeader(String name, long date) setHeader(String name, String value) setDateHeader(String name, long date) setIntHeader(String name, int value)//其中,add表示添加,而set表示设置

实例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 手动设置http响应行中的状态码: //response.setStatus(404); // 设置响应头: response.addHeader("myname", "cheng"); response.addIntHeader("myage", 22); Date date=new Date(0); response.addDateHeader("mybirthday", date.getTime()); }

在这里插入图片描述

(1)实现重定向:

我们都知道,通过设置响应行,我们可以将状态码改成302(重定向),那我们应该如何设置重定向呢。大概流程如下图:

在这里插入图片描述
特定:访问服务器两次。地址栏中的地址发生了变化。
为此,我们需要重定向是,我们就需要修改response中的两个东西。
1)状态码:302
2)响应头:location ——代表重定向的地址。

a)实例:我们使用servlet1 重定向到servlet2

servlet1代码:

package httpservletResponseServlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet1 用于重定向,将路径指向servlet2 */public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//没有响应,并告知客户端从定向到servlet2 //1、设置状态码302 response.setStatus(302); // 设置响应头中的location response.setHeader("Location", "/httpservlet_response/servlet2"); } /** * @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); }}

servlet2代码:

package httpservletResponseServlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Servlet2 */public class Servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello the world!!"); } /** * @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); }}

访问结果如下:

在这里插入图片描述
回车:
在这里插入图片描述

封装方法:

//没有响应,并告知客户端从定向到servlet2
//1、设置状态码302
response.setStatus(302);
// 设置响应头中的location
response.setHeader(“Location”, “/httpservlet_response/servlet2”);
---------------------------------
替换为:
//封装一个重定向的方法sendredirect(url)
response.sendRedirect("/httpservlet_response/servlet2");

b) 延时刷新并重定向:

package httpservletResponseServlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class refresh */public class refresh extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//5秒后,跳转到百度页面。 response.setHeader("refresh", "5;url=http://www.baidu.com"); } /** * @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); }}

注意:如果要实现页面的定时刷新,需要使用js,略。

4、通过response设置——响应体

(1)响应体设置文本——PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

package httpservletResponseServlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class content_txt */public class content_txt extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer=response.getWriter(); writer.write("hello the world!!"); } /** * @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); }}

发布结果:

在这里插入图片描述
我们现在改成汉字:

package httpservletResponseServlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class content_txt */public class content_txt extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer=response.getWriter(); //writer.write("hello the world!!"); writer.write("您好!!"); } /** * @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); }}

在这里插入图片描述

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(String charset) 设置response的编码。
我们先来看一个流程:
在这里插入图片描述
修改代码:

我们需要将字符串写入response缓存之前就设置好编码格式

 

在这里插入图片描述

(2)响应体设置字节——ServletOutputStream getOutputStream()

获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。这个一般在获取文件的时候使用。

我们通过一个照片下载说说:
1)在webcontent目录下放一个照片:a.jpg
2)代码:

package httpservletResponseServlet;import java.io.FileInputStream;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class imageservlet */public class imageservlet extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用response获取字节输出流 ServletOutputStream out=response.getOutputStream(); //获取服务器上照片 String Path=this.getServletContext().getRealPath("a.jpg");//这是相对路径,都是要获取webcontent目录下的文件。 FileInputStream in=new FileInputStream(Path); int len=0; byte[] buffer=new byte[1024];//以1024个字节为一组 while((len=in.read(buffer))>0) {
out.write(buffer,0,len); } in.close(); out.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); }}

在这里插入图片描述

四、源码下载:

备注:Tomcat:8.5

jdk:1.8

转载地址:http://sxhbb.baihongyu.com/

你可能感兴趣的文章
69道Spring面试题和答案
查看>>
40个Java多线程问题总结
查看>>
Oracle数据库面试题
查看>>
java面试中的智力题
查看>>
本地如何连接hbase数据库
查看>>
Maven出错-Missing artifact org.apache.openejb:openejb-core:jar:4.1.0-SNAPSHOT:test
查看>>
dubbo配置文件xml校验报错
查看>>
eclipse生成export生成jar详解
查看>>
oracle 模糊查询忽略大小写
查看>>
Java项目导出可运行的jar文件
查看>>
Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析),兼容Windows和Linux
查看>>
JAVA读取PROPERTIES配置文件
查看>>
Linux中执行shell脚本的4种方法总结
查看>>
BufferedInputStream(缓冲输入流)详解
查看>>
修改linux文件权限命令:chmod
查看>>
Linux vi/vim编辑器常用命令与用法总结
查看>>
如何使用Git Bash Here,将本地项目传到github上
查看>>
eclipse git控件操作 回退到历史提交 重置 删除(撤销)历史的某次提交
查看>>
Oracle | 给表和字段添加注释
查看>>
java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】
查看>>