《Servlet、JSP和Spring MVC初学指南》——1.9 Http Servlets

    xiaoxiao2024-03-10  125

    本节书摘来自异步社区《Servlet、JSP和Spring MVC初学指南》一书中的第1章,第1.9节,作者:【加】Budi Kurniawan(克尼亚万) , 【美】Paul Deck著,更多章节内容可以访问云栖社区“异步社区”公众号查看

    1.9 Http Servlets

    不说全部,至少大多数应用程序都要与HTTP结合起来使用。这意味着可以利用HTTP提供的特性。javax.servlet.http包是Servlet API中的第二个包,其中包含了用于编写Servlet应用程序的类和接口。javax.servlet.http中的许多类型都覆盖了javax.servlet中的类型。

    图1.5展示了javax.servlet.http中的主要类型。

    图1.5 javax.servlet.http中的主要类型

    1.9.1 HttpServletHttpServlet类覆盖了javax.servlet.GenericServlet类。使用HttpServlet时,还要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。HttpServletRequest接口扩展javax.servlet.ServletRequest,HttpServletResponse扩展javax.servlet.ServletResponse。

    HttpServlet覆盖GenericServlet中的Service方法,并通过下列签名再添加一个Service方法:

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException

    新Service方法和javax.servlet.Servlet中Service方法之间的区别在于,前者接受HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。

    像往常一样,Servlet容器调用javax.servlet.Servlet中原始的Service方法。HttpServlet中的编写方法如下:

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest) req; response = (HttpServletResponse) res; } catch (ClassCastException e) { throw new ServletException("non-HTTP request or response"); } service(request, response); }

    原始的Service方法将Servlet容器的request和response对象分别转换成HttpServletRequest和HttpServletResponse,并调用新的Service方法。这种转换总是会成功的,因为在调用Servlet的Service方法时,Servlet容器总会传入一个HttpServletRequest和一个HttpServletResponse,预备使用HTTP。即便正在实现javax.servlet.Servlet,或者扩展javax.servlet.GenericServlet,也可以将传给Service方法的servlet request和servlet response分别转换成HttpServletRequest和HttpServletResponse。

    然后,HttpServlet中的Service方法会检验用来发送请求的HTTP方法(通过调用request.getMethod),并调用以下方法之一:doGet、doPost、doHead、doPut、doTrace、doOptions和doDelete。这7种方法中,每一种方法都表示一个HTTP方法。doGet和doPost是最常用的。因此,不再需要覆盖Service方法了,只要覆盖doGet或者doPost,或者覆盖doGet和doPost即可。

    总之,HttpServlet有两个特性是GenericServlet所不具备的:

    不用覆盖Service方法,而是覆盖doGet或者doPost,或者覆盖doGet和doPost。在少数情况下,还会覆盖以下任意方法:doHead、doPut、doTrace、doOptions和doDelete。使用HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。1.9.2 HttpServletRequestHttpServletRequest表示HTTP环境中的Servlet请求。它扩展javax.servlet.ServletRequest接口,并添加了几个方法。新增的部分方法如下:

    java.lang.String getContextPath()返回表示请求上下文的请求URI部分。

    Cookie[] getCookies()返回一个Cookie对象数组。

    java.lang.String getHeader(java.lang.String name)返回指定HTTP标题的值。

    java.lang.String getMethod()返回生成这个请求的HTTP方法名称。

    java.lang.String getQueryString()返回请求URL中的查询字符串。

    HttpSession getSession()返回与这个请求相关的会话对象。如果没有,将创建一个新的会话对象。

    HttpSession getSession(boolean create)返回与这个请求相关的会话对象。如果有,并且create参数为True,将创建一个新的会话对象。

    1.9.3 HttpServletResponseHttpServletResponse表示HTTP环境中的Servlet响应。下面是它里面定义的部分方法:

    void addCookie(Cookie cookie)给这个响应对象添加一个cookie。

    void addHeader(java.lang.String name, java.lang.String value)给这个响应对象添加一个header。

    void sendRedirect(java.lang.String location)发送一条响应码,将浏览器跳转到指定的位置。

    下面的章节将进一步学习这些方法。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)