Servlet的请求和响应处理

通过前面的学习能够创建并运行一个简单的 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. 获得请求行中的数据:
  1. req.getMethod();//获得请求行中的请求方法
  2. req.getRequestURL();//获得请求行中的url
  3. 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的使用流程:
设置请求编码格式
设置响应编码格式
获取请求信息
处理请求信息
响应处理结果

数据流转流程图解:
浏览器------>服务器------->数据库
浏览器<------服务器<-------数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值