Servlet API

29 篇文章 0 订阅


Servlet的主要功能就是处理请求,为了便于程序员进行处理请求这一操作,我们引入了Servlet的API,本篇文章就主要来介绍有关于Servlet的API的知识。

Servlet的API中包含了许多内容,但我们主要就下面三个类来学习:

HttpServlet

前面我们在编写第一个Servlet程序时,就使用到了这个类,下面罗列出的是该类中常用的方法:
在这里插入图片描述
在实际开发中,更多情况下,我们是重写doxxx方法,下面就使用代码简单演示这些方法的使用:
首先使用url构造get请求:

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;

@WebServlet("/HttpServlet")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doGet!");
    }
}

在这里插入图片描述
post请求的构造除了可以通过form表单来实现以外,还有其他的构造方式,这里我们首先使用ajax的方式来构造:
在webapp目录下创建html文件(必须在此路径下,否则会出现404错误),写入下面代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .one {
            font-size: 50px;
        }
    </style>
</head>
<body>
    <div class="one">

    </div>

    <button id="doGet">get</button>
    <button id="doPost">post</button>
    <button id="doPut">put</button>
    <button id="doDelete">delete</button>

    <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
    <script>
        let doGetBtn = document.querySelector('#doGet');
        doGetBtn.onclick = function() {
            $.ajax({
                type: 'get',
                url: 'HttpServlet',
                success: function(body) {
                    let div = document.querySelector('.one');
                    div.innerHTML = body;
                    // console.log(body);
                }
            })
        }

        let doPostBtn = document.querySelector('#doPost');
        doPostBtn.onclick = function() {
            $.ajax({
                type: 'post',
                url: 'HttpServlet',

                success: function(body) {
                    // console.log(body);
                    let div = document.querySelector('.one');
                    div.innerHTML = body;
                }
            });
        }

        let doPutBtn = document.querySelector('#doPut');
        doPutBtn.onclick = function() {
            $.ajax({
                type: 'put',
                url: 'HttpServlet',

                success: function(body) {
                    // console.log(body);
                    let div = document.querySelector('.one');
                    div.innerHTML = body;
                }
            });
        }

        let doDeleteBtn = document.querySelector('#doDelete');
        doDeleteBtn.onclick = function() {
            $.ajax({
                type: 'delete',
                url: 'HttpServlet',

                success: function(body) {
                    // console.log(body);
                    let div = document.querySelector('.one');
                    div.innerHTML = body;
                }
            });
        }

    </script>
</body>
</html>
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;

@WebServlet("/HttpServlet")
public class ServletDemo2 extends HttpServlet {


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doPost");
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doPut");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doDelete");
    }
}

运行结果:
请添加图片描述
使用ajax构造请求的方法固然可行,但也略显繁琐,下面我们尝试借助第三方工具来更加方便快捷地构造请求;

PostMan是一个常用的用于构造http请求的工具,我们可以直接通过官网来下载,官网地址https://www.postman.com/

安装完成以后打开界面如下:
在这里插入图片描述
通过选择界面左边不同的方法,就可以使用postman就可以轻松构造各种请求了
在这里插入图片描述
HttpServlet这个类主要就是涉及到上面几个方法的应用,下面是有关于HttpServlet的生命周期;
HttpServlet的生命周期,实际也就是在于在什么样的时机调用什么样的方法,具体的解答如下:

首次使用,调用init方法,生命周期的开始;
每次收到请求,调用service方法,在service方法内部根据请求的具体方法来决定调用哪一个doxxx方法;
调用destroy方法销毁对象,生命周期的结束;

HttpServletRequest

HttpServletRequest主要就是封装了http请求的对象,
它会按照http协议将http请求进行解析,下面是它的常见方法;
在这里插入图片描述

简单使用代码演示上面方法的使用:

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;

@WebServlet("/HttpServletRequest")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //指定字符的编码方式
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("你好!"+" ");
        //返回请求的名称和版本号
        resp.getWriter().write(req.getProtocol()+" ");
        //返回请求的http方法的名称
        resp.getWriter().write(req.getMethod()+" ");
        //资源定位符
        resp.getWriter().write(req.getRequestURI()+" ");
        //请求上下文的URI部分
        resp.getWriter().write(req.getContextPath()+" ");
        //返回路径后的请求URL中的查询字符串,没有就返回null
        resp.getWriter().write(req.getQueryString()+" ");
        //返回请求主体中使用的字符编码的名称
        resp.getWriter().write(req.getCharacterEncoding()+" ");




    }
}

