SpringMVC 简介及入门级的快速搭建详细步骤

MVC 回顾

MVC,即Model-View-Controller(模型-视图-控制器)设计模式,是一种广泛应用于软件工程中,特别是Web应用开发中的架构模式。它将应用程序分为三个核心组件:

  1. Model(模型): 模型层负责封装和管理应用程序的数据以及相关的业务逻辑。在MVC中,模型包含数据的获取、验证、处理和存储等功能。当模型的状态发生变化时,通常会通知关联的视图进行更新。
  2. View(视图): 视图层负责用户界面的呈现和与用户的交互。视图从模型获取数据,并以适合的方式展示给用户。视图是被动的,它只显示模型提供的信息,并不直接参与数据处理。
  3. Controller(控制器): 控制器负责处理用户的输入请求,协调模型和视图之间的交互。当接收到用户操作或请求后,控制器调用相应的模型方法来处理业务逻辑,并决定应该更新哪个视图来响应用户操作。

通过这种分离,MVC设计模式实现了以下优点:

  • 降低了各部分之间的耦合度,提高了代码的可重用性和可维护性。
  • 支持多视图表现同一份数据,便于开发和维护多个不同的用户界面。
  • 更容易进行单元测试,因为各个组件的功能相对独立。

简单来说:

M: Model 模型

​ 作用:处理业务、数据状态表示(业务层和DAO层及实体类)

V: View 视图

作用:数据显示、收集(注册)

C: Controller 控制器

​ 作用:接收请求、根据请求调用业务、根据业务结果跳转

三层架构

Java 框架中的三层架构是一种经典的软件设计模式,它将应用程序划分为三个层次,以提高代码的可维护性、可扩展性和复用性。这三层分别是:

  1. 表现层(Presentation Layer): 也称为用户界面层或客户端层,是直接与用户交互的部分。在Java Web应用中,这一层通常包括JSP、JSF、Servlets、Spring MVC等技术来构建用户界面和处理HTTP请求。它的任务是收集用户的输入数据,并调用业务逻辑层进行处理,然后将结果以适当的形式展示给用户。
  2. 业务逻辑层(Business Logic Layer / Service Layer): 这一层包含了应用程序的核心业务逻辑,它定义了如何处理来自表现层的请求以及如何与数据访问层交互。在Java框架中,可以使用普通的Java类或者Spring框架的服务接口和服务实现来编写业务逻辑。业务逻辑层对上层屏蔽了底层的数据存储细节,实现了业务规则和流程的封装。
  3. 数据访问层(Data Access Layer): 又称持久化层,负责所有与数据库相关的操作,例如数据的增删改查(CRUD)。在Java框架中,常见的持久化框架有Hibernate、MyBatis等,它们提供了一种方便的方式来执行SQL语句并与数据库交互。数据访问层为业务逻辑层提供了统一的数据访问接口,使得业务逻辑不依赖于特定的数据库系统。

通过三层架构的设计,各层之间相对独立,能够降低模块间的耦合度,便于后期的维护升级,同时提高了开发效率和系统的灵活性。

MVC 框架

主流的 MVC 框架有:

Struts1.x -------- 核心控制器--- Servlet -- 耦合 Servlet

Struts2.x --------- 核心控制器--- 过滤器 ---控制器 SSH --- Struts+Spring+Hibernate

SpringMVC ------ 核心控制器---Servlet --- xml

一、SpringMVC 项目搭建

1. 创建 Maven Web 项目

创建Maven Web项目,新建 Module ,选择 Maven Archetype 模板

创建好之后的目录结构如下:

可以看出,默认缺少 java 目录的,下面手动新建 Java 目录

选中 main 右键 ,在下面弹出框中选择:

选中后会弹出下面选择框:

直接选中下面的 java 双击 即可,完成后的目录结构如图:

2. 添加依赖

在 pom.xml 中添加 spring-webmvc 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.22</version>
    </dependency>
</dependencies>

3. 配置 web.xml

配置 Servlet , DispatcherServlet 核心控制器(前端控制器)

注意:在servlet 配置中的 servlet-name 的取值,影响创建的 springmvc 配置文件的命名

命名规则:<servet-name>-servlet.xml

比如:下面的配置后,配置文件名只能是:springmvc-servlet.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!--
    / 拦截除了 jsp 之外的所有的请求
    /* 拦截所有请求,包括 jsp
  -->
</web-app>

4. 新建配置文件

新建 springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!--配置扫描-->
    <context:component-scan base-package="com.wdzl"/>

    <!--配置视图解析器 IRVR-->
    <!--
      "index" 逻辑名
      ==  /WEB-INF/jsp/index.jsp
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

5. 编写控制器

package com.wdzl.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    /*
    * 返回值就是跳转的目标页面的逻辑名
    * */
    @RequestMapping("index")
    public String hello(){
        System.out.println("========hello()=========");
        return "index";
    }
}

6. 部署到tomcat 运行

7. 运行异常

当前部署完成,运行 tomcat 并访问控制器时,会抛出异常

java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.jav

解决办法:

原因:默认 maven 依赖的 jar 包,默认情况下,不会打包到部署的项目中去的。正常的情况下,应该在 /WEB-INF/lib 下部署所有的jar包

解决步骤:

  1. File- Project Structs

然后选中所有的依赖后,右键,选中 Put into /:

选中完成后的效果如图:

再次运行,问题解决!!!

a. 新建dispatcher-servlet.xml文件

默认命名规则:-servlet.xml , servletname指的是 web.xml中Servlet配置的命名

b.如果不是默认规则,需要web.xml中配置初始化参数

<servlet>
    <servlet-name>xxxx</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>xxxx</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

​ 如果默认情况下,上面配置默认命名 xxxx-servlet.xml

​ c. 配置springmvc的配置文件

​ 开启包扫描

<context:component-scan base-package="com.wdzl"></context:component-scan>

​ 视图解析器配置

<!--视图解析器-->
<bean id="viewRelover" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

​ d. 新建控制器,输出 “Hello,World!”

@Controller
public class HelloControler {

    @RequestMapping("/hello")
    public String hell(){
        System.out.println("==========hello world!=====");
        return "index";
    }
}

​ e.发布到tomcat ,启动,浏览器访问

​ http://127.0.0.1:8080/springmvc/hello

8. Spring6的踩坑

1. Spring6 + JDK17 + Tomcat9

异常信息( Spring6 + JDK17 + Tomcat9):

   java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpServlet
       java.base/java.lang.ClassLoader.defineClass1(Native Method)
       java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
         jakarta/servlet/http/HttpServlet 

原因:

在Tomcat9和之前版本,不支持,支持的是 javax.servlet 从Tomat10开始,支持jakarta/servlet/http/HttpServlet

解决办法:

解决办法:Spring5+jdk11+tomcat9 通过降低版本来解决

2. Spring6 + JDK17 + Tomcat10

异常信息:

java.lang.NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTag
   java.base/java.lang.ClassLoader.defineClass1(Native Method)
   java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
   java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
   org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2489)
   org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
   org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)

解决办法:

  • 第一种方式:下载jakarta.servlet.jsp.jstl-api-3.0.0.jar 直接拷贝到 Tomcat10 中,部署到 Tomcat10 中的项目就可以正常运行了 但是,工作空间中源代码报编译错误,不能识别到关联的 jar
  • 第二种方式:添加依赖
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>2.0.0</version>
        </dependency>
    在 JSP 中就可以识别 JSTL 了,而且也可以部署到 Tomcat10 正常运行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/477025.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读:Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models

Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models 论文链接 代码链接 这篇文章提出了Forget-Me-Not (FMN)&#xff0c;用来消除文生图扩散模型中的特定内容。FMN的流程图如下&#xff1a; 可以看到&#xff0c;FMN的损失函数是最小化要消除的概念对应的…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞复现(CVE-2024-2620、CVE-2024-2621)

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任…

java获取数据库信息为空解决方案

问题&#xff1a;1.可能的解决方法一2.可能的解决方法二3.可能的解决方法三4.可能的解决方法四5.可能的解决方法五&#xff08;我自己问题的解决方案&#xff09;总结 问题&#xff1a; 刚发现这个问题的时候还是在进行插入数据操作的时候&#xff0c;发现报错。 报错的原因是因…

java项目将静态资源中的文件转为浏览器可访问的http地址

新增一个类叫啥无所谓&#xff0c;主要是实现 WebMvcConfigurer 加上注解 Configuration项目启动时加入bean中 只操作addResourceHandlers这一个方法 其他都没用 文章下方附带一个简易的上传图片代码 package cn.exam.config;import org.springframework.context.annotati…

155.乐理基础-和弦固定标记法(四)加音(add)和弦六和弦意义之二

如果到这五线谱还没记住还不认识的话去看102.五线谱-高音谱号与103.五线谱-低音谱号这两个里&#xff0c;这里面有五线谱对应的音名&#xff0c;对比着看 如果一章没落下&#xff0c;看到这里&#xff0c;但是看不懂什么意思&#xff0c;那就强行下看&#xff0c;看着看着指不…

Vue+SpringBoot在线教育考试及管理平台开发(纯原创)后续还在开发,会持续更新

登录页面设计 登录页面设计思路-分为三个角色进行登录&#xff0c;分别为学生&#xff0c;教师&#xff0c;管理员。 前端将登录设计为表单形式&#xff0c;通过选项组件绑定角色参数&#xff0c;向后端传递角色信息&#xff0c;通过表单绑定向后端传递登录者所有信息 <div …

