空白无上
Notes Java Web

Java Web

Tomcat 安装 Tomcat官网:https://tomcat.apache.org/ 启动和配置 启动和关闭 Tomcat 访问测试:https://localhost:8080/ 可以配置启动的端口号(conf\server.xml) tomcat的默认端口号为:8080 mysql:3360 http:80

Tomcat

安装

Tomcat官网:https://tomcat.apache.org/

启动和配置

启动和关闭 Tomcat

Feishu image

访问测试:https://localhost:8080/

可以配置启动的端口号(conf\server.xml)

  • tomcat的默认端口号为:8080

  • mysql:3360

  • http:80

  • https:443

<Connector potr="8081" protocol="HTTP/1.1"
                  connectionTimeout="20000"
                  redirectPort="8443"/>
xml

可以配置主机的名字

  • 默认主机名称为:localhost-->127.0.0.1

  • 默认网站应用存放的位置为:webapps

<Host name="kbws.com" appbase="wwebapps"
      unpackWARs="true" autoDeploy="true"/>
xml

面试题

请你谈谈网站是如何访问的!

  1. 输入一个域名,回车

  2. 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射

  3. 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问

  4. 没有:去DNS服务器去找,找到的话就返回,找不到就返回找不到

Feishu image

发布一个 Web 网站

将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了

网站应有的结构:

--webapps:Tomcat服务器的web目录
        -Root
        -kuangstudy:网站的目录名
                -WEB-INF
                        -classes:java程序
                        -lib:web应用所依赖的jar包
                        -web.xml:网站配置文件
                -index.html 默认的首页
                -static
            -css
                    -style.css
            -js
            -img
         -.......
xml

HTTP

什么是 HTTP

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当

  • 文本:html,字符串,~.....

  • 超文本:图片,音乐,视频,定位,地图.......

  • 默认端口:80

HTPS:安全的

  • 默认端口:443

HTTP 请求

客户端---发送请求(Request)---服务器

百度:

Request URL: https://www.baidu.com/                请求地址
Request Method: GET                get方法/post方法
Status Code: 200 OK                状态码:200
Remote(远程) Address: 110.242.68.4:443
xml
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9                语言
Cache-Control: max-age=0
Connection: keep-alive
xml

请求行

  • 请求行中的请求方式:GET

  • 请求方式:Get/Post

  • get:一次请求能够携带的参数较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效

  • post:一次请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效

请求头

Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312  ISo8859-1
Accept-Language:告诉浏览器他的语言环境
Cache-Control:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
HOST:主机 
xml

HTTP响应

服务器---响应---客户端

百度:

Cache-Control: private                缓存控制
Connection: keep-alive                连接
Content-Encoding: gzip                编码
Content-Type: text/html;charset=utf-8                类型
xml

响应体

Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312  ISo8859-1
Accept-Language:告诉浏览器他的语言环境
Cache-Control:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
HOST:主机
Refrush:告诉客户端,多久刷新一次
Location:让网页重新定位 
xml

响应状态码

200:相应成功

3xx:请求重定向

4xx:找不到资源 404

5xx:服务器代码错误 500 502:网关错误

Servlet

简介

  • Servlet是sun公司开发动态web的一门技术

  • Sun在这些API中提供的一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个步骤:

  • 编写一个类,实现Servlet接口

  • 把开发好的Java类部署到web服务器中

把实现了Servlet程序的Java程序叫做,Servlet

HelloServlet

Servlet接口sun公司有两个默认的实现类:HttpServlet,GenericServlet

一、构建一个空白Maven项目,删掉里面的src目录,之后的学习就在这个项目里建立Moudel;这个空的工程就是Maven的主工程

Servlet依赖:

<dependency>
     <groupId>jakarta.servlet</groupId>
     <artifactId>jakarta.servlet-api</artifactId>
     <version>5.0.0</version>
     <scope>provided</scope>
</dependency>
xml

JSP依赖:

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
 <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>javax.servlet.jsp-api</artifactId>
     <version>2.3.1</version>
     <scope>provided</scope>
 </dependency>
 
 <!--Tomcat10的依赖-->
 <dependency>
     <groupId>jakarta.servlet.jsp</groupId>
     <artifactId>jakarta.servlet.jsp-api</artifactId>
     <version>3.0.0</version>
     <scope>provided</scope>
</dependency>
xml

二、关于Maven父子工程的理解

父项目中会有

<modules>
    <module>servlet-01</module>
</modules>
xml

子项目中会有

<parent>
     <artifactId>demo3</artifactId>
     <groupId>org.example</groupId>
     <version>1.0-SNAPSHOT</version>
</parent>
xml

父项目中的Java子项目可以直接使用

son extends father
java

三、Maven 环境优化

1、修改web.xml为最新的

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
  
</web-app>
xml

2、将Maven的结构搭建完整

四、编写一个Servlet程序

1、编写一个普通类

2、实现Servlet接口,这里我们直接继承HttpServlet

public class HelloServlet extends HttpServlet {
   //由于get或者post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       PrintWriter writer = resp.getWriter();//相应流
       writer.print("Hello,Servlet");
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req,resp);
   }
}
java

五、编写Servlet的映射(在web.xml中)

为什么需要映射:我们写的是Java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径

<!--注册Servlet-->
 <servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>com.java.Servlet.HelloServlet</servlet-class>
 </servlet>
 <!--Servlet的请求路径-->
 <servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello</url-pattern>
 </servlet-mapping>
xml

一个Servlet要对应一个Class文件

六、配置 Tomcat

注意项目发布的路径

七、启动测试

问题:Tomcat10 无法实例化类

Tomcat10 对 Servlet 依赖包级目录改变,Maven 导入依赖时应该导入:

<dependency>
     <groupId>jakarta.servlet.jsp</groupId>
     <artifactId>jakarta.servlet.jsp-api</artifactId>
     <version>3.0.0</version>
     <scope>provided</scope>
</dependency>
<dependency>
     <groupId>jakarta.servlet</groupId>
     <artifactId>jakarta.servlet-api</artifactId>
     <version>5.0.0</version>
     <scope>provided</scope>
</dependency>
xml

Servlet详解

核心接口和类

在Servlet体系结构中,除了实现Servlet接口,还可以通过继承GenericServket和HttpServlet类,实现编写

Servlet接口

在Servlet API中最重要的是Servlet接口,所有的Servlet都会直接或间接的与该窗口发生关系,或是直接实现该接口,或间接继承自实现了该接口的类

该接口包含以下五个方法:

init(ServletConfig config)

ServletConfig getServletConfig()

service(ServletRequest req,ServletResponse res)

String getServletInfo()

destroy()
java

GenericServlet抽象类

GenericServlet 抽象类使得编写 Servlet 变得容易。它提供的生命周期方法 init 和 destroy 的简单实现,要编写一般的 Servlet,只需要重写 service 方法即可

HttpServlet类

HttpServlet是继承GenericServlet的基础上进一步的拓展

提供将要被子类化以创建适用于Web站点的HttpServlet抽象类。HttpServlet的子类至少重写一个方法,该方法通常是以下这些方法之一:

doGet,如果servlet支持HTTP GET请求

doPost,用于HTTP POST请求

doput,用于HTTP PUT请求

doDelete,用于HTTP DELETE请求
java

Servlet的两种创建方式

实现接口 Servlet

/*
* Servlet创建的第一种方式:实现接口Servlet
* */
public class HelloServlet02 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
java

该方式比较麻烦,需要实现接口中的所有方法

