栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet API(HttpServlet Request Response)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet API(HttpServlet Request Response)

⭐相关阅读推荐⭐

WebAPI—DOM (HTTL、CSS、Java Script应用及案例)

☀ Java项目-表白墙(前后端分离+数据库)已开源 ☀

 前端项目—待办事项(HTML+CSS+JavaScript实现)         

Servlet : Servlet部署教程(基于Tomcat) 

Tomcat :Tomcat使用教程

                 Smart Tomcat插件使用教程(IDEA)

前端网络:Fiddler使用教程(HTTP抓包 前端debug)

                  HTTP、HTTPS协议详解

                  HTML常用语法总结【精华】

                  CSS常用语法总结【精华篇】

                  Java Script 语法总结  


本章目录

※ 服务器响应流程

※ Servlet的生命周期

HttpServlet(doXXX)

HttpServletRequest(getXXX)

♦ GET, query string  => getParameter

♦ POST (body) 

x-www-form-urlencoded => getParameter

json => 先读出body,再通过Jackson库解析

HttpServletResponse(setXXX)

♦ 构造状态码(setStatus)

♦ 自动刷新页面(setHeader("Refresh","xxs"))

♦ 重定向(sendRedirect)

 Servlet 实现上传文件(MultipartConfig)


※ 服务器响应流程
  1. 读取请求并解析(Tomcat 完成)

  2. 根据请求计算响应(用户代码,doXXX)

  3. 把响应返回给客户端(Tomcat 完成)

  • ​​​​​HttpServlet
  • HttpServletRequest
  • HttpServletResponse

※ Servlet的生命周期

生命周期就是Servlet对象从诞生到消亡的过程:

  1. Servlet对象是由Tomcat来进行实例化的,并且在实例化完毕之后调用init方法

  2. Tomcat收到的每个请求,都通过对应的Servlet的service方法来进行处理(这里面会调用到 doXXX 方法)

  3. 在服务器结束之前,会调用destroy方法来回收资源

HttpServlet(doXXX)

写一个 Servlet 程序,主要就是需要继承 HttpServlet 并且重写其中的doXXX方法

  • 发的是GET请求,就重写doGet;发的是POST请求,就重写doPost

HttpServletRequest(getXXX)

对标 HTTP 请求报文格式,提供的方法(getXXX)都是和 HTTP 协议格式来匹配的。

ShowRequestServlet.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;
import java.util.Enumeration;

@WebServlet("/showRequest")
public class ShowRequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 此处返回一个 HTML, 在 HTML 里面显示刚才看到的这些 API 的接口
        // 把这些 API 的返回结果往这个 StringBuilder 里面来拼
        StringBuilder html = new StringBuilder();
        html.append(req.getProtocol());     // HTTP版本号
        html.append("
"); html.append(req.getMethod()); // 方法 html.append("
"); html.append(req.getRequestURI()); // 请求路径 html.append("
"); html.append(req.getContextPath()); // 上下文路径 html.append("
"); html.append(req.getQueryString()); // QueryString html.append("
"); html.append("
"); html.append("
"); html.append("
"); // 获取到请求的 header 头 Enumeration headers = req.getHeaderNames(); // 请求中的 header 是一组键值对结构,循环相当于拿到键值对中所有的 key while (headers.hasMoreElements()) { String headerName = headers.nextElement(); html.append(headerName); html.append(":"); html.append((req.getHeader(headerName))); // 根据 key 来获取 value html.append("
"); } resp.getWriter().write(html.toString()); } }

​​

GET, query string  => getParameter

getParameter(按照键值对,能够获取到指定的 value)

GetParameterServlet.java 文件

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 约定请求是一个:getParameter?username=123&password=456
        // 通过 getParameter 方法拿到用户名和密码的值
        resp.setContentType("text/html;charset=utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        resp.getWriter().write("username=" + username + "
" + "password=" + password); } }

POST (body) 

body的数据格式:

  1. 如果 body 里的内容格式,是按照x-www-form-urlencoded 也是使用 getParameter 来处理(和QueryString一样)
  2. 如果 body 里的内容格式,是按照 form-data 此时有单独方式处理
  3. 如果 body 里的内容格式,是 json 此时需要借助第三方库来处理

x-www-form-urlencoded => getParameter

postParameterServlet.java 文件

@WebServlet("/postParameter")
public class PostParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 此处是要获取 body 的数据,由于 GET 一般没有 body, 就使用 POST 方法来演示
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        resp.getWriter().write("username=" + username + "
" + "password=" + password); } }

 form 表单绑定实现(webapp -> login.html)

    

json => 先读出body,再通过Jackson库解析

(核心操作:objectMapper.readValue,注意第二个参数的用法(类对象))

  1. 引入第三方库 Jackson Databind 来解析 json 语句
  2. 在中央仓库WebAPI—DOM (HTTL、CSS、Java Script应用及案例),搜索 jackson 2.13.1 版本即可
  3. XML代码如下,放入 pom.xml 的依赖中,记得刷新 Maven :

    com.fasterxml.jackson.core
    jackson-databind
    2.13.1

JsonParameterServlet.java 文件

class UserInfo {
    public String username;
    public String password;
}

@WebServlet("/jsonParameter")
public class JsonParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 先把整个请求的 body 都取出来
        String body = readBody(req);
        System.out.println(body);
        // 2. 按照 json 的格式来进行解析,(对于 json 的解析,Java标准库没有内置的方法,Servlet也没有现成的方法,就需要使用第三方库来完成)
        // 使用第三方库来完成,在 Java 中解析 json 的第三方库有很多,此处使用 Jackson 这个库
        ObjectMapper objectMapper = new ObjectMapper();
        UserInfo userInfo = objectMapper.readValue(body, UserInfo.class);   //告诉 objectMapper 把json字符串转成哪个类的对象
        resp.getWriter().write("username=" + userInfo.username + "
" + "password=" + userInfo.password); } private String readBody(HttpServletRequest req) throws IOException { // 通过这个方法来读取请求中的整个 body // 核心操作是 req.getInputStream 这个方法,这个方法会得到 InputStream 对象,然后进一步读取里面的内容 // InputStream 文件操作 // 1. 先拿到 body 的长度,单位是字节 int contentLength = req.getContentLength(); // 2. 准备一个字节数组,来存放 body 内容 byte[] buffer = new byte[contentLength]; // 3. 获取到 inputStream 对象 InputStream inputStream = req.getInputStream(); // 4. 读取数据,就是从 inputStream 对象中,读取到数据,放到 buffer 这个字节数组中 inputStream.read(buffer); // 5. 得到的结果构造成一个 String return new String(buffer, "utf-8"); } }

在 Postman 中构造 POST json语句:

{
    "username":"123",
    "password":"1561561"
}

HttpServletResponse(setXXX)

HttpServletResponse对象和 HTTP 的响应报文格式密切相关

因此其提供的方法都是 setXXX 系列。

构造状态码(setStatus)

StatusServlet.java 文件

// 通过这个代码,来构造出不同的响应状态码
@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        int status = 200;
        resp.setStatus(status);
        resp.getWriter().write("status=" + status);
    }
}

自动刷新页面(setHeader("Refresh","xxs"))

在响应报头里设置一个字段,用 setHeader 实现刷新自动页面

AutoRefreshServlet.java 文件

@WebServlet("/autoRefresh")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 给响应设置一个 Refresh 的 header,每隔 1s 刷新一次
        resp.setHeader("Refresh","1");
        resp.getWriter().write("timestamp=" + System.currentTimeMillis());
    }
}

重定向(sendRedirect)

RedirectServlet.java 文件

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 构造一个 302 这样的响应,重定向到百度主页
//        resp.setStatus(302);
//        resp.setHeader("Location","https://www.baidu.com/");

        // 也可以直接使用 sendRedirect 完成
        resp.sendRedirect("https://www.baidu.com/");
    }
}

 Servlet 实现上传文件(MultipartConfig)

upload.html 文件




    
    
    
    上传文件


    

UploadServlet.java 文件

@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过 req.getPart 获取到前端传来的文件
        Part part = req.getPart("MyFile");
        System.out.println(part.getSubmittedFileName());
        System.out.println(part.getSize());
        System.out.println(part.getContentType());
        // 此处假设上传的是一个图片
        part.write("C:/Users/Zincy/Pictures/myfile.jpg");
        resp.getWriter().write("upload ok");
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820839.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号