最先的服务器处理程序是CGI,其存在着每次须要对请求进行处理时新建一个CGI对象,因此在速度和内存方面都不是很让人满意;随着JAVA语言的兴起,其跨平台的特性,使得Servlet逐渐流行起来,而且Servlet是可复用的,因此Servlet逐渐取代CGI。html
用户编写的Servlet继承自HttpServlet,继承图以下:java
了解完Web容器对HTTP消息的处理流程后,以前提到Servlet是可复用的,那是否意味着是线程共享的,那是否会产生线程不安全呢?web
@WebServlet("/HelloController")
public class HelloController extends HttpServlet {
private static final long serialVersionUID = 1L;
private HelloModel model = new HelloModel();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
request.setAttribute("name", cookieName);
request.setAttribute("value", cookieValue);
}
}
else {
Cookie cookie = new Cookie("user", "cjc");
cookie.setMaxAge(7 * 24 * 60 *60);
response.addCookie(cookie);
}
String name = request.getParameter("user");
String message = model.doHello(name);
request.setAttribute("message", message);
request.getRequestDispatcher("HelloServlet").forward(request, response);
}
}
复制代码
与SpringMVC一致,Controller处理完后须要返回model给View进行渲染,此处使用的是将model数据放入HttpServletRequest对象的属性中,而后经过RequestDispatcher对象将该请求(forward)转给HelloServlet进行处理,HelloServlet便是咱们的View; 3. View:一个Servlet,负责完善HttpServletResponse对象并返回给客户端;安全
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String user = request.getParameter("user");
String message = (String) request.getAttribute("message");
String cookieName = (String)request.getAttribute("name");
String cookieValue = (String)request.getAttribute("value");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1> Hello!" + user + "!</h1>");
out.println(message);
out.println("<h1> cookieName" + cookieName + cookieValue + "!</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
复制代码
至此,咱们经过Servlet实现了一个MVC框架,将处理URL的逻辑,业务逻辑和页面渲染逻辑分离开来,本来这些是经过一个Servlet完成的,这样可使系统解耦合,架构更加清晰,更容易维护。bash