SpringMVC | 使用Xml或注解进行开发

news2024/12/23 14:01:27

一、Spring MVC

简介

Spring MVC(全称 Spring Web MVC)是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架。

MVC架构

(1)示意图

(2)各层职责

  • Model:负责对请求进行处理,并将结果返回给 Controller

  • View:负责将请求的处理结果进行渲染,展示在客户端浏览器上

  • Controller:是 Model 和 View 交互的纽带;主要负责接收用户请求,并调用 Model 对请求处理,然后将 Model 的处理结果传递给 View

SpringMVC工作原理

(1)控件

DispatcherServlet(前端控制器)
负责拦截客户端请求并分发给其他组件,它是整个流程控制的中心,负责调度其他组件的执行,降低各组件之间的耦合,提升整体效率
HandlerMapping(处理器映射器)
负责根据客户端请求的URL寻找处理器,Spring MVC中提供了配置文件、注解等映射方式,这些映射方式将由相应的处理器映射器负责处理
Handler(处理器)
负责对客户端的请求进行处理,由开发者编写
HandlerAdapter(处理器适配器)
负责根据特定的规则对处理器进行执行,它可以执行多种类型的处理器,是设计模式中适配器模式的具体应用
ViewResolver(视图解析器)
负责视图解析,它可以将处理结果生成View(视图)并展示给用户
View(视图)
展示给用户看,由开发者编写

(2)原理

用户发送请求到前端控制器(DispatcherServlet)
前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)
找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)
前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
处理器适配器去执行Handler
处理器执行完给处理器适配器返回ModelAndView
处理器适配器向前端控制器返回ModelAndView
前端控制器请求视图解析器(ViewResolver)去进行视图解析
视图解析器向前端控制器返回View
前端控制器对视图进行渲染
前端控制器向用户响应结果

二、使用xml开发

