要想实现题目叙述的功能,也能自己重写service方法,只需要在里面获取请求行的请求方式,是get还是post等共7种,根据不同的请求方式编写不同的处理代码。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("重写这里面的代码,仿照HttpServlet");
//如何调用?
//获取请求方式,根据不同的请求方式进行不同的业务处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1. 获取请求方式
String method = request.getMethod();
//2. 判断
if ("GET".equals(method)) {
// get方式的处理逻辑
} else if ("POST".equals(method)) {
// post方式的处理逻辑
}
}
javaee给我们提供好了做了上述事情的类,HttpServlet,从源码中可以看到他做的判断
使用HttpServlet,项目结构和代码如下==========================================
TestHttpServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* urlPattern: 一个Servlet可以配置多个访问路径
*/
@WebServlet(urlPatterns = {"/demo1", "/demo2"})
public class TestHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get....");
//写收到get请求要执行的代码
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post....");
//写收到post请求要执行的代码
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demoweb</artifactId>
<version>1.0-SNAPSHOT</version>
<name>demoweb</name>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.trytotry</groupId>
<artifactId>mybaits-generator-xplugin</artifactId>
<version>0.0.1</version>
</dependency>
<!-- //引入servlet使得通过tomcat可以访问到一段代码-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--
此处为什么需要添加该标签?
provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
-->
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port><!--访问端口号 -->
<!--项目访问路径
未配置访问路径: http://localhost:8080/demoweb/a.html
配置/后访问路径: http://localhost:80/a.html
如果配置成 /hello,访问路径会变成什么?
答案: http://localhost:80/hello/a.html
-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml
<?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">
</web-app>
打开浏览器访问路径http://localhost:80/demo1就会执行对应方法中的代码了,直接输这个路径默认是用get方法请求。
访问路径:协议+IP+端口号+配置的项目名称+HttpServlet子类中的路径
用postman发起get和post测试下:
也可以写个b.html页面来发起请求,启动tomcat后先访问到这个静态页面,再点击提交发起请求,值测了POST。这个页面能够发起请求的原理应该是浏览器能够解析html为DOM树,点击submit后浏览器会访问到form 便签中的action属性,浏览器会根据DOM树的内容,将BOM对象的location设置成想要去的URL。回顾下JavaScript的构成,三部分:ECMAscript,BOM , DOM,三者都有同一个根对象window,又各自有子对象。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demo1" method="post">
<input name="username"> <br>
<button type="submit">提交</button>
</form>
</body>
</html>
=========================================================================
路径配置我们使用的是@WebServlet标签中的urlPatterns参数数组的方式,使用urlPatterns共有5种配置方式,其他四种如下:
第四种最好不要使用,会覆盖掉tomcat默认的访问静态资源的初始路径。
另外servlet3.0之前不能使用注解配置,路径必须在web.xml中配置,
<?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>
<!-- servlet的名称,名字任意-->
<servlet-name>demo1</servlet-name>
<!--servlet的全类名-->
<servlet-class>TestHttpServlet.java</servlet-class>
</servlet>
<!--
Servlet 访问路径
-->
<servlet-mapping>
<!-- servlet的名称,要和上面的名称一致-->
<servlet-name>demo1</servlet-name>
<!-- servlet的访问路径-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
===两种配置方式都是tomcat利用反射来获取class对象,new对象,再invoke调用方法。用注解那种方法判断下isAnnotation("WebServlet")。
=========================================================================
========================================================================
上面我们已经在HttpServlet中收到了浏览器发过来的请求了,但并不完整,下面是详细叙述请求和响应的方法。
tomcat这个web服务器收到HTTP请求后,会识别请求行、请求头、请求体。javaee servlet提供了一个类HttpServletRequest让我们获取识别出的数据,并提供了一个类HttpServletResponse让我们将想返回的数据封装进去然后tomcat会自动转发给浏览器。可以看到这两个类的源码中提供了多种方法实现上述操作(注意他父类中的方法)。这两个类是作为被调用方法的参数,那应该是被tomcat new出来的?后期参照源码确定。
使用HttpServletRequest的方法取出请求数据:
使用HttpServletResponse的方法封装想返回的数据:
使用HttpServletResponse除了封装想返回的数据,还可以重定向,跳转到新的URL地址,即web服务器响应给浏览器一个新地址和状态码302,浏览器收到后看到302就会设置BOM中的location去那个新地址。HttpServlet用的方法是HttpServletResponse.sendRedirect("新地址")。如HttpServletResponse.sendRedirect("http://www.baidu.com")。
还可以使用RequestDispatcher.forward ()实现转发,转发就是在同一个站点内跳转,可以通过设置域对象进行数据共享,是web服务器自己内部的行为,不能从新浪跳到百度,浏览器中的地址栏不会发生变化。。。
重定向和转发,一定要注意路径!如果是服务器内部使用这个路径,就不用加tomcat里设置那个初始地址。如果是返回给浏览器使用,就要加上tomcat里设置那个初始地址。
html中form标签里的action就要加上,因为我们这是在同一个tomcat项目内,所以不用加协议IP和端口,如果是其他网站的就需要加上。
==========================================================
小功能:IDEA快速创建SERVLET配置
=========================================================================
======================================================================
以下为httpservlet使用示例===================================================
先设计一个HTTP 请求的接口为如下
http://localhost:8080/demoHttpServlet/login?username=root&psw=123&hobby=2
项目结构
新建maven web项目,建立前端页面a.html用于发起请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demoHttpServlet/login" method="get">
用户名:<input type="text" name="username"> <br>
密码:<input type="text" name="psw"><br>
爱好:<input type="checkbox" name="hobby" value="1">游泳
<input type="checkbox" name="hobby" value="2">跑步
<input type="submit">GET方式
</form>
<form action="/demoHttpServlet/login" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="psw"><br>
爱好:<input type="checkbox" name="hobby" value="1">游泳
<input type="checkbox" name="hobby" value="2">跑步
<input type="submit">POST方式
</form>
</body>
</html>
然后修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>httpServletDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>httpServletDemo</name>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port><!--访问端口号 -->
<path>/demoHttpServlet</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后编写后端处理代码DemoHttpServlet
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet("/login")
public class DemoHttpServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("收到了GET请求");
//===================================================
//从请求中获取参数的特有方法。===============================
//获取请求方式GET/POST
String method = request.getMethod();
System.out.println(method);
//获取虚拟目录项目访问路径!!!
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取URL
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//获取URI
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//获取请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//==================================================
//获取请求头参数======================================
String header = request.getHeader("user-agent");
System.out.println(header);
//从请求中获取参数的通用方法
System.out.println("从请求中获取参数的通用方法一====");
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("从请求中获取参数的通用方法二====");
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("从请求中获取参数的通用方法三====");
String username = request.getParameter("username");
String password = request.getParameter("psw");
System.out.println(username);
System.out.println(password);
//GET请求解决乱码:先转回字节,再将字节转UTF-8
//原因:浏览器进行URL编码用的UTF-8,tomcat8之前进行URL解码底层用的是ISO_8859_1
//而我这用的是TOMCAT7插件启动
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
String s = new String(bytes, StandardCharsets.UTF_8);
System.out.println("解决中文乱码后" + s);
//往前端响应数据
//请求转发到另一个servlet
request.setAttribute("test", "这是一条转发的信息");
try {
request.getRequestDispatcher("/testDispatcher").forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
}
System.out.println("请求转发结束");
// //请求转发到一个页面
// try {
// request.getRequestDispatcher("/b.html").forward(request, response);
// } catch (ServletException e) {
// e.printStackTrace();
// }
// //重定向
// response.sendRedirect("https://www.baidu.com");
// //response.sendRedirect("/demoHttpServlet/testDispatcher");
// System.out.println("重定向结束");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("收到了POST请求");
//===================================================
//从请求中获取参数的特有方法。获取请求体参数
// BufferedReader br = req.getReader();
// String line = br.readLine();
// System.out.println(line);
//POST中使用通用方法之前要把特有方法getReader注释掉,因为他会自动把流关掉。反之通用方法在POST也会自动关流。
//POST请求解决乱码:浏览器将请求体用输出流的方式传到web服务器tomcat,编码是按照html页面指定的UTF-8,而tomcat8之前默认的解码方式是ISO_8859_1
//所以我们需要更改请求体的读取流的解码方式为UTF-8
req.setCharacterEncoding("UTF-8");
//从请求中获取参数的通用方法
System.out.println("从请求中获取参数的通用方法一====");
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("从请求中获取参数的通用方法二====");
String[] hobbies = req.getParameterValues("hobby");
if (hobbies != null) {
for (String hobby : hobbies) {
System.out.println(hobby);
}
}
System.out.println("从请求中获取参数的通用方法三====");
String username = req.getParameter("username");
String password = req.getParameter("psw");
System.out.println(username);
System.out.println(password);
//请求转发
req.setAttribute("test", "这是一条转发的信息");
try {
req.getRequestDispatcher("/testDispatcher").forward(req, resp);
} catch (ServletException e) {
e.printStackTrace();
}
System.out.println("请求转发结束");
// //重定向
// resp.sendRedirect("https://www.baidu.com");
// //response.sendRedirect("/demoHttpServlet/testDispatcher");
// System.out.println("重定向结束");
}
}
接收转发请求的TestDispatcher.java
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Map;
@WebServlet("/testDispatcher")
public class TestDispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我从其他地方收到了一个转发");
Object test = request.getAttribute("test");
System.out.println(test);
//从请求中获取参数的通用方法
System.out.println("从请求中获取参数的通用方法一====");
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("从请求中获取参数的通用方法二====");
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("从请求中获取参数的通用方法三====");
String username = request.getParameter("username");
String password = request.getParameter("psw");
System.out.println(username);
System.out.println(password);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
接收转发请求的b.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>我是转发到的页面b.html</p>
</body>
</html>
通过源码可以看出,三个通用方法就是去判断了一下请求method是啥,在分别去请求行或者请求 体中取数据。
启动服务访问http://localhost:8080/demoHttpServlet/a.html
然后填写表单提交后在后台可以看到读取出来的请求行、头、体。
HttpServlet中文乱码的问题也有响应的解决方法,get和post因为中文内容所在的位置不一样,有不一样的解决方法。
get将参数放在请求行中,浏览器往服务器传会按照HTML指定的UTF-8进行URL编码,服务器tomcat接收到后会进行URL解码,我们用的是TOMCAT7插件,TOMCAT8之前都是默认使用IOS8859解码,而且这个解码方式我们是不能更改的,那就只能将收到的转成二进制,再转成UTF-8,GET请求乱码的这个问题tomcat8已经解决了。
POST将参数放在请求体中,然后以流的方式传输到服务器,默认流的编码解码是IOS8859,所以我们直接指定流的编解码方式为UTF-8就行了,这个问题TOMCAT并没有解决。所以最好的方法就是换高级的tomcat,再写一句
req.setCharacterEncoding("UTF-8");
读取前端数据完成,下一步完善DemoHttpServlet.java给前端返回数据
=========================================================================
用来装返回数据的HttpServletResponse对象,tomcat之前已经根据HTTP协议给我们创建了,我们只需要往里面填行头体的值就是了。
那我们想给浏览器返回什么数据呢?在tomcat的web.xml中规定了能返回的数据类型,我们填写行头体的时候也需要在content-type中写明。叫做MIME类型。MIME类型_小影-CSDN博客_mime类型
比如我们想返回一句话:那就需要更改DemoHttpServlet.java为
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet("/login")
public class DemoHttpServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("收到了GET请求");
//===================================================
//从请求中获取参数的特有方法。===============================
//获取请求方式GET/POST
String method = request.getMethod();
System.out.println(method);
//获取虚拟目录项目访问路径!!!
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取URL
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//获取URI
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//获取请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//==================================================
//获取请求头参数======================================
String header = request.getHeader("user-agent");
System.out.println(header);
//从请求中获取参数的通用方法
System.out.println("从请求中获取参数的通用方法一====");
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("从请求中获取参数的通用方法二====");
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("从请求中获取参数的通用方法三====");
String username = request.getParameter("username");
String password = request.getParameter("psw");
System.out.println(username);
System.out.println(password);
//GET请求解决乱码:先转回字节,再将字节转UTF-8
//原因:浏览器进行URL编码用的UTF-8,tomcat8之前进行URL解码底层用的是ISO_8859_1
//而我这用的是TOMCAT7插件启动
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
String s = new String(bytes, StandardCharsets.UTF_8);
System.out.println("解决中文乱码后" + s);
//往前端响应数据(使用字符流)
response.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
PrintWriter writer = response.getWriter();
writer.write("处理GET请求,这是从web服务器返回的一条消息");
System.out.println("往前端写数据结束");
//请求转发到另一个servlet
// request.setAttribute("test", "这是一条转发的信息");
// try {
// request.getRequestDispatcher("/testDispatcher").forward(request, response);
// } catch (ServletException e) {
// e.printStackTrace();
// }
// System.out.println("请求转发结束");
// //请求转发到一个页面
// try {
// request.getRequestDispatcher("/b.html").forward(request, response);
// } catch (ServletException e) {
// e.printStackTrace();
// }
// //重定向
// response.sendRedirect("https://www.baidu.com");
// //response.sendRedirect("/demoHttpServlet/testDispatcher");
// System.out.println("重定向结束");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("收到了POST请求");
//===================================================
//从请求中获取参数的特有方法。获取请求体参数
// BufferedReader br = req.getReader();
// String line = br.readLine();
// System.out.println(line);
//POST中使用通用方法之前要把特有方法getReader注释掉,因为他会自动把流关掉。反之通用方法在POST也会自动关流。
//POST请求解决乱码:浏览器将请求体用输出流的方式传到web服务器tomcat,编码是按照html页面指定的UTF-8,而tomcat8之前默认的解码方式是ISO_8859_1
//所以我们需要更改请求体的读取流的解码方式为UTF-8
req.setCharacterEncoding("UTF-8");
//从请求中获取参数的通用方法
System.out.println("从请求中获取参数的通用方法一====");
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("从请求中获取参数的通用方法二====");
String[] hobbies = req.getParameterValues("hobby");
if (hobbies != null) {
for (String hobby : hobbies) {
System.out.println(hobby);
}
}
System.out.println("从请求中获取参数的通用方法三====");
String username = req.getParameter("username");
String password = req.getParameter("psw");
System.out.println(username);
System.out.println(password);
//往前端响应数据(使用字符流)
resp.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
PrintWriter writer = resp.getWriter();
writer.write("处理POST请求,这是从web服务器返回的一条消息");
System.out.println("往前端写完数据了");
// //请求转发
// req.setAttribute("test", "这是一条转发的信息");
// try {
// req.getRequestDispatcher("/testDispatcher").forward(req, resp);
// } catch (ServletException e) {
// e.printStackTrace();
// }
// System.out.println("请求转发结束");
// //重定向
// resp.sendRedirect("https://www.baidu.com");
// String contextPath = req.getContextPath();
// //response.sendRedirect("/demoHttpServlet/testDispatcher");
// System.out.println("重定向结束");
}
}
比如我们想返回一张图片:那就需要更改DemoHttpServlet.java为
// //往前端响应数据(使用字符流)
// response.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
// PrintWriter writer = response.getWriter();
// writer.write("处理GET请求,这是从web服务器返回的一条消息");
// System.out.println("往前端写数据结束,response响应结束后会自动关流");
//往前端响应数据(使用字节流)
//1. 读取文件
FileInputStream fis = new FileInputStream("E:\\ideaProject\\javaweb\\8httpservlettomcat\\请求响应图示.png");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1) {
os.write(buff, 0, len);
}
fis.close();
System.out.println("往前端写数据结束,response响应结束后会自动关流");
或者使用Apache提供的io流工具包,commons-io
首先引入依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
然后更改DemoHttpServlet.java为
// //往前端响应数据(使用字符流)
// response.setContentType("text/html;charset=utf-8");//告诉浏览器服务器给浏览器的是text或者html
// PrintWriter writer = response.getWriter();
// writer.write("处理GET请求,这是从web服务器返回的一条消息");
// System.out.println("往前端写数据结束,response响应结束后会自动关流");
//往前端响应数据(使用字节流)
//1. 读取文件
FileInputStream fis = new FileInputStream("E:\\ideaProject\\javaweb\\8httpservlettomcat\\请求响应图示.png");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
// byte[] buff = new byte[1024];
// int len = 0;
// while ((len = fis.read(buff)) != -1) {
// os.write(buff, 0, len);
// }
IOUtils.copy(fis,os);//调用commons io包提供的方法
fis.close();
System.out.println("往前端写数据结束,response响应结束后会自动关流");
发起GET请求看到图片加载到浏览器了
如上,我们已经实现了给浏览器响应(返回)一个页面、一句话、一张图片、一个新的地址,基本覆盖了所有能响应的东西了。
====================================================================
下一篇来做一个登录注册的demo