js中filter处理后端返回表格数据

<template><div><el-table:data"tableData"style"width: 100%"><el-table-column:formatter"tranForm"prop"gender"label"性别"width"180"></el-table-column><el-table-column…

K8S Storage

概述 一般情况下&#xff0c;K8S中的Pod都不应该将数据持久化到Pod中&#xff0c;因为Pod可能被随时创建和删除&#xff08;扩容或缩容&#xff09;&#xff0c;即便是StatefulSet或Operator的Pod&#xff0c;也都不建议在Pod里存放数据&#xff0c;可以将数据持久化到Host上。…

构建以太网交换网络——(以太网基础与VLAN配置实验)

实验介绍 关于本实验 以太网是一种基于CSMA/CD&#xff08;Carrier Sense Multiple Access/Collision Detection&#xff09;的共享通讯介质的数据网络通讯技术。当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。通过交换机实现LAN互连虽然…

小程序云开发实战:通用企业产品信息展示小程序

之前做小程序都是自己搭建数据管理后台&#xff0c;比如我之前做的小程序&#xff1a;一搜就学&#xff0c;就是使用java来做管理后台&#xff0c;小程序做前端展示。但是对于简单的小程序来说&#xff0c;做一套管理后台有点拿大炮打蚊子&#xff0c;所以使用云开发就是不错的…

怎样修改grafana的Loading picture和加载的文本

登录装了grafana的linux机器 command “sudo vi /usr/share/grafana/public/views/index.html”&#xff0c;编辑配置文件。 找到.preloader__logo更改background-image. 这里可以是个url也可以是个路径。 如果想要更改加载的文字.可以更改 的内容 改完:wq保存以后退出&…

Leetcode热题100:图论

Leetcode 200. 岛屿数量 深度优先搜索法&#xff1a; 对于这道题来说&#xff0c;是一个非常经典的图的问题&#xff0c;我们可以先从宏观上面来看问题&#xff0c;也就是说在不想具体算法的前提下&#xff0c;简单的说出如何找到所有的岛屿呢&#xff1f; 如图中所示&#x…

在 MacOS 中安装

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;在基于 Android 相机预览的 CV 应用程序中使用 OpenCL 下一篇&#xff1a;基于ARM 的Linux系统的交叉编译 以下步骤已针对 MacOSX &#xff08;Mavericks&#xff09; 进行了…

NEC 78K系列MCU概述

一.初识 NEC MCU NEC&#xff0c;即日本电气株式会社&#xff0c; 经营半导体业务。 NEC 倡导“ ALL Flash”&#xff0c;即 MCU 内的程序存储器使用 Flash ROM。 为什么用 Flash ROM&#xff1f; 与掩膜 ROM 微控制器相比&#xff0c; Flash 微控制器加速了系…

开源表单设计器颗粒度级别控制表单的显示条件原理分析

表单渲染中, 有些表单的显示有不同条件, 比如需要上一个表单的开关打开,或者文本内容为 xxxx, 或者需要大于或等于或小于指定值, 或者需要选中某个选项, 或者需满足以上多个条件或在满足多个条件中的一个, 有 n 种场景选择, 这样就需要条件显示配置功能, 来满足多样化需求 预览…

【Django实战一】创建新项目

一、新建Project django-admin startproject 项目名称二、创建应用 1、创建应用 python manage.py startapp 应用名称应用创建后&#xff0c;项目的根目录下会生成对应应用名称的文件夹 2、注册应用 新创建的应用需要在settings.py中的INSTALLED_APPS中注册该应用 INSTALL…

Prompt-RAG:在特定领域中应用的革新性无需向量嵌入的RAG技术

论文地址&#xff1a;https://arxiv.org/ftp/arxiv/papers/2401/2401.11246.pdf 原文地址&#xff1a;https://cobusgreyling.medium.com/prompt-rag-98288fb38190 2024 年 3 月 21 日 虽然 Prompt-RAG 确实有其局限性&#xff0c;但在特定情况下它可以有效地替代传统向量嵌入 …

KW音乐搜索参数

声明&#xff1a; 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 逆向目标: …

基于SpringBoot+Layui的社区物业管理系统

项目介绍 社区物业管理系统是基于java程序开发,本系统分为业主和管理员两个角色 业主可以登陆系统,查看车位费用信息,查看物业费用信息,在线投诉,查看投诉,在线报修; 管理员可以车位收费信息,物业收费信息,投诉信息,楼宇信息,房屋信息,业主信息,车位信息,抄表信…

ArkTS编写的HarmonyOS原生聊天UI框架

简介 ChatUI&#xff0c;是一个ArkTS编写的HarmonyOS原生聊天UI框架&#xff0c;提供了开箱即用的聊天对话组件。 下载安装 ohpm install changwei/chatuiOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 接口和属性列表 接口列表 接…