继承 HttpServlet(继承)

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, IOException {
        PrintWriter writer = resp.getWriter();//相应流
        writer.print("Hello,Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
java

常见错误

HTTP Status 404 资源找不到
     - 第一种情况:地址书写错误
     - 第二种情况:地址没有问题,把IDEA项目中的out目录删去,然后重新运行
 - Servlet地址配置重复。
 - Servlet地址配置错误。
java

Servlet两种配置方式

使用 web.xml 配置

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <!--注册Servlet-->
    <servlet>
        <!--名称-->
        <servlet-name>hello</servlet-name>
        <!--Servlet的全称名称-->
        <servlet-class>com.java.servlet.HelloServlet</servlet-class>
        <!--启动的优先级,数字越小越先起作用-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--映射配置-->
    <!--Servlet的请求路径-->
    <servlet-mapping>
        <!--名称-->
        <servlet-name>hello</servlet-name>
        <!--资源匹配规则:精确匹配-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <!--Error-->
    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.java.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
xml

url-pattern定义匹配规则,取值说明:

精准匹配 /具体的名称 只有url路径是具体的名称的时候才会触发Servlet
后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet
通配符匹配 /* 匹配所有请求,包含服务器的所有资源
通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp

load-on-startup

  1. 元素标记容器是否应该在web应用程序的时候就加载这个Servlet

  2. 它的值必须是一个整数,表示servlet被加载的先后顺序

  3. 如果该元素的值为负数或没有设置,则容器会当Servlet被请求时再加载

  4. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个Servlet,值越小,servlet的优先级越高,就越被优先加载。值相同时,容器就会自己选择顺序来加载

使用注解

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, IOException {
        PrintWriter writer = resp.getWriter();//相应流
        writer.print("Hello,Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
java

@WebServlet注解常用属性

  • name:Servlet名字(可选)

  • value:配置url路径,可以配置多个。例:@WebServlet(value = {"/bs","/bbs"})

  • urlPatterns:配置url路径,和value作用一样,不能同时使用

  • loadOnStartup配置Servlet的创建的时机,如果是0或者正数,启动程序时创建,如果是负数,则访问时创建。数字越小优先级越高

Servlet应用

request对象

在Servlet中用来处理客户端请求需要用到doGet或doPost方法的request对象

Feishu image

get 和 post 的区别

get请求:

get请求的数据会放在url之后,以?分隔URL和传输数据,参数之间以&连接

get方式明文传递,数据量小,不安全

效率高,浏览器默认请求方法为GET请求

对应的Servlet方法是doGet

post请求:

post 是把提交的数据放在 HTTP 包的 body 中

密文传输数据,数据量大,安全

效率相对没有GET高

对应的方法是doPost

request主要方法

方法名 说明
String getParameter(String name) 根据表单组件名称获取提交数据
void setCharacterEncoding(String charset) 指定每个请求的编码

request 应用

HTML页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <form action="rs" method="get">
        用户名:<input type="text" name="username"><br/>
        密码:<input type="password" name="password"><br/>
        <input type="submit" value="注册">
    </form>
</body>
</html>
html

Servlet代码:

@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取用户请求发送的数据
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        System.out.println("提交的数据"+username+"\t"+password);
    }
}
java

get请求收参问题

产生乱码是因为客户端和服务器沟通的编码不一样导致的,解决的办法为:在客户端和服务端设置一个统一的编码,之后就按照此编码进行数据的传输和接收

get 中文乱码

在Tomcat7及以下版本,客户端以UTF-8的编码传输数据到客户端,而服务端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器与客户端沟通的编码不一致才导致产生中文乱码

解决办法:在接收到指定数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题

Tomcat8的版本中get方式不会出现乱码,因为服务器对url的编码格式可以进行自动转换

解决get中文乱码的代码:

@WebServlet("/GETServlet")
public class GetServlet extend HttpServlet{
    private static final long serialVersionUID=1L;
    
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //获取表单提交的信息
         String name=req.getParameter("name");
         name=new String(name.getBytes("ISO8859-1"),"UTF-8");
         //获取年龄
         String age=req.getParameter("age");
         //服务端打印输出
         System.out.println(req.getRemoteAddr()+"发来信息:姓名:"+name+"--->年龄:"+age);
     }
}
java

post 中文乱码

由于客户端是以UTF-8字符编码将表单传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收

解决方案:使用从ServletRequest接口继承来的setCharacterEncoding(charset)方法进行统一的编码设置

@WebServlet("/GETServlet")
public class GetServlet extend HttpServlet{
    private static final long serialVersionUID=1L;
    
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //设置请求参数的编码格式---对GET无效
         req.setCharacterEncoding("UTF-8");
         //获取表单提交的信息
         String name=req.getParameter("name");
         //服务端打印输出
         System.out.println(req.getRemoteAddr()+"发来信息:姓名:"+name);
     }
}
java

response对象

response对象用于相应客户请求并向客户端输出信息

Feishu image

response主要方法

方法名称 作用
setHeader(name,value) 设置响应信息头
setContentType(String) 设置响应文件类型、响应式的编码格式
setCharacterEncoding(String) 设置服务端响应内容编码格式
getWriter() 获取字符输出流

案例:使用response对象向浏览器输出HTML内容,实现用户登录后,输出Login Success

PrintWriter writer = resp.getWriter();
out.println("<html>");
out.println("<head><title>login</title></head>");
out.println("<body>");
out.println("<h1>Login Success!</h1>");
out.println("</body>");
out.println("</html>");
go

如果输出包含中文,则出现乱码,因为服务器默认使用ISO8859-1编码响应内容

解决输出中文乱码

  • 设置服务器响应的编码格式

  • 设置客户端响应内容的头文件内容的文件类型及编码格式

不推荐:

response.setCharacterEncoding("utf-8");//设置响应编码格式为utf-8
response.setHeader("Content-type","text/html;charset=UTF-8")
java

推荐:

同时设置服务端的编码格式和响应端的文件类型及响应时的编码格式

response.setContentType("text/html;charset=UTF-8");
java

Servlet原理

Servlet是由Web服务器调用,Web服务器在收到浏览器请求后,会:

Feishu image

Mapping问题

1、一个Servlet可以指定一个映射路径

<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>
xml

2、一个Servlet可以指定多个映射路径

<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/hello2</url-pattern>
</servlet-mapping>
xml

3、一个Servlet可以指定通用映射路径

<servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hello/*</url-pattern>
</servlet-mapping>
xml

4、默认请求路径

<servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/*</url-pattern>
</servlet-mapping>
xml

5、指定一些后缀或前缀等等

<!--可以自定义后缀实现请求映射
           注意,*前面不能加项目映射的路径
           hello/sdhawuhd.qinjiang-->
 <servlet-mapping>
         <servlet-name>hello</servlet-name>
         <url-pattern>*.qinjiang</url-pattern>
 </servlet-mapping>
xml

6、优先级问题

指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

<!--404-->
<servlet>
   <servlet-name>error</servlet-name>
   <servlet-class>com.java.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>error</servlet-name>
   <url-pattern>/*</url-pattern>
</servlet-mapping>
xml

问题

IDEA创建maven web项目出现“No archetype found in remote catalog. Defaulting to internal catalog”:

1、新建一个名为archetype-catalog.xml 的文件

内容为:

<?xml version="1.0" encoding="UTF-8"?>
   <archetype-catalog xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd">
           <archetypes>
                   <archetype>
                           <groupId>com.fr</groupId>
                           <artifactId>fr-server</artifactId>
                           <version>7.0</version>
                           <repository>
                                   http://git.oschina.net/thinkgem/repos/raw/master
                           </repository>
                   </archetype>
                   <archetype>
                           <groupId>com.fr</groupId>
                           <artifactId>fr-third</artifactId>
                           <version>7.0</version>
                           <repository>
                                   http://git.oschina.net/thinkgem/repos/raw/master
                           </repository>
                   </archetype>
           </archetypes>
   </archetype-catalog>
xml

2、将archetype-catalog.xml 放到自己创建的仓库里

3、为IDEA新建项目设置 archetype 的使用方式为 local, File--new project Settings--Settings for new project--Build, Execution, Deployment --Build Tools --Maven -- Runner

Feishu image

4、重新构建 Maven 项目

5、settings.xml 用 Maven 安装目录下的那个,本地仓库用自己创建的那个, 在下边新建一项:键为 archetypeCatalog,值为 internal

Feishu image

6、问题解决

ServletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用

共享数据

我在这个Servlet中保存的数据,可以在另一个Servlet中拿到

Feishu image

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext servletContext = this.getServletContext();
        String name="张三";
        servletContext.setAttribute("username",name);

    }
}
java
public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");


        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}
java
<servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.java.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>getc</servlet-name>
    <servlet-class>com.java.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>getc</servlet-name>
    <url-pattern>/getc</url-pattern>
</servlet-mapping>
xml

获取初始化参数

在 web.xml 中

<!--配置一些web应用初始化参数-->
<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
xml
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
            resp.getWriter().print(url);
}
java

MVC框架

概念

MVC又称为编程模式,是一种软件设计思想,将数据操作、页面展示、业务逻辑分为三个层级(模块),独立完成,又相互调用

  • 模型层(Model)

  • 视图(View)

  • 控制器(Controller)

MVC模式详解

MVC并不是Java独有的,现在几乎所有的B/S的架构都采用了MVC模式

  • 视图View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等

  • 控制器Controller:控制器即是控制请求的处理逻辑,对请求处理,负责流程跳转(转发和重定向)

  • 模型Model:对客观世界的一种代表和模拟(业务模拟、对象模拟)

Feishu image

优点

  • 低耦合性:模块与模块之间的关联性不强,不与某一具体实现产生密不可分的关联性

  • 高维护性:基于低耦合性,可做到不同层级之间的功能模块灵活更换、插拔

  • 高重用性:相同的数据库操作,可以服务于不同的业务处理。将数据作为独立模块,提高重用性

MVC在框架中的应用

MVC模式被广泛用于Java的各种框架中,比如Struts2、SpringMVC等等都用到了这种思想

Feishu image

三层架构与 MVC

三层架构

View层(表示界面层)、Service层(业务逻辑层)、DAO层(数据访问层)

Feishu image

MVC与三层架构的区别

  • MVC强调的是视图和业务代码的分离。严格的说MVC关注的是Web层。View就是单独的页面,如JSP、HTML等,不负责业务处理,只负责数据的展示。而数据封装到Model里,由Controller负责在V和M之间传递。MVC强调业务和视图分离

  • 三层架构是“数据访问层”、“业务逻辑层”、“表示层”,指的是代码之间的解耦,方便维护和复用