当前位置: 首页 > news >正文

Spring MVC+mybatis 项目入门:旅游网(二) dispatcher与controller与Spring MVC

个人博客:Spring MVC+mybatis 项目入门:旅游网(二)dispatcher与controller与Spring MVC | iwts's blog

先看这个!

这是18年的文章,回收站里恢复的,现阶段看基本是没有参考意义的,技术老旧脱离时代(2024年辣铁铁)

如果你在找相关的内容,建议先自我反省一下为什么会搜这么old school的关键词,其次请直接上b站搜索Spricing boo+培训班,看最新的项目相关视频

MVC模式

        既然在使用Spring MVC,那么当然要了解什么是MVC模式。

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。                                                                                                                         ——来自百度百科

MVC模式的各种图网上也有很多了,这里就不说了,说明一下我理解的Spring MVC。

假设这个是祖国手办拼装场。肥宅对前台小姐姐说:给我一个蕾姆!前台小姐姐说ok,回头跟手办安装员说,给我一个蕾姆!手办安装员说ok,然后就需要从仓库中拿到蕾姆的各个组件。仓库管理员直接在仓库里面找,找到以后全部给手办安装员。手办安装员开始拼,拼好以后给前台小姐姐,前台小姐姐在给肥宅。

        这就是简单的一个逻辑,而也使用了MVC的思想。肥宅只用掏钱就行了,而前台小姐姐只负责传话,跟递手办。手办安装员哪里都不用去,只用安装手办就可以了,而仓库管理员负责在仓库里面手机零件,然后再给手办安装员。

        我们可以去理解,前台小姐姐就是V,或者说是浏览器,负责接收肥宅的需求并且反馈给手办安装员。手办安装员就是C,只负责吧手办拼出来。而M就是手办。刚开始就是一堆零件,在被C拼好以后运送到V,然后肥宅就能看见了。

        如果需要扩展一下,例如,不同的手办安装员精通某种类型的手办,因为肥宅的要求很高的,需要高达类的,就必须由高达安装员安装,而其他安装员不能安装。那么就需要多个C,同样,产品多了,就代表M多了。而前台小姐姐数量是不变的,增加前台实际上是多线程。

        这样,我们的MVC工厂就略显混乱,1个V,多个C,多个M。而不同的零件可能换放在不同的仓库里面。此时,我们可以升级为Spring MVC了。Spring MVC提供了dispatcher,中文是调度员。当然就是负责中间调度的人员。dispatcher放在前台小姐姐和手办安装员中间。而对于仓库的管理我们交给mybatis。获得了这样:

前台小姐姐还是很轻松的,传话就行了,具体这些话传给谁,全部由dispatcher来管理,dispatcher可以将需求传递给正确的安装员。安装员只用告诉mybatis需要什么就行了,mybatis就会自动找到具体的位置来把零件给安装员。

        这也是博主理解的Spring MVC。而这次项目也会基于此。

dispatcher的配置

        dispatcher是一个servlet。在没有框架的时候,利用jsp+servlet+javabean来完成MVC模式,我们就需要自己编写dispatcher。而现在Spring MVC已经封装好了dispatcher,我们直接使用就可以了。不过其本质还是servlet,所以我们应该在web.xml里面对其进行配置,声明我们要使用这个servlet。

<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

学过servlet,这里就很能看懂了。正因为如此,在标签<servlet-mapping>里面的<url-pattern>反而有些疑惑。为什么是“/”。其实就是字面意思,所有的请求全部映射到dispatcher。

        因为dispatcher也是前置控制器,就是所有的请求全部经过dispatcher,而且统一由dispatcher进行调度。所以,Spring MVC的核心就是dispatcher。而dispatcher的具体功能,包括IoC等全部被封装好了,我们根本不用考虑这些具体的实现,用就完事了。当然,关于IoC等内容太多了,文章就不多写,这个还是需要自己下去查,因为这些比较核心,也有点不太入门。

        现在,我们有了dispatcher,在web.xml里面的声明,Spring MVC就能知道:我们使用了dispatcher,并且对于所有的映射统统交给dispatcher来管理。那么我们当然也需要对dispatcher进行一些设置,配置dispatcher。

        dispatcher的配置文件也是xml文件,但是命名要求是固定的。web.xml中,<servlet-name>是什么,我们的xml文件命名就必须一致,例如有:<servlet-name>abcde</servlet-name>,那么我们dispatcher配置文件命名应该为:abcde-servlet.xml。这个一定要一致。idea在创建项目的时候已经默认给建好了,很爽啊。

        因为dispatcher是Spring MVC相当核心的部分,所以网上很多人也称其为Spring MVC配置文件。所以理解这个名词指的是什么就行,就是指dispatcher配置文件。

        里面具体配置什么,现在先不说,但是文件一定要创建好。

声明controller

        controller也是非常重要的,算是整个项目的核心部分。在Spring MVC2.0之前,我们都需要继承Controller类,通过重写一部分方法来完成controller的创建。这样其实非常麻烦,并且一个类只能实现一个请求。项目稍微大一点就非常冗杂。而现在,我们可以使用注解方式,来很简单地完成操作。此时,我们可以开始项目了。

        首先先来完成首页吧。我们想要进入首页,在逻辑上应该如何完成?假设我们有一个请求:getIndex.action。这表示我们想要获得一个首页。此时,我们需要写controller类:

package me.iwts.controller;import me.iwts.tools.ViewTool;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class ViewController {// 首页@RequestMapping("getIndex.action")public ModelAndView getIndex(){return new ModelAndView("/WEB-INF/view/index-test.jsp");}
}

我们对整个类的上面声明@Controller。这说明,这个类就是我们需要的controller,而其中的方法是针对具体的请求而进行具体的操作,用注解@RequestMapping()来表示,里面就是具体的操作。

        可以看到,@ReuqestMapping()注解是注释了具体的方法,说明这个方法处理了对应的请求。而其返回值ModelAndView就是指模型和视图。这个ModelAndView类可以自动封装视图和模型,并且返回到前端。这里我们new了一个ModelAndView类,而其内容,则是一个视图在服务器上的位置。这样我们就能返回这个视图了。

dispatcher如何找到controller

        上面,配置好了dispatcher,完成了controller。问题是我们应该如何让dispatcher找到controller。仅仅是一个@Controller注解就可以了么?当然是不对的,这里简单介绍一下扫描器。

        dispatcher扫描器,声明了一个域,dispatcher在寻找一些资源的时候,就去利用扫描器扫描。例如dispatcher获取了一个请求,就需要利用扫描器先扫描一下,如果发现这个类有@Controller注解,ok,就再去里面搜索其方法,如果碰见@RequestMapping声明跟请求一样,就运行方法体。

        当然,这里就理所当然需要在dispatcher里面配置,代码如下:

<context:component-scan base-package="me.iwts.controller" />

这样,就说明了去这个包下面扫描。

发起请求

        现在,小姐姐跟dispatcher就都就位了,就差肥宅了。这个问题有点蛋疼,获取首页这个请求由谁来发出。如果是一个真实的网站,我们需要访问其IP地址,然后就出来了首页。而tomcat的话,我们访问localhost:8080,就会默认跳转到规定的首页(这个需要自己配置tomcat的xml)默认就是WEB-INF下的index.jsp。那么我们在这里面调用就好了啊:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><jsp:forward page="/getIndex.action" /></body>
</html>

利用forward转发,发送一个请求,然后dispatcher捕获这个请求。然后依靠扫描器去controller包下面搜索,找到了具体的方法,然后就开始运行,同时返回了jsp页面。

利用view resolver来简化对视图的操作

        如果按照上面的写法,在返回view的时候,写的是一大串字符串,很麻烦其实。而我们可以通过配置view resolver来简化这个操作。这个是一个类,在Spring MVC规范中,称这些类为bean,我们现在需要这个bean,来完成对视图的处理。我们将所有的视图全部放在/WEB-INF/view/文件夹下,而我们的视图全部是jsp代码。

        而view resolver其实就是声明一次拼接,前缀是什么后缀是什么,处理以后,我们在代码里面就可以只写view的名字就好了。而view resolver在dispatcher里面的配置如下:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/view/" /><property name="suffix" value=".jsp" />
</bean>

prefix就是指前缀,suffix就是指后缀,这样,controller里面我们就可化简代码:

return new ModelAndView("index-test");

其实这样还是不好。我们需要视图的地方非常多,如果改一个文件的名字,就要改非常多。那么我们就可以写一个工具类,专门来控制这些视图的名字。例如ViewTool类:

package me.iwts.tools;public class ViewTool {public static final String INDEX = "index-test";public static final String LOGIN = "login-test";public static final String PROFILE = "profile-test";public static final String REGISTER = "register-test";public static final String REGISTER_SUCCESS = "register_success-test";public static final String ADMIN_CONSOLE = "admin_console-test";public static final String DETAILS = "details-test";public static final String ADD_SUCCESS = "add_success-test";public static final String TOURISM_CONSOLE = "tourism_console-test";public static final String MY_ORDER = "my_order-test";
}

这些静态变量,声明了具体的视图名字,这样controller也能化简为:

package me.iwts.controller;import me.iwts.tools.ViewTool;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class ViewController {// 首页@RequestMapping("getIndex.action")public ModelAndView getIndex(){return new ModelAndView(ViewTool.INDEX);}
}

很爽,这样jsp的名字随便改,我们只用在ViewTool类里面改一次就好了。

下一章链接

https://blog.csdn.net/iwts_24/article/details/84189601

相关文章:

Spring MVC+mybatis 项目入门:旅游网(二) dispatcher与controller与Spring MVC

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;二&#xff09;dispatcher与controller与Spring MVC | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代…...

深入了解数据库与Java数据类型映射

在数据库开发和Java编程中&#xff0c;理解不同数据类型之间的映射关系对于开发高效且可靠的应用程序至关重要。数据库和Java都有各自的一套数据类型系统&#xff0c;能够正确地映射这些数据类型有助于避免数据丢失、性能问题以及其他潜在的错误。本文将详细探讨常见的数据库数…...

深刻解析 volatile 关键字和线程本地存储ThreadLocal

1.volatile关键字在Java多线程编程中的重要性 在多线程编程中&#xff0c;volatile关键字扮演着至关重要的角色&#xff0c;它确保了变量在多个线程间的可见性&#xff0c;并且能防止指令重排序&#xff0c;从而达到线程安全的目的。 1.1 保证多线程环境下变量的可见性 在Ja…...

羧甲基纤维素钠(CMC-Na)市场规模不断增长 我国生产企业众多

羧甲基纤维素钠&#xff08;CMC-Na&#xff09;市场规模不断增长 我国生产企业众多 羧甲基纤维素钠&#xff08;CMC-Na&#xff09;又称CMC-钠&#xff0c;化学式为[C6H7O2&#xff08;OH&#xff09;2OCH2COONa]n&#xff0c;是一种离子型纤维素醚。CMC-Na外观呈白色颗粒状或纤…...

网红郭有才是怎么火起来的

网红郭有才的爆火主要归因于以下几个因素&#xff1a; 独特的个人魅力与风格&#xff1a;郭有才以其地道的乡土气息和个人的朴实无华赢得了观众的喜爱。他的视频内容展现了真实且接地气的生活场景&#xff0c;给人以亲切感。同时&#xff0c;他的幽默感也是吸引观众的一个重要因…...

小米8SE刷root(面具)

首先准备好一根数据线&#xff0c;一部小米8SE手机&#xff0c;和一台电脑 接下来需要的软件我会给出链接和使用方法&#xff0c;以及分享我遇到的困难和解决方案 下面操作不会的&#xff0c;可以参考这个博主的教程&#xff0c;我也是跟着这个教程刷好的 第一步解锁BL 开启开…...

如果创办Google

本文是一篇演讲稿&#xff0c;来自于《黑客与画家》一书的作者保罗*格雷厄姆&#xff0c;被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲&#xff0c;内容是关于如果他们将来想创立一家创业公司&#xff0c;现在应该做些什么。很多学校认为应该向学生们传授一些有关…...

邦芒职场:揭秘影响你职场收入的九大细节

在职场这个大舞台上&#xff0c;微小的细节往往能决定你收入的多少。以下九大细节&#xff0c;是你职场成功的关键&#xff0c;不容忽视。 1. 形象塑造 在这个注重第一印象的时代&#xff0c;良好的形象是你的第一张名片。精致的妆容、得体的着装&#xff0c;不仅能为你加分&a…...

Petalinux 制作ZYNQ镜像文件流程

1概述 在Zynq-7000 SoC中搭建运行Linux&#xff0c;嵌入式软件栈。 处理器系统引导是一个分两个阶段的过程。第一个阶段是一个内部 BootROM&#xff0c;它存储 stage-0 的引导代码。BootROM 在 CPU 0 上执行&#xff0c;CPU 1 执行等待事件&#xff08;WFE&#xff09;指令。…...

99%的人都不知道,微信才是真正的学习神器

微信&#xff0c;作为一款全球最受欢迎的社交应用之一&#xff0c;除了聊天、朋友圈、小程序等功能外&#xff0c;还有许多隐藏的学习功能&#xff0c;今天小编就给大家分享10个微信隐藏的学习功能&#xff0c;助您轻松成为学霸。 1、微信笔记 用过代办清单软件的朋友都知道&…...

加速模型训练 GPU cudnn

GPU的使用 在定义模型时&#xff0c;如果没有特定的GPU设置&#xff0c;会使用 torch.nn.DataParallel 将模型并行化&#xff0c;充分利用多GPU的性能&#xff0c;这在加速训练上有显著影响。 model torch.nn.DataParallel(model).cuda() cudnn 的配置&#xff1a; cudnn.…...

《python编程从入门到实践》day40

# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug&#xff1a; The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …...

IO多路复用学习笔记

参考资料&#xff1a; 视频1 视频2&#xff08;本人B站也有发布&#xff09; 视频3 参考笔记 参考博客...

Ubuntu设置中文输入法教程

在Ubuntu中设置中文输入法非常简单&#xff0c;只需按照以下步骤操作即可。 打开“设置”菜单。在Ubuntu的左上角点击“活动”按钮&#xff0c;然后在弹出的菜单中选择“设置”图标。 进入“区域和语言”设置。在设置菜单中&#xff0c;找到并点击“区域和语言”选项。 添加中…...

机器学习之爬山算法(Hill Climbing Algorithm)

爬山算法(Hill Climbing Algorithm)是一种简单而常见的启发式搜索算法,通常用于解决优化问题。它的基本思想类似于登山过程中爬升到山顶的过程,即从一个起始点开始,不断尝试向邻近的点移动,直到找到一个局部最优解。 下面是爬山算法的基本工作流程: 初始化:选择一个初…...

LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…...

Linux中ftp配置

一、ftp协议 1、端口 ftp默认使用20、21端口 20端口用于建立数据连接 21端口用于建立控制连接 2、ftp数据连接模式 主动模式&#xff1a;服务器主动发起数据连接 被动模式&#xff1a;服务器被动等待数据连接 二、ftp安装 yum install -y vsftpd #---下…...

BWVS 靶场测试

一、PHP弱类型 is_numeric() 输入&#xff1a;127.0.0.1/BWVS/bug/php/code.php # 1、源代码分析 如果num不是数字&#xff0c;那么就输出num&#xff0c;同时如果num1&#xff0c;就输出flag。即num要是字符串又要是数字 # 2、函数分析&#xff1a; is_numeric()函数&…...

c++ 里重解释转换之于引用 reinterpret_cast< long >

今天遇到了这一很新奇的写法。模糊中记得王老师也这么讲过。c 里四大转换。把数据重解释为原来数据的引用。虽然也可以直接定义对变量的引用。测试如下&#xff1a; 咱们从反汇编再了解下 c 编译器是怎么处理这种写法的&#xff1a; 谢谢...

JAVASE2

封装的步骤&#xff1a; 1、所有属性私有化&#xff0c;使用private关键字进行修饰&#xff0c;private表示私有的&#xff0c;修饰的所有数据只能在本类中访问 2、对外提供简单入口&#xff1a;比如说被private修饰的成员变量&#xff0c;在其他类中只能通过getXxx/setXxx方法…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...