- _nosay
使用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.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)); } } }
运行结果如下