小伙伴们呢知道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处理请求方式的全部内容了,还需要了解更多java常见问题的话可以多多关注我们的网站噢。
推荐阅读: