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

news2024/11/14 12:09:08

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.coloradmin.cn/o/1537478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经纪人资格认证考试资料

一、名词&#xff1a; 1. 自然人、个体工商户、演出经纪人、演出经纪单位、演出市场主体、演出市场客体、 2. 营业执照、行政许可证 3. 居间、代理、行纪&#xff1a;演出经纪机构、个体经纪人分别有哪些权限&#xff1f; 4. 自行举办&#xff1a;文艺表演团体、个体演员&am…

Shell脚本学习-if循环

最小化的if语句 无实际用途 if [ ] ;then echo fi 脚本解释 if 判断 [ ] 里面的条件是否成立 后面跟then&#xff0c;代表条件成立 如果在一行则使用分号隔离&#xff08;;&#xff09; 如果不在一行使用则直接在下一行驶入then即可。 如果条件成立则输出echo 后面…

罐头鱼AI视频矩阵运营获客系统|视频批量混剪

智能化运营&#xff0c;助力视频营销——AI视频矩阵运营系统全面解析 随着数字营销时代的到来&#xff0c;视频已成为各行业推广和营销的重要手段之一。为了更好地管理和发布视频内容&#xff0c;我们推出了全新的AI视频矩阵运营系统&#xff0c;集成了多项智能功能&#xff0c…

张桥社区组织“平安大讲堂”企业应急救护及消防主题培训

为进一步加强园区商户的平安生产意识&#xff0c;提升应急救护能力&#xff0c;在襄阳市民政局的指导和支持下&#xff0c;襄阳市和时代社会工作服务中心依托襄阳市“光明谷”社会组织助力共同缔造项目&#xff0c;联合樊城区红十字会、樊城区点爱志愿者协会在张桥社区“美世界…

第十二届蓝桥杯省赛CC++ 研究生组

十二届省赛题 第十二届蓝桥杯省赛C&C 研究生组-卡片 第十二届蓝桥杯省赛C&C 研究生组-直线 第十二届蓝桥杯省赛C&C 研究生组-货物摆放 第十二届蓝桥杯省赛C&C 研究生组-路径 第十二届蓝桥杯省赛C&C 研究生组-时间显示 第十二届蓝桥杯省赛C&C 研究生组…

Unity---Lua语言

Lua Binaries Download 13.2 逻辑热更新——Lua1-3_哔哩哔哩_bilibili nil表示空 只有false和nil为false&#xff0c;其他值都为true ..连接两个字符串

基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情物资管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

阿里云2核4G云服务器ECS和轻量应用服务器价格表

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

TikTok新号必须做的3件事

根据互联网安全公司Cloudflare的2023年互联网流量回顾&#xff0c;TikTok超过谷歌成为2023年最受欢迎的网站。这意味着现在有大量用户在使用TikTok&#xff0c;在TikTok平台上&#xff0c;你可能会突然出名&#xff0c;可能会突然让您的营销获得回报。 但如果你是刚加入TikTok用…

【保姆级教程】YOLOv8_Track多目标跟踪,快速运行

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、下载测试视频&#xff0c;预训练权重 测试视频 链接&am…

【Review+预测】测试架构演进的曲折之路

文章目录 前言 一、“原始”阶段 二、“小打小闹”阶段 三、“小米加步枪”阶段 四、“摩托化部队”阶段 五、“骑兵连”阶段 六、“海军陆战队”阶段 七、“社区型组织”阶段 前言 近期公司的测试团队需要重新组织安排&#xff0c;本着谦虚谨慎的态度&#xff0c;我从…

人像抠图HumanSeg——基于大规模电话会议视频数据集的连接感知人像分割

前言 人像抠图将图像中的人物与背景进行像素级别的区分的技术。通过人像分割&#xff0c;可以实现诸如背景虚化、弹幕穿人等各种有趣的功能&#xff0c;为视频通话和影音观看提供更加优质和丰富的体验。由于广泛部署到Web、手机和边缘设备&#xff0c;肖像分割在兼顾分割精度的…

java动态规划学习笔记

学习笔记目录&#xff0c;这里记录个大纲&#xff0c;详情点链接 背包问题 01背包问题综述 01背包问题&#xff08;二维数组&#xff09;https://blog.csdn.net/m0_73065928/article/details/136794406?spm1001.2014.3001.5501 01背包问题&#xff08;滚动数组&#xff09…

KubeSphere的基本使用操作

KubeSphere的基本使用操作 基本使用用户角色创建企业空间创建项目 创建应用创建密钥创建MySQL密钥创建WordPress密钥 创建存储卷创建MySQL存储卷创建Wordpress存储卷 添加组件服务类型添加MySQL组件添加WordPress组件 访问Wordpress 基本使用 用户角色 KubeSphere 中的权限控制…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

C语言例3-26:逗号表达式的例子

逗号表达式&#xff1a; 表达式1&#xff0c;表达式2 表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式。 代码如下&#xff1a; #include<stdio.h> int main(void) {int i1,j;float f2.0f;char chb; //b(98)// printf(&…

【论文精读】DALLE3:Improving Image Generation with Better Captions 通过更好的文本标注改进图像生成

文章目录 一、文章概览二、数据重标注&#xff08;一&#xff09;现在训练数据的文本标注主要存在的问题&#xff08;二&#xff09;创建图像标注器&#xff08;三&#xff09;微调图像标注器 三、评估重新标注的数据集&#xff08;一&#xff09;混合合成标注和真实标注&#…

如何看待腾讯 QQ 浏览器抄袭 Arc

今天在 Reddit 的帖子上看到&#xff0c;QQ 浏览器抄袭了 Arc 而且还是 Arc 官方发布的 It looks very similar lol 看起来也太像了&#xff0c;笑死我了 稍微震惊了一下&#xff0c;带着疑惑&#xff0c;打开了 QQ 浏览器官网页 点击下载 ⬇️ 下载后打开 翻找了下&#xff0…

DBO优化LSBoost回归预测(matlab代码)

DBO-LSBoost回归预测matlab代码 蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法&#xff0c;在2022年底提出&#xff0c;主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 数据为Excel股票预测数据。 数据集划分为训练集、验证集、测试集,比…

力扣994. 腐烂的橘子(DFS)

Problem: 994. 腐烂的橘子 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义一个二维矩阵dp初始化每个元素值为矩阵的行数乘以列数&#xff1b;用于记录每个新鲜橘子距离第一个腐烂橘子的最早的腐烂时间&#xff1b; 2.遍历矩阵grid若当前橘子是腐烂的橘子&a…