javaee实验:MVC 框架技术应用——URL 映射及方法参数的使用

目录

  • url
  • mvc框架
    • mvc框架的设计
    • mvc流程
  • 实验目的
  • 实验内容
  • 实验过程
    • 创建项目
    • 创建项目结构
    • 编写代码
    • 简单测试一下

url

和 Hypertext 以及 HTTP 一样,URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制

URL 代表着是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。而在实际中,也有一些例外,最常见的情况就是一个 URL 指向了不存在的或是被移动过的资源。由于通过 URL 呈现的资源和 URL 本身由 Web 服务器处理,因此 web 服务器的拥有者需要认真地维护资源以及与它关联的 URL

mvc框架

MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。
1、视图

    视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。

2、模型

     模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉你按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难。对一个开发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。

3、控制

    控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳
2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息
3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果

这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级

mvc框架的设计

mvc框架运行的流程图
在这里插入图片描述
处理请求先到达控制器(Controller)、控制器的作用是进行请求分发,这样它会根据请
求的内容去访问模型层(Model);在现今互联网系统中,数据主要从数据库和 NoSQL 中来,
而且对于数据库而言往往还存在事务的机制,为了适应这样的变化,设计者会把模型层再细
分为两层,即服务层(Service)和数据访问层(DAO);当控制器获取到由模型层返回的数
据后,就将数据渲染到视图中,这样就能够展现给用户

mvc流程

Spring MVC 的流程是围绕 DispatcherServlet 而工作的。在 DispatcherServlet 的基础上,
还存在其他的组件
Spring MVC 运行全流程图。严格说,Spring MVC 处理请求并非一定要经过全流程,有时
候一些流程并不存在。例如,我们加入@ResponseBody 时,是没有经过视图解析器和视图渲染的
spring mvc全流程
在这里插入图片描述
1)在 Web 服务器启动的过程中,如果在 Spring Boot 机制下启用 Spring MVC,它就开
始初始 化 一 些 重 要 的 组 件 , 如 DispatcherServlet 、 HanderAdapter 的 实 现 类
RequestMappingHanderAdapter 等组件对象。注解@Controller 表明是一个控制器,然后
@RequestMapping 代表请求路径和控制器(或其方法)的映射关系,它就会在 Web 服务器
启动 Spring MVC 时,自动被扫描到 HanderMapping 的机制中存储。
2)在用户发起请求被 DispatcherServlet 拦截后,通过 URL 和其他的条件,通过
HanderMapping 就能找到对应的控制器(或者方法)进行响应。通过 HanderMapping 返回的
是一个 HanderExecutationChain 对象,HanderExecutationChain 对象包含了一个处理器
(Hander),处理器包含了控制器方法的逻辑,此外还有处理器的拦截器,通过拦截器进一
步增强处理器的功能。
3)得到了处理器,还要去运行。要处理的请求有多种:HTTP 请求,也有按 BeanName
的请求,所以需要一个适配器去运行 HanderExecutationChain 对象包含的处理器,这就是
HanderAdapter 接口定义的实现类 HttpRequestHanderAdapter 。通过请求的类型,
DispatcherServlet 就会找到它来执行 Web 请求的 HanderExecutationChain 对象包含的内容,
这样就能够执行我们的处理器(handler)了。
4)在处理器调用控制器时,它首先通过模型层得到数据,再放入数据模型中,最后将
返回模型和视图(ModelAndView)对象。下面代码控制器返回的视图名称为“user/details”,
这样就走到了视图解析器(ViewResolver),去解析视图逻辑名称了。

@Controller
@RequestMapping("/user")
public class MyController {
// 注入用户服务类
@Autowired
private IUserService userService;// 按id查询显示结果, 展示用户详情,展示结果 jsp视图
// URL地址: http://localhost:8080/user/details?id=3
@RequestMapping("/details")
public ModelAndView details(Integer id) {
3
// 访问模型层得到数据
User user = userService.getUser(id);
// 模型和视图
ModelAndView mv = new ModelAndView();
// 定义模型视图
// 视图路径:application.property文件中设置
spring.mvc.view.prefix=/WEB-INF/jsp/
// 视图名称: user/details.jsp
mv.setViewName("user/details");
// 加入数据模型
mv.addObject("user", user);
// 返回模型和视图
return mv;
}
}

