javaEE&从servlet到SpringMVC

javaWeb的开发经历了多个阶段;
刚开始时,由于框架等不够成熟,主要使用serlvet,jsp等技术实现,如果需求较为简单,当然可以胜任,不过随着项目复杂度的增加,这种略显"混乱"的方式便有些力所不逮了。
之后SpringMVC的出现,使得开发可以将更多的工作量放在核心任务之上,虽然还是需要做一定的配置,但总的来说,已经很方便了。

这里对比JSP的开发方式,来看一下SpringMVC的代码逻辑。

出于易懂的初衷,一般使用很简单的代码来查看整个流程,暂时不考虑逻辑的合理性

什么是servlet编程?

在古老的servlet时代,后台都是用java代码将html数据一行行打印生成的,代码量极为庞大,这里以一个简单的servlet来看:

TestAServlet.java:

public class TestAServlet extends HttpServlet implements CommonI {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("");
        out.println("");
        out.println("Hello World!");
        out.println("");
        out.println("");
        out.println("

Hello World!

"
); out.println(""); out.println(""); out.close(); /*var a =req.getRequestDispatcher("/gc/abc");ing a.forward(req,resp );*/ } }

该类继承自 HttpServletCommonI 是自定义的用于获取 Logger 的接口,不必过多考虑,Servlet的继承结构图如下:

javaEE&从servlet到SpringMVC_第1张图片

这也是Servlet经典继承关系图:

  • Servlet 接口定义了模版方法:

    public interface Servlet {
      void init(ServletConfig var1) throws ServletException;
    
      ServletConfig getServletConfig();
    
      void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
      String getServletInfo();
    
      void destroy();
    }
    

    出于简单的原则,我们只看个大概就好:

    • init方法用于初始化操作,这个从方法名字也可以看得出来,一般整个生命周期内只调用一次。
    • destroy方法在容器销毁时才会调用。
    • service方法在每次有客户端请求到来时都会调用,用于处理主要的业务逻辑。
  • GenericServlet是个抽象类,主要是使用代理模式在类中保持一个ServletConfig对象,用于获取各种参数或者配置信息(还提供了log方法)

  • HttpServlet抽象类主要是根据Method的不同,将请求路由到不同的方法中:例如**将 GET 请求路由到 doGet 方法 **,至于其他功能,处于简单的情况考虑,都不重要

因此,我们在TestAServlet中重载了doGet方法,就可以正确的处理GET请求,然后按照一贯的做法,在web.xml中,我们配置一下拦截路径就可以了:



    test
    com.knowledge.mnlin.znd.TestAServlet

    
    true


    test
    /servlet

这也是之前Servlet开发的基本流程,此时在浏览器中访问:

http://localhost:8080/servlet

就可以获取返回信息:


    
        Hello World!
    
    
        

Hello World!

从这里看到,html显示的所有内容,包括一类的标签,都是通过 out.println() 直接写出来

但这种方式的弊端很容易发现,代码太过繁琐,可视性等都很差,如果再加上对于