通过前面的学习能够创建并运行一个简单的 Servlet程序,完成浏览器和服务器的简单交互,但是我们编写的Servlet 代码是没有对浏览器的请求进行处理的。现在开始学习如何使用 Servlet 进行浏览器请求的处理。
Request对象
问题:
浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。那么服务器接受到请求的数据该怎么存储呢?
解决:
使用对象进行存储,服务器每接受一个请求,就创建一个对象专门来存储此次请求的请求数据。
实现:request对象
解释:
服务器接收到浏览器的请求后,会创建一个Request对象,对象中存储了此次请求相关的请求数据。服务器在调用Servlet时会将创建的Request对象作为实参传递给 Servlet 的方法,比如:service 方法。
如何获得request对象的请求行,请求头,请求体
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式:
此时servlet对象已经获得了request对象,要怎么获得请求行,请求头,请求体中的数据呢
servlet.class:
package com.my;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String threadName = Thread.currentThread().getName();
// System.out.println(threadName);
//http-nio-8080-exec-5
//08-Jul-2020 12:02:22.745 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\JAVA\apache-tomcat-9.0.37\webapps\manager]
//08-Jul-2020 12:02:22.797 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\JAVA\apache-tomcat-9.0.37\webapps\manager]的部署已在[52]毫秒内完成
//http-nio-8080-exec-9
//http-nio-8080-exec-10
//http-nio-8080-exec-1
//获得请求头行的信息
String method = req.getMethod();//获得请求行中的请求方法
StringBuffer url = req.getRequestURL();//获得请求行中的url
String ip = req.getRemoteAddr();//获得发送请求的主机ip地址
//获得请求头中的信息
String accept = req.getHeader("Accept");
String host = req.getHeader("Host");
String header = req.getHeader("User-Agent");
//获得请求体中的信息,只有post方式才有请求体
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
System.out.println(method);
System.out.println(url);
System.out.println(ip);
System.out.println(accept);
System.out.println(host);
System.out.println(header);
System.out.println(uname);
System.out.println(pwd);
}
}
可以看到request类中有获得请求行,请求头,请求体数据的方法
在控制台中可以看到输出结果
resquest的get方法总结:
1. 获得请求行中的数据:
- req.getMethod();//获得请求行中的请求方法
- req.getRequestURL();//获得请求行中的url
- req.getRemoteAddr();//获得发送请求的主机ip地址
2.获得请求体头中的数据
req.getHeader(“key”);例如:
req.getHeader(“Accept”);
req.getHeader(“Host”);
req.getHeader(“User-Agent”);
Request对象生命周期
一次请求会话中(发起请求,到响应完成;由服务创建,也是被服务器销毁)
Response对象
问题:
在使用Request对象获取了请求数据并进行处理后,处理的结果如何显示到浏览器中呢?
解决:
使用 Response对象
解释:
服务器在调用指定的Servlet进行请求处理的时候,会给 Servlet的方法传递两个实参request和response。其中request中封存了请求相关的请求数据,而 response 则是用来进行响应的一个对象。
如何设置响应行,响应头,响应体
HTTP 响应报文由状态行、响应头部、空行 和 响应体 4 个部分组成,如下图所示:
设置请求行
package com.my;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应response
//设置响应行
resp.sendError(500,"繁忙中");
}
}
输入网址http://localhost:8080/SecondWeb/ser2可以看到
设置响应头
Server 服务器应用程序软件的名称和版本
resp.setHeader(“Refresh”, “3;url=http://www.baidu.com”); //三秒后刷新
resp.setHeader(“Content-Encoding”, “gzip”); //告诉响应头以gzip 格式解码
resp.setHeader(“Content-Type”, “application/octet-stream”); 设置响应正文类型
resp.setHeader(“Content-type”, “text/html;charset=UTF-8”);设置响应体编码格式
设置响应体
resp.getWriter().write(“你好”);设置响应体
Servlet2.class:
package com.my;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应response
//设置响应行
// resp.sendError(500,"繁忙中");
//设置响应头
resp.setHeader("Content-type", "text/html;charset=UTF-8");
//设值响应体
resp.getWriter().write("<font color = 'red'>你好</font>");
}
}
启动服务器,输入网址http://localhost:8080/SecondWeb/ser2,可以看到:
Servlet代码编写流程的总结:
Servlet的使用流程:
设置请求编码格式
设置响应编码格式
获取请求信息
处理请求信息
响应处理结果
数据流转流程图解:
浏览器------>服务器------->数据库
浏览器<------服务器<-------数据库