为了定制 InternalResourceViewResolver 初始化,可以在配置文件 application.properties
中进行配置。通过 application.properties 定制 InternalResourceViewResolver 初始化:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
通过修改这样的配置,就能在 Spring Boot 的机制下定制 InternalResourceViewResolver
这个视图解析器的初始化,也就是在返回视图名称之后,它会以前缀(prefix)和后缀(suffix)
以及视图名称组成全路径定位视图。例如,控制器中返回的是“user/details”,那么它
就会找到/WEB-INF/jsp/user/details.jsp 作为视图 。严格地说,这一步也是必须的,因为有些
视图并不需要返回逻辑名称。在不需要的时候,就不再需要视图解析器工作了。
5)视图解析器定位到视图后,视图的作用是将数据模型(Model)渲染,这样就能够
相应用户的请求。这一步就是视图将数据模型渲染(View)出来,用来展示给用户看。
程序清单:/WEB-INF/jsp/user/details.jsp
<%@ page pageEncoding=“UTF-8”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>

<html><head><title>用户详情</title></head><body><div align="center"><table border="1"><tr><td>标签</td><td></td></tr><tr><td>用户编号</td><td><c:out value="${user.id}"></c:out></td>
4</tr><tr><td>用户名称</td><td><c:out value="${user.userName}"></c:out></td></tr><tr><td>用户备注</td><td><c:out value="${user.note}"></c:out></td></tr></table></div></body>
</html>

注意:控制器里绑定数据模型的时候,属性名称为 user,而属性为 User 对象,所以就
有了${user.id}代表 User 对象的 id 属性。。。,这样就能够将数据模型的数据渲染到 JSP 视图上
来展示用户详情给请求。
Spring Boot 启动后,运行得到如下日志:
Mapped “{[/user/details]}” onto public
org.springframework.web.servlet.ModelAndView
com.springmvc.chapter03.controller.MyController.details(java.lang.Integ
er)
这说明我们配置的@RequestMapping 的请求映射已经在服务器启动时被扫描到了
Spring 上下文中,所以当请求来到时就可以匹配到对应的控制器去提供服务
通过请求 http://localhost:8080/user/details?id=3 以及 HanderMapping 的匹
配机制就可以找到处理器提供服务。而这个处理器则包含我们开发的控制器,那么进入控制
器后,它就执行控制器的逻辑,通过模型和视图(ModelAndView)绑定了数据模型,而且
把视图名称修改为“user/details”,随后返回。
有时候,我们需要的只是 JSON 数据集,因为目前前后台分离,使用 JSON 已经是主流方
式,使用@ResponseBody 标注。也可以用 MappingJackson2sonView 转换出 JSON。代码
清单。
// 按id查询显示结果, 展示用户详情 ,展示结果 Json格式
// URL地址: http://localhost:8080/user/detailsForJson?id=3
@RequestMapping(“/detailsForJson”)
public ModelAndView detailsForJson(Integer id) {
// 访问模型层得到数据
User user = userService.getUser(id);
5
// 模型和视图
ModelAndView mv = new ModelAndView();
// 生成JSON视图
MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
mv.setView(jsonView);
// 加入模型
mv.addObject(“user”, user);
return mv;
}
在 控 制 器 的 方 法 中 模 型 和 视 图 ( ModelAndView ) 中 捆 绑 了 JSON 视 图
(MappingJackson2JsonView)和数据模型(User)对象,然后返回,其结果也会转变为 JSON。
执行流程:JSON 视图是没有视图解析器的定位视图的,因为它不是一个逻辑视图,只
是需要将数据模型(这里是 User 对象)转换为 JSON 而已
在spring mvc流程中使用JSON视图
在这里插入图片描述

实验目的

(1) 掌握 Spring MVC 框架运行流程
(2) 掌握 Spring MVC 项目开发流程
(3) 掌握 URL 映射及方法参数的使用方法

实验内容

(1) 学会在 Spring Boot 中开发 Spring MVC 项目——Spring Boot 对 JSP 的支持
(2) 掌握 URL 映射及其方法参数的使用方法

实验过程

创建项目

打开idea,建立一个新项目
使用spring向导,选择合适的java版本
在这里插入图片描述
点击下一步
选择spring web和thymeleaf这两个坐标
在这里插入图片描述
点击创建
检查pom中是否引入了项目
在这里插入图片描述
可以通过查看idea右侧的meaven是否有勾选的内容
在这里插入图片描述
或者自动生成的主程序中的注解没有报错就可以说明坐标起了效果,没有问题

