servlet处理请求的方式有哪些?该怎么实现?

小伙伴们呢知道servlet的实现方式有哪些吗?上次我们说到了servlet的生命周期,这次就一起来了解一下servlet的实现方式都有哪些吧。

我们要知道,servlet的直接请求处理方式有三种,如下:

一、直接处理

使用req.setAttribute("key","value");

二、请求转发方式

特点:发一次请求,浏览器的地址不变;

通过req.setAttribute()就能够把一次请求的数据传递个下个servlet;

在刷新页面的时候,请求重复发送,会导致表单数据重复提交;

req.getRequestDispatcher(uri/servlet别名).forword(req,resp);

三、请求重定向

特点:发送两次请求,浏览器的地址就会改为第二个servlet的;

解决了页面刷新导致表单数据重复提交的问题;

但无法将第一个的请求数据给第二个请求使用,如果有需要,就要配合cookie、session等技术来实现;

response.sendRedirect(uri);

实现示例:

源代码

  protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();
        if(method.equals("GET"))
        {
            long lastModified = getLastModified(req);
            if(lastModified == -1L)
            {
                doGet(req, resp);
            } else
            {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < (lastModified / 1000L) * 1000L)
                {
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else
                {
                    resp.setStatus(304);
                }
            }
        } else
        if(method.equals("HEAD"))
        {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else
        if(method.equals("POST"))
            doPost(req, resp);
        else
        if(method.equals("PUT"))
            doPut(req, resp);
        else
        if(method.equals("DELETE"))
            doDelete(req, resp);
        else
        if(method.equals("OPTIONS"))
            doOptions(req, resp);
        else
        if(method.equals("TRACE"))
        {
            doTrace(req, resp);
        } else
        {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object errArgs[] = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
    }

通过源代码我们看到service其实只是用来转向的,但如果在servlet类中覆盖了service方法,如:

public class HelloServlet extends HttpServlet
{
    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        //设置一个消息头,告诉客户端(即浏览器)服务器
        //返回的数据类型。
        response.setContentType("text/html");
        //通过response获得输出流。
        PrintWriter out = response.getWriter();
        out.println(
            "<div style='color:red;font-size:30px;'>" +
            "Hello World</div>");
        out.close();
    }
}

这时service就是用来做业务处理的了,不论客户端是用post还是get来请求此servlet都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。

Servlet结构图:

servlet处理请求的方式

以上就是关于servlet处理请求方式的全部内容了,还需要了解更多java常见问题的话可以多多关注我们的网站噢。

推荐阅读:

java servlet教程,servlet开发实例详解

java写一个servlet实现登录功能,servlet简单登录实例代码

servlet是什么?servlet的理解