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

news2024/9/22 3:39:43

个人博客: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

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

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

相关文章

大规模团队的数据库开发,如何用OceanBase工具快速建立企业级账号体系

前言 为了让数据库开发的安全性与可靠性得以充分保障&#xff0c;数据库开发工具的管控能力显得尤为关键。构建一个健全的账号体系&#xff0c;能够协助开发团队实现对数据库开发工具的全方位管控&#xff0c;从而有效防范各类数据安全隐患&#xff0c;确保数据库开发的顺利进…

深度神经网络——什么是混淆矩阵?

概述 混淆矩阵是一种在机器学习和数据科学中广泛使用的分析工具&#xff0c;用于评估分类模型的性能。它通过比较实际类别和模型预测的类别来提供模型性能的详细信息。以下是混淆矩阵的一些关键点&#xff1a; 结构&#xff1a;混淆矩阵是一个表格&#xff0c;通常有两行两列&…

毫米波雷达模块在智能家居安全系统中的关键技术分析

随着智能技术的不断发展&#xff0c;智能家居已经成为了现代生活的一部分。而智能家居安全系统作为智能家居的重要组成部分&#xff0c;其功能不仅仅是对家庭进行监控和报警&#xff0c;更是通过各种感知技术对家庭安全进行全方位的保障。在智能家居安全系统中&#xff0c;毫米…

Go语言的中间件(middleware)是如何实现的?

文章目录 Go语言的中间件&#xff08;Middleware&#xff09;是如何实现的&#xff1f;中间件的工作原理中间件的实现步骤示例代码总结 Go语言的中间件&#xff08;Middleware&#xff09;是如何实现的&#xff1f; 在Go语言中&#xff0c;中间件&#xff08;Middleware&#…

C语言学习笔记之指针(一)

目录 什么是指针&#xff1f; 指针和指针类型 指针的类型 指针类型的意义 指针-整数 指针的解引用 指针 - 指针 指针的关系运算 野指针 什么是野指针&#xff1f; 野指针的成因 如何规避野指针&#xff1f; 二级指针 什么是指针&#xff1f; 在介绍指针之前&#…

使用Pyecharts构建Map对象无法显示颜色--解决

我们在做数据可视化的过程中&#xff0c;可能需要使用到地图作为数据可视化的工具&#xff1b; 包括世界地图、国家地图、省市区地图等&#xff1b; 如果在你设置好颜色数据匹配后&#xff0c;可视化地图未显示对应数据的颜色&#xff0c;那么请检查是否出现以下情况&#xf…

Hadoop运行wordcount实例任务卡在job running的多种情况及解决方法

第一种&#xff1a;配置问题 这是别人的图片&#xff0c;据楼主排查解决是因为hosts配置问题… 现象&#xff1a;各种无法运行、启动 解决办法&#xff1a; 1、修改日志级别 export HADOOP_ROOT_LOGGERDEBUG,console 查看下详细信息&#xff0c;定位到具体问题解决 第二种&…

【JavaSE】/*类和对象(上)*/

目录 一、什么是类&#xff0c;什么是对象 二、类和对象的关系 三、学习类和对象的目的 四、怎样创建一个类 4.1 语法形式 4.2 创建示例 示例一&#xff1a;日期对象 示例二&#xff1a;小狗对象 示例三&#xff1a;学生对象 4.3 注意事项 4.4 修改public修饰的主类…

Day06:Flex 布局

目标&#xff1a;熟练使用 Flex 完成结构化布局 一、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 二、浮动 1、基本使用 作用&#xff1a;让块元素水平排列。 …

如何学习计算机网络(超详细,方法论)

分享一下学习计算机网络的方法论 首先是看视频&#xff1a; 这里我推荐中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版》课程 课程目标_哔哩哔哩_bilibili 教材采用神书《计算机网络&#xff08;自顶向下方法&#xff09;》&#xff0c;授课风格更偏向实…

The view model in Acise

在FreeCAD中&#xff0c;借助于Boost Signals2实现了业务层、显示层的分层&#xff0c;但整个FreeCAD Gui层却采用了Coin3D进行渲染&#xff0c;很难进行在这方面进行扩展。 相较之下&#xff0c;在SALOME中&#xff0c;可以为不同的Module指定特定的ViewModel&#xff0c;支持…

uniapp App去除iOS底部安全区域白边

未设置的情况下&#xff0c;iOS底部安全区域白边 如图&#xff1a; 去除方法&#xff1a; 在 mainfest.json 中加入一下代码&#xff1a; "safearea" : {"bottom" : {"offset" : "none"} }, 去除效果展示&#xff1a;

翻译AnyDoor: Zero-shot Object-level Image Customization

摘要 本研究介绍了AnyDoor&#xff0c;这是一款基于扩散模型的图像生成器&#xff0c;能够在用户指定的位置&#xff0c;以期望的形状将目标对象传送到新场景中。与为每个对象调整参数不同&#xff0c;我们的模型仅需训练一次&#xff0c;就能在推理阶段轻松地泛化到多样化的对…

能找伴侣的相亲婚恋平台有哪些?6款值得信赖的恋爱交友软件体验测评

在这个超快节奏的社会里&#xff0c;好多人都忙着搞事业和搞钱&#xff0c;却把终身大事给忽略了。但是随着年龄越来越大&#xff0c;来自长辈和社会的压力也越来越大&#xff0c;因此网络上的相亲交友软件&#xff0c;就成了大多数单身贵族的脱单首选了。下面就来给大家讲讲我…

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

前言&#xff1a;有时候远程服务器的进程你想偷偷去围观一下有哪些&#xff0c;或者对一些比较调皮的进程进行封杀&#xff0c;或者对一些自己研发的服务进行远程手动启动或者重启等&#xff0c;又不想打开远程桌面&#xff0c;只想悄咪咪地执行&#xff0c;那也许下面的文章会…

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读&#xff1a;详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#xff09; MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…

《欢乐钓鱼大师》辅助:新手钓鱼全新攻略大全!

《欢乐钓鱼大师》是一款充满趣味和挑战的钓鱼游戏。在游戏中&#xff0c;玩家不仅可以体验钓鱼的乐趣&#xff0c;还可以通过不同的钓鱼竿和鱼卡来提升自己的钓鱼技能。为了帮助新手和老玩家更好地体验游戏&#xff0c;本文将为您提供详细的游戏攻略。 1. 游戏目标 在《欢乐钓…

window环境下QT5开发环境的搭建

1、安装visual Stusio 15 生成工具2012 2、安装Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安装完成之后&#xff0c; 修改&#xff1a;选择桌面调试&#xff0c;如下&#xff1a; 4、打开QTcreator&#xff0c;选项中&#xff0c;配置编译器&#xff…