创建项目结构

在这里插入图片描述

编写代码

UserController

import com.example.springmvctest.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;public class UserController {@RequestMapping(value = "/insert",method = RequestMethod.GET)public String insertUser(Model model){User user = new User();user.setId("1");user.setName("insert");model.addAttribute("user",user);return "index";  //返回视图的名称-}@RequestMapping(value = "/update",method = RequestMethod.GET)public String updateUser(Model model){User user = new User();user.setId("1");user.setName("update");model.addAttribute("user",user);return "index";  //返回视图的名称-}@RequestMapping(value = "/delete",method = RequestMethod.GET)public String deleteUser(Model model){User user = new User();user.setId("1");user.setName("delete");model.addAttribute("user",user);return "index";  //返回视图的名称-}@RequestMapping(value = "/find", method = RequestMethod.GET)public String findUser(Model model){User user = new User();user.setId("1");user.setName("find");model.addAttribute("user",user);return "index";  //返回视图的名称-}
}

User

import lombok.Data;@Data
public class User {private String id;private  String name;
}

SpringMvcTestApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringMvcTestApplication {public static void main(String[] args) {SpringApplication.run(SpringMvcTestApplication.class, args);}}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">//命名空间
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>首页</h1>
<h1 th:text="${user.getName()}">测试</h1></body>
<!--<!DOCTYPE html>-->
<!--<html lang="zh">-->
<!--<head>-->
<!--    <meta charset="UTF-8">-->
<!--    <title>用户管理</title>-->
<!--</head>-->
<!--<body>-->
<!--<h1>用户管理</h1>-->
<!--<form action="/insert" method="post">-->
<!--    <p>添加用户</p>-->
<!--    <label for="id">ID:</label>-->
<!--    <input type="text" id="id" name="id" required>-->
<!--    <label for="name">姓名:</label>-->
<!--    <input type="text" id="name" name="name" required>-->
<!--    <input type="submit" value="添加">-->
<!--</form>-->
<!--<form action="/update" method="post">-->
<!--    <p>更新用户</p>-->
<!--    <label for="id">ID:</label>-->
<!--    <input type="text" id="id" name="id" required>-->
<!--    <label for="name">姓名:</label>-->
<!--    <input type="text" id="name" name="name" required>-->
<!--    <input type="hidden" name="_method" value="put">-->
<!--    <input type="submit" value="更新">-->
<!--</form>-->
<!--<form action="/delete" method="post">-->
<!--    <p>删除用户</p>-->
<!--    <label for="id">ID:</label>-->
<!--    <input type="text" id="id" name="id" required>-->
<!--    <input type="hidden" name="_method" value="delete">-->
<!--    <input type="submit" value="删除">-->
<!--</form>-->
<!--<form action="/find" method="get">-->
<!--    <p>查找用户</p>-->
<!--    <label for="id">ID:</label>-->
<!--    <input type="text" id="id" name="id" required>-->
<!--    <input type="submit" value="查找">-->
<!--</form>-->
<!--<div id="result">-->
<!--    <p>用户信息</p>-->
<!--    <h1 th:text="${user.getName()}">测试</h1>-->
<!--</div>-->
<!--</body>-->
<!--</html>-->

简单测试一下

在这里插入图片描述

以上。

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

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

相关文章

智能优化算法应用:基于JAYA算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于JAYA算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于JAYA算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.JAYA算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

循环神经网络RNN及其变体LSTM、GRU

1. 背景 RNN(Recurrent Neural Networks) CNN利用输入中的空间几何结构信息&#xff1b;RNN利用输入数据的序列化特性。 2. SimpleRNN单元 传统多层感知机网络假设所有的输入数据之间相互独立&#xff0c;但这对于序列化数据是不成立的。RNN单元用隐藏状态或记忆引入这种依赖…

六、三台主机免密登录和时钟同步

目录 1、免密登录 1.1 为什么要免密登录 1.2 免密 SSH 登录的原理

TeXworks 初次使用 debug方法

下载Texlive&#xff0c;打开TeXworks editor 编译排版&#xff0c;可能会报很多错&#xff1a; 1. ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or (fontspec) LuaTeX. (fontspec) (fontspec) …

C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

目录 一、成员访问 1、[ ]&at 2、front( )&back( ) 二、插入元素 三、删除元素 四、替换元素 五、查找元素 1、查找第一次出现位置 2 、在指定范围内查找 六、交换字符串 七、c_str 八、rfind&substr 一、成员访问 1、[ ]&at 虽然二者功能一样&…

数据结构奇妙旅程之顺序表和链表

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

C++-内联函数

目录 一.什么是内联函数 1.内联函数的概念 2.内联函数的定义 二.C中引入内联函数的原因 三.什么样的函数适合被声明为内联呢&#xff1f; 四.面试题 一.什么是内联函数 1.内联函数的概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开…

springboot 2.4.4集成 hikari连接池多数据源实例

文章目录 前言一、配置步骤1.1 pom配置1.2 application.properties配置1.3 DataSourceContextHolder类1.4 DynamicDataSource1.5 DataSourceconfig类配置1.6 配置TargetDataSource注解1.7 切面方法1.8 dao的写法 二、测试验证2.1 启动springboot项目2.2 检查数据库连接2.3 debu…

python——进程常用功能

Python的multiprocessing模块提供了强大的并行处理能力&#xff0c;以下是几个功能的详细解释&#xff1a; join(): 在multiprocessing中&#xff0c;join方法用于阻塞主进程直到指定的进程终止。这对于确保所有子进程在程序结束前完成其工作是很有用的。deamon(): 在multipro…

基于51单片机的十字路口交通灯_5s黄灯倒计时闪烁

基于51单片机十字路口交通灯_5s黄灯闪烁 &#xff08;程序仿真仿真视频&#xff09; 仿真&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;J006 功能要求 交通灯运行状态&#xff1a; &#xff08;1&…

硬件基础:二极管

基本定义 二极管的内部其实就是一个PN结。 把PN结封装起来&#xff0c;两边加上两个电极&#xff0c;就组成了半导体二极管。简称二极管&#xff08;Diode&#xff09; 二极管和PN结一样&#xff0c;具有单向导通性&#xff1a; 外观和正负极 常见芯片封装如下&#xff1a; 一般…

java 工具类: CompareUtils(比较对象字段值变化)

一、前言 我们在工作中&#xff0c;可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面&#xff0c;记录每次修改的变化。我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化, 这样我们就可以知道数据做了哪些改变. 二、条件限制 在写这个通用…

ImportError: cannot import name ‘metadata‘ from ‘importlib‘

yolov8 编译问题 ImportError: cannot import name ‘metadata’ from ‘importlib’ 将 from importlib import metadata 更改为 import importlib_metadata as metadata

【WinForm.NET开发】创建 Windows 窗体应用

本文内容 创建项目创建应用程序运行应用程序 本文演示创建一个具有基于 Windows 的用户界面 (UI) 的简单 C# 应用程序。 1、创建项目 首先&#xff0c;创建 C# 应用程序项目。 项目类型随附了所需的全部模板文件&#xff0c;无需添加任何内容。 打开 Visual Studio。在“开…

vs 安装 qt qt扩展

1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2

【设计模式-4.1】行为型——观察者模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;观察者模式&#xff1b; 商家与顾客 观察者模式属于行为型设计模式&#xff0c;关注对象的行为。以商家与顾客为例&#xff0c;商家有商品&#xff0c;顾客来购买商品&#xff0c;如果商家商品卖完了&#…

Vue+ElementUI+C#前后端分离:监控长耗时任务的实践

想象一下&#xff0c;我们正在构建一个Web应用&#xff0c;需要实现一个数据报告的导出功能。这听起来很简单&#xff0c;不是吗&#xff1f;但是&#xff0c;随着深入开发&#xff0c;我们意识到导出过程比预期的要复杂和耗时得多。由于报告的数据量巨大&#xff0c;后端需要花…

PostgreSQL有意思的现象:支持不带列的表

1、前言 以前从没有试过建一张表&#xff0c;不带任何列。在PG中却支持这种语法。这是个什么鬼? 最近&#xff0c;把PG源码扒了下&#xff0c;简单浏览了下最近的一些merge。其中有一个fix&#xff1a; eeb0ebad79 ("Fix the initial sync tables with no columns.&qu…

〖大前端 - 基础入门三大核心之JS篇㊺〗- 定时器和延时器

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

3D场景建模工具

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1. 什么是3D场景建模&#xff1f; 3D场景建模是一种通过计算机图形学技术&#xff0c;将现实世…