mvc如何嵌套第三方页面_我的Java Web之路27 - MVC是什么

本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,原来已经分享在我的CSDN博客,现在分享在头条,希望能帮助更多码农和想成为码农的人。版权声明:本文为CSDN博主「普通的码农」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/liyongyan1202/article/details/94635344

目录

  1. 介绍
  2. 再谈Servlet
  3. 进一步分析第一个Java Web应用 - MVC的必要性
  4. MVC的含义、核心、本质、原理

介绍

到目前为止,我们已经学习了Java基础中的基本概念(类、接口、继承、多态、注解等),Eclipse的配置和使用,Web和HTML的基础知识,Servlet容器Tomcat的下载和介绍,Spring框架的基本使用方法等等。

但我们还仅仅是编写了第一个Java Web应用,偏离Web已经颇有点遥远。所以,我打算重新回到Java Web的正轨上来。

不过,前面的学习其实是必不可少的,后面学习的时候遇到各种概念(比如注解、Servlet、部署描述符、Spring等,类/抽象类、接口等等就无需多说了,)可能就不会一头雾水了。

本篇文章是Spring MVC的开篇,我们重点学习和理解MVC的含义、核心、本质、原理。

再谈Servlet

Servlet技术是开发Java Web应用的底层技术,它包括Servlet容器Servlet API两个部分。

Servlet容器负责的是接收用户请求和发送响应,而请求的处理和响应的生成由业务开发人员实现。

Servlet容器往往是由专门的提供商或开源组织提供,比如Tomcat,它需要被部署到服务器上,然后配置各种参数以达到性能最优。

Servlet容器启动时会加载或动态加载多个Web应用,而每个Web应用就包含各种资源,比如HTML页面、图片、视频、音频、CSS文件(控制网页的外观,在浏览器中解释执行)、JavaScript文件(控制网页的行为如各种点击事件,在浏览器中解释执行)等等,这些都是静态资源。

还有一种很重要的资源就是Java代码,它是在Servlet容器中执行的。这些Java代码与Servlet容器之间的交互/通信,其实就是通过Servlet API来实现的,当然这些Servlet API必须符合Servlet规范。Servlet规范也有不同版本,比如3.0、4.0等。Servlet API其实就包括Servlet、ServletContext、ServletConfig、ServletRequest、HttpServlet、HttpServletRequest,还有过滤器、监听器等等Java类 / 接口。

Servlet API通常在部署时使用Servlet容器所提供的。

f95f0f356177f5c98aa74db2d0a06985.png

实际上,由于应用的复杂性、业务的灵活多变,要求这些Java代码必须能消除重复,并且很容易修改、扩展,这样才能快速的应对业务应用的变化。

所以,经过前人的不断实践和总结,提出各种技术,而MVC就是其中一种技术。

MVC(Model-View-Controller,即模型-视图-控制器) 最早好像是Smalltalk领域中提出来的,后来也应用到了Web应用开发领域,当然Java Web应用开发也有对应的框架,比如Struts、Spring MVC等。其他语言也有自己的MVC框架。

我们暂时不去描述MVC的含义,先从分析我们的第一个Java Web应用开始。

进一步分析第一个Java Web应用 - MVC的必要性

先再一次给出我们的第一个Java Web应用的代码:

package com.example;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.WebServlet;@WebServlet(urlPatterns = {"/hello"}) //这就是注解public class HelloWorld extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print(""+ "

Hello World! Your IP is " + request.getRemoteHost()+ "

"+ "");}}

我们可以看到,Java Web应用的开发主要就是开发Servlet,实现请求的处理(上面代码几乎没有,不符合实际)、响应内容的填充(上面代码主要是将数据交给HTML来呈现)。

然而,把所有Java代码都放置到你所开发的Servlet中显然是不合适的,你的Servlet会变得非常庞大、复杂、难以修改和扩展。比如,上面响应内容填充的是HTML页面这种视图,如果HTML页面需要做变更,那么需要修改代码;同时,代码的可读性也明显是很低的;HTML页面也很难复用等等。

从职责上来说,这样的Servlet往往要包含以下几个职责:

  1. 首先要提取请求中的控制数据和业务数据;
  2. 将业务数据转化成业务对象,并进行数据校验;
  3. 执行业务对象的业务逻辑,该访问数据库的访问数据库;
  4. 响应内容填充,包括某种视图和执行结果;
  5. 任何一步都有可能发生异常,需要异常的处理。

上述总的流程都是相似的,所以会存在大量的重复操作,我们需要把这些职责都封装到独立的组件或框架中,然后提供扩展点让业务开发人员开发业务对象、业务逻辑、校验规则等,可以选择某种视图来呈现业务结果。

MVC的含义、核心、本质、原理

所以,自然而然的,把Servlet(当然,其他语言中就不是Servlet了)当做某种控制器,仅仅是串联输入请求的校验和转换、业务逻辑的调用、提交业务结果到某个视图组件、视图组件渲染为视图并填充响应。其中,业务数据、业务对象、业务逻辑、校验规则等就属于模型视图显然是负责处理数据如何呈现的。

显然,这样分层之后,有很多好处:

  • 应用的可扩展性更强,视图和模型的变更互不影响,或影响很小;
  • 开发测试效率更高,模型和视图可以各自独立的并行的开发和测试。

MVC模式显然也是单一职责原则的运用,把职责进行细化,然后封装到独立的组件,其目标显然也是为了消除重复,提高复用性和可扩展性。实际上,难点在于职责的发现、分析、归纳以及扩展模式的设计。

模型在Java中使用类、接口等组件,如果是用Spring框架,那么POJO(Plain Old Java Object,普通的老式对象)即可,不需要继承或实现任何的其他组件。实际上,模型又可以进一步分层,比如分为服务层和数据访问层

视图可以采用HTML,也可以采用其他技术,Java Web应用里面通常是使用JSP(Java Server Pages),当然还有其他的技术,比如Velocity、FreeMarker、Thymeleaf等模板引擎;XML、JSON等数据格式;Excel、PDF、Word等应用格式。

控制器在Java Web应用中通常就是由Servlet来充当,也可以使用Filter来充当。前面说过,控制器一般就是串联的作用,事实上,在Spring MVC中,控制器有三个层次,前端是调度器/分派器(Dispatcher)的Servlet,中间是Controller,最底层是Handler。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值