配置前端控制器(web.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>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--初始化参数,读取配置文件,组装三个组件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动时自动加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- /  拦截 不包括jsp的其他请求-->
        <!-- /* 拦截 包括jsp的所有请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

配置映射器(springmvc-servlet.xml)
  • 方式一:BeanNameUrlHandlerMapping

    <!--BeanNameUrlHandlerMapping
        浏览器发送/user请求,在spring容器中找到id="/user"的对应实例-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean id="/user" class="com.app.xml.UserController"/>
  • 方式二:SimpleUrlHandlerMapping

    <!--SimpleUrlHandlerMapping
        在自己的实例中自定义一套映射规则properties(请求与实例id关系)
        浏览器发送/user请求,在property中找到key="/user"映射的id,然后在spring容器中找到id对应实例-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/user">userController</prop>
            </props>
        </property>
    </bean>
    <!--配置Controller-->
    <bean id="userController" class="com.app.xml.UserController"/>

配置适配器(springmvc-servlet.xml)
  • 方式一:SimpleControllerHandlerAdapter(要求我们编写的Controller继承Controller接口)

    <!--需要Controller继承Controller-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  • 方式二:HttpRequestHandlerAdapter(要求我们编写的Controller继承HttpRequestHandler接口)

    <!--需要Controller继承HttpRequestHandler-->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

配置视图解析器(springmvc-servlet.xml)
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

编写Controller
  • 继承Controller接口(使用了SimpleControllerHandlerAdapter适配器)

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class UserController implements Controller {
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) {
        ModelAndView modelAndView = new ModelAndView();
        // index即逻辑视图名,视图解析器会自动加上前缀(/)和后缀(.jsp),即 index -> /index.jsp
        modelAndView.setViewName("index");
        return modelAndView;
    }
}
  • 继承HttpRequestHandler接口(使用了HttpRequestHandlerAdapter适配器)

import org.springframework.web.HttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserController2 implements HttpRequestHandler {
    public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        System.out.println("UserController.handleRequest");
    }
}

编写index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>

运行tomcat服务器,使用浏览器访问

二、使用注解开发

添加自动扫包(springmvc-servlet.xml)
    <context:component-scan base-package="com.app.annotation"/>

编写Controller类
  • @Controller注解 —— 标识本类为Controller类,使Spring的IoC容器扫描到

  • @RequestMapping —— 请求映射,标识出浏览器访问的url路径

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

@Controller
@RequestMapping("user")
public class UserController {
    @RequestMapping(value = "func1")
    public ModelAndView func1() {
        return null;
    }
}

配置映射器和适配器(springmvc-servlet.xml)
  • 方式一:配置bean类

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
  • 方式二:配置<mvc:annotation-driven/>标签(推荐)

方法二除了自动配置方式一的bean类外,还添加了其他功能,利于后面的学习使用。

    <mvc:annotation-driven/>

配置前端控制器(web.xml)
  • 代码与使用xml开发相同

配置视图解析器(springmvc-servlet.xml)
  • 代码与使用xml开发相同

运行tomcat服务器,使用浏览器访问

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

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

相关文章

计算机SCI论文怎么发表?有哪些建议? - 易智编译EaseEditing

一般论文的水平是这样&#xff1a;普刊&#xff1c;核心&#xff1c;SCI。 不同的专业都可以发SCI&#xff0c;只是影响因子高低不用而已&#xff0c;有的领域分值高&#xff0c;有的偏低。 就是说不同领域SCI期刊&#xff0c;影响因子一样&#xff0c;但水平是一样的。 怎样…

三、元素操作

1、切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改&#xff0c;与Python中list的切片操作一样 ndarray数组可以基于0-n的下标进行索引&#xff0c;切片对象可以通过内置的slice函数&#xff0c;并设置start&#xff0c;stop及step参数进行&#xff0c;从原数组…

【Java寒假打卡】Java基础-反射

【Java寒假打卡】Java基础-反射概述获取Class对象的三种方式反射-获取Constructor对象利用Constructor数组创建对象获取Field对象反射获取成员变量并且使用反射获取成员对象反射获取成员对象并运行概述 Java反射机制&#xff1a;是在运行状态中&#xff0c;对于任意一个类&…

使用VS code快速搭建一个Golang项目

文章目录前言安装go语言环境了解Go开发相关的环境变量熟悉Go Module创建一个go项目项目迁移前言 VC code是一款巨好用的编辑器&#xff0c;使用vs code开发项目需要进行一些配置。项目中需要用到很多的包&#xff0c;无论是自己建的还是第三方的。由于go语言的生态环境没有jav…

【路由器连接天翼网关2.0问题解决思路】

文章目录一. 天翼网关如何切换新账号&#xff1f;背景操作流程1. 拔掉光纤2. 重置光猫3. 管理员页面进行认证4. 重新插上光纤&#xff0c;管理员页面会显示认证成功二、路由器连接光猫无网如何解决&#xff1f;背景操作流程1. 登陆普通管理员2. 获取超级管理员3. 登陆超级管理页…

SOLIDWORKS Electrical 2023新功能

电气工程师在完成电气原理图设计的同时&#xff0c;还需要频繁地修改、导出各报表&#xff0c;使得大量时间浪费在重复性的手动工作上。即便如此&#xff0c;也无法保证百分百准确无误&#xff1b;电气设计部门和机械设计部门虽然在设计同一产品&#xff0c;但不同部门之间互相…

云原生|kubernetes|2022年底cks真题解析(11-16)

前言&#xff1a; 接上一篇文章&#xff1a;云原生|kubernetes|2022年底cks真题解析&#xff08;1-10&#xff09;_晚风_END的博客-CSDN博客 2022年底的csk真题第二部分 11题到16题 十一&#xff0c; Trivy 扫描镜像安全漏洞 题目&#xff1a; Task 使用 Trivy 开源容器扫…

神奇的HTML系列专栏总目录

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2023/01/16&#x1f4c5; 最近更新时间&#xff1a;2023/01/16&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

《Linux性能优化实战》学习笔记 Day02

02 | 内存池&#xff1a;如何提升内存分配的效率&#xff1f; 原文摘抄 在 Linux 系统中&#xff0c;用 Xmx 设置 JVM 的最大堆内存为 8GB&#xff0c;但在近百个并发线程下&#xff0c;观察到 Java 进程占用了 14GB 的内存。为什么会这样呢&#xff1f; 绝大部分高级语言都…

【图论】「极简复习版」最短路径 Java/C++ 实现

文章目录Dijkstra —— 单源最短路讲解图解Java朴素使用堆优化C朴素使用堆优化Floyd —— 多源最短路讲解JavaCDijkstra —— 单源最短路 讲解 时间复杂度 朴素 Dijkstra&#xff1a;O(n2)O(n^2)O(n2) &#xff0c;nnn 是顶点数。堆优化 Dijkstra&#xff1a;O(mlogn)O(m\ l…

第五届字节跳动青训营 前端进阶学习笔记(三)CSS基本概念

文章目录前言CSS是什么1.CSS基本结构2.在面中使用CSS的方式3.CSS是如何工作的选择器1.通配选择器2.标签选择器3.id选择器4.类选择器5.属性选择器6.伪类选择器7.选择符颜色1.RGB颜色2.HSL颜色3.alpha透明度字体1.font-family2.font-size3.line-height4.text-align5.space6.text-…

从头搭建pytorch Docker镜像

目录前言正文从docker hub下载镜像创建容器并运行更新容器*安装python*安装anaconda安装pytorch参考文献&#xff1a;前言 此文不需要前言&#xff0c;请从正文开始 开始搭建 正文 默认大家都是有一定docker基础的&#xff0c;没有的话建议去花个20分钟学一下基础知识。相对…

如何利用极狐GitLab 轻松管理NPM依赖发布与更新?

本文来自&#xff1a; 任治桐 极狐(GitLab) 前端工程师 NPM 是 Node.js 的包管理工具&#xff0c;用来安装各种 Node.js 的扩展。本文将分享如何通过极狐GitLab&#xff0c;让 NPM 依赖发布更新更加快速和自动化&#xff0c;让你轻松管理依赖&#xff0c;拥有更多时间专注于核…

【Java|golang】1814. 统计一个数组中好对子的数目

给你一个数组 nums &#xff0c;数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) 321 &#xff0c; rev(120) 21 。我们称满足下面条件的下标对 (i, j) 是 好的 &#xff1a; 0 < i < j < nums.length nums[i] rev(…

算法之美~时间复杂度

时间复杂度 时间复杂度的全称是渐进时间复杂度&#xff0c;表示算法的执行时间与数据规模之间的增长关系1、只关注循环执行次数最多的一段代码2、加法法则&#xff1a;总复杂度等于量级最大的那段代码的复杂度3、乘法法则&#xff1a;嵌套代码的复杂度等于嵌套内外代码复杂度的…

文末有福利 | 零代码连接邮箱腾讯云企业网盘,附件管理超轻松

在日常工作中&#xff0c;想必大家每天都会收到各种各样的工作邮件&#xff0c;并且很多重要的文件材料也是通过邮件附件的形式来传输的&#xff0c;那么如何一站式管理这些文件&#xff0c;对于提高办公效率就至关重要了。关于邮件附件&#xff0c;相信大家也都碰到过这样的困…

【软件相关】Typora配置图片上传

文章目录0 前言1 确定需求2 开始配置2.1 软件储备2.2 插件安装2.3 gitee配置3 其他配置3.1 获取SMMS token参考链接0 前言 对于喜欢写Markdown文档的人来说&#xff0c;Typora无疑是一个写作利器&#xff0c;它有别于其他的Markdown软件&#xff0c;不是一边编辑一边渲染&#…

excel区分工时制度:如何计算996与955的工时差异

什么是996呢&#xff1f;是指早上9点上班&#xff0c;晚上9点下班&#xff0c;中午和晚上各有1小时吃饭时间&#xff0c;每周工作6天的工作模式。而955&#xff0c;也就是朝九晚五&#xff0c;中午就餐在工作时间内&#xff0c;但不能休息&#xff0c;共计8小时工作时间&#x…

[FUNC]在AHK中实现Pyhton的range函数

本文是用AutoHotkey复刻Python的range函数函数语法range(start, stop, step)参数说明&#xff1a;参数描述start计数从 start 开始。默认是从 0 开始。例如&#xff1a;range&#xff08;6&#xff09;等价于range(0,6)。stop计数到 stop 结束&#xff0c;但不包括 stop。例如&…

5、Ubuntu20常用操作_进程管理重定向和管道常用命令网络管理

进程管理 进程的概念 大家比较熟悉 Windows 下的可执行文件&#xff0c;就是那些扩展名为exe的文件。 大家知道&#xff0c;只需要鼠标双击这些程序&#xff0c; 就可以运行了。 程序运行起来后&#xff0c;我们把这个程序正在运行的 实例 称之为 进程 。 操作系统对每个进…