使用Servlet3.0创建Servlet,以及捕获请求头和请求行

2017-11-18 12:42:43

    上文是通过在web.xml中配置servlet,比较麻烦,好在可以通过servlet3.0创建servlet


    1.创建项目的时候javaEE版本选择6.0以上

    2.在IDEA的有茇目录下直接右键new,选择Servlet

    3.配置@WebServlet(name = "Test1Servlet",urlPatterns = "/test1"),其中的urlPatterns等同于web.xml下的url-parrtener

    

    我们通过上述描述创建了一个Test1Servlet文件,内容好下

package net.zixue.servlet;

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(name = "Test1Servlet",urlPatterns = "/test1")
public class Test1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

    这样就轻松完成了servlet的配置

    在Servlet的api中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用于封闭HTTP请求,由于HTTP请求包含着请求行、请求头和请求体三部分,因此,在HttpServletRequest中分别定义了接收请求行、请求头和请求体的相关方法。

    获取请求行相关相片的相关方法:

    1.getMethod()方法:返回请求方法,请求方法通常是GET或者POST,但也有可能是HEAD、PUT或者DELETE。

    2.getRequestURI()方法:返回URI(URI是URL从主机和端口之后到表单数据之前的那一部分).

    3.getRemoteAddr()方法:该方法用于获取请求客户端的IP地址。

    4.getRemotePort()方法:该方法用于获取请求客户端的端口号。

    5.getLocalAddr()方法:该方法用于获取服务器当前接收请求的IP地址。

    6.getContextPath()方法:该方法用于获取URL中属于web应用程序的路径。

    7.getProtocol()方法:该方法用于获取请求行中的协议名和版本。


    相关测试代码:

package net.zixue.servlet;

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(name = "Test1Servlet",urlPatterns = "/test1")
public class Test1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("接收到get请求");
        System.out.println("请求方式:" + request.getMethod());
        System.out.println("URI:" + request.getRequestURI());
        System.out.println("发出请求客户端IP地址:" + request.getRemoteAddr());
        System.out.println("服务点接收请求的IP地址:" + request.getLocalAddr());
        System.out.println("访问客户端的端口号:" + request.getRemotePort());
        System.out.println("web应用路径:" + request.getContextPath());
        System.out.println("http协议和版本:" + request.getProtocol());
    }

    }

    相关运行结果如下所示:

    1.png

    获取请求头的相关方法:

    1.getHeader(String name):该方法用于获取一个指定头字段的值,如果请求头中不包含该字段则返回null,如果包含多个该字段的值则获取第一个值。

     2.getIntHeader(String name):该方法用于获取指定头字段的值,并且将其值转为int类型,如果不存在该字段则返回-1,如果获取到的值不能转换为int则会发生NumberFormatException异常。

     3.getDateHeaders(String name):该方法用于获取指定头字段的值,并将其按照GMT时间格式转换成一个代表日期/时间的长整数。

     4.getHeaderNames():该方法用于获取所有包含请求头字段的Enumeration

    

    我们直接使用第4所示方法演示一下

    具体代码如下

package net.zixue.servlet;

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(name = "Test1Servlet",urlPatterns = "/test1")
public class Test1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("接收到get请求");
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements())
        {
            String element = headerNames.nextElement();
            System.out.println(element + ": " +request.getHeader(element));
        }

    }
}

    
    运行结果如下

    1.png