运行结果:
在这里插入图片描述
我们可以使用Fidder抓包工具来查验我们代码的运行结果与实际情况:
请求部分:
在这里插入图片描述

响应部分:
在这里插入图片描述
由于GET请求中的参数一般是通过query string来传递给服务器的,下面我们尝试使用代码来获取GET请求中的参数:

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;

@WebServlet("/queryString")
public class QueryString extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        String id=req.getParameter("id");
        String num=req.getParameter("num");

        resp.getWriter().write("id="+id+" num="+num);
    }
}

此时使用浏览器构造URL请求时,需要在路径后面手动为我们代码中的参数设置值(在未设置的情况下默认返回null),下面是运行结果:
在这里插入图片描述
如果是post请求,就可以通过body向服务器传参,而body中的数据格式有多种定义方式,像from表单、JSON格式、或使用第三方库等;
下面首先是使用from表单进行构造:
首先是后端代码:

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;

@WebServlet("/PostFrom")
public class PostParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String id=req.getParameter("id");
        String num=req.getParameter("num");

        resp.getWriter().write("id="+id+" num="+num);
    }
}

构造的from表单必须在webapp目录下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=>, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="PostFrom" method="post">
        <input type="text" name="id">
        <input type="text" name="num">
        <input type="submit" value="提交">
    </form>
</body>
</html>

运行结果:
在这里插入图片描述
点击提交之后跳转到如下界面:
在这里插入图片描述
在构造from表单时,需要注意:

action部分必须与后端注解中的内容保持一致,否则会出现404错误;
method部分必须与后端重写的方法一致;
name部分的key必须与后端的设置一致;
前后端的约定必须遵守,只有两者相互配合,代码才可以正常运行;

抓包结果如下:
请求部分:
在这里插入图片描述
响应部分;
在这里插入图片描述

除了使用上面表单的方式来构造,我们还可以使用json格式来构造post请求,这里的构造方式的选择也有多种,像使用ajax构造,当然也可以使用第三方工具Postman来构造,这里我们通过第三方库来进行这一操作,当然,提供JSON处理的第三方库也有多种,我们选择jackson即可;

jackson的下载依然是使用Maven中央仓库https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind来完成,这里的版本可以任意选择;

在这里插入图片描述

同样是放在标签 < dependencies>< /dependencies>中,首次下载时标红属于正常现象,点击刷新按钮下载即可;
在这里插入图片描述

然后我们就可以借助jackson中的方法来直接处理json格式的请求了:

import com.fasterxml.jackson.databind.ObjectMapper;

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;


//首先需要构造一个类,这里类的属性的名字必须与json中的key保持一致
class Student{

    //这里的属性必须是public或提供公开的getter方法
    public int id;
    public int num;
}
@WebServlet("/JsonServlet")
public class JsonServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用该对象从请求的body中进行读取,并解析
        ObjectMapper objectMapper=new ObjectMapper();
        //通过使用readValue()方法把json字符串转为java 对象
        Student student=objectMapper.readValue(req.getInputStream(),Student.class);
        resp.getWriter().write(student.id+" "+student.num);
    }
}

readValue()方法把json字符串转为java 对象,这里第一个参数是一个String或者InputStream,第二个参数是转换的结果对应的java对象;
writeValue()方法是把java对象转成json字符串;

HttpServletResponse

HttpServletResponse对象主要就是接收来自服务器的响应数据,其核心方法主要有下面这些:

在这里插入图片描述
简单使用代码来演示重点方法的实现:

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;

@WebServlet("/status")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //手动设置状态码
        resp.setStatus(405);
    }
}

设置结果:
在这里插入图片描述
通过设置http响应报头中的Refresh字段,实现自动刷新操作:

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;

@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Refresh","1");
        resp.getWriter().write(System.currentTimeMillis()+"");
    }
}

重定向实现,自动跳转到新页面:

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;
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("http://www.baidu.com");
    }
}

具体的代码运行结果大家可以自行尝试;

至此,servlet相关的重点3个API就介绍完毕了啦~

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值