在之前的文章Servlet执行原理浅谈中对Servlet的整个原理做了大概介绍。我们知道客户端发送的请求是交给Servlet中的service方法进行处理。而在实际使用时,并没有直接重写service方法,而是继承了HttpServlet,重写了doGetdoPost等方法,而这期间又发生了什么呢。

首先,我们观察Servlet这个接口:

1
2
3
4
5
6
7
8
9
10
11
public interface Servlet {
void init(ServletConfig var1) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();

void destroy();
}

Servlet是一个接口,其中包含5个方法,我们大多真正使用的是service方法,其他的几个方法并不常用。因此,就出现了以下两个实现类:

image-20201129170130519

在之前的总结Java初试MVC及三层架构中,查看其目录结构仅仅对于User对象的操作就写了6,7个servlet,而每一个servlet只对应一个功能,但随着以后项目的扩大,业务逻辑的复杂化,我们需要操作的对象不仅仅是一个User类时,换句话说,我们操作数据库中的表不止一张时,那么可想而知我们的servlet需要写多少!

未优化前的目录结构

思考:我们能否像service层和dao层一样,将关于User的操作都写在一个类当中,方便我们的使用呢。从而减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。

我们编写的所有servlet都继承了HttpServlet,与此同时都复写了doGet以及doPost方法。查看HttpServlet源码,可以看见对doGet以及doPost的方法的调用都写在service中。

最近又捡起了对Java的学习,通过对一个实例的介绍,总结下此次对Web开发中MVC三层架构的学习,以便用于日后的复习。

一、 MVC

简单的先介绍下MVC模式:

  • M(Model):JavaBean。用于完成具体的业务操作。

    JavaBeanJava中特殊的类.

    JavaBean满足条件:

    • public修饰的类,并提供public无参构造方法
    • 所有的属性都是private修饰
    • 提供gettersetter方法

    使用层面:

    • 封装业务逻辑:dao层封装对数据库的底层操作
    • 封装数据:domain层。对数据库中所要查询对象的封装
  • V(View):视图。用于数据的展示。

    • 页面的展示
    • 与用户的交互
  • C(Controller):控制器。由Servlet实现控制器。

    主要功能:

    • 获取用户的输入
    • 调用模型,将请求交给模型进行处理
    • 将数据交给视图进行展示