频道栏目
首页 > 资讯 > 其他 > 正文

HttpServlet、HttpServletRequest、HttpServletResponse

18-01-10        来源:[db:作者]  
收藏   我要投稿

一 HttpServlet

HttpServlet类覆盖了javax.servlet.GenericServlet类。

类结构如下图:

使用HttpServlet时,需要借助HttpServletRequest和HttpServletResponse对象,

这两个对象分别集成于ServletRequest和ServletResponse。

HttpServlet覆盖了GenericServlet中的Service方法,HttpServlet中service方法签名如下:

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();

        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < lastModified) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
            
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);
            
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
            
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
            
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
            
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

新的service方法和javax.servlet.Servlet中的service方法的区别在于,

HttpServlet中的service方法接受HttpServletRequest和HttpServletResponse作为参数,

而javax.servlet.Servlet中的service方法接受ServletRequest和ServletResponse作为参数。

在HttpServlet中的方法中重写了Servlet种的service方法,签名如下:

@Override
    public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException
    {
        HttpServletRequest  request;
        HttpServletResponse response;
        
        if (!(req instanceof HttpServletRequest &&
                res instanceof HttpServletResponse)) {
            throw new ServletException("non-HTTP request or response");
        }

        request = (HttpServletRequest) req;
        response = (HttpServletResponse) res;

        service(request, response);
    }

也就是说,在HttpServlet中有两个service方法,

一个接受HttpServletRequest和HttpServletResponse作为参数,

另外一个接受ServletRequest和ServletResponse作为参数。

在调用第二个service方法时,将ServletRequest和ServletResponse参数

强转为HttpServletRequest和HttpServletResponse对象重载的service方法。

在HttpServlet中的service方法会校验用于发送请求的HTTP方式,

通过request.getMethod()获取,根据判断调用不同的方法。

Http处理请求主要有以下几种方法:

doGet, doPost, doHead, doPUt, doTrace, doOptions, doDelete。

每一种方法表示一个HTTP方法。其中doGet和doPost是我们最常用的。

所以,我们不需要在覆盖Service方法了,只需要覆盖对应的doGet和doPost就可以处理请求。

HttpServlet主要有以下优点:

(1)因为我们又不同请求方法,可以覆盖常用的doGet和doPost。

在少数情况下,我们才会需要覆盖doHead等请求方法。

(2)使用HttpServletRequest和HttpServletResponse更强大的接受请求和返回响应,

因为它们分别扩展自ServletRequest和ServletResponse,功能更强大。

二 HttpServletRequest

HttpServletRequest表示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,将创建一个新的会话对象。

三 HttpServletResponse

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

void addCookie(Cookie cookie);

给这个响应对象添加一个cookie。

void addHeader(java.lang.String name, java.lang.String value);

给这个响应对象添加一个header。

void sendRedirect(java.lang.String location);

发送一条响应码,将浏览器跳转到指定的位置。

相关TAG标签
上一篇:Eureka-注册中心功能性设计解析
下一篇:Spring Framework--ApplicationComtext详解AbstractApplicationContext.refresh()
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站