【SpringMVC】SpringMVC的入门

news2025/4/12 4:32:39

1.SpringMVC的入门案例

1.1 项目目录

1.2 配置核心控制器和编码过滤器(web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!--配置spring mvc的核心控制器-->
  <servlet>
    <servlet-name>SpringMVCDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置初始化参数,用于读取SpringMVC的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:SpringMVC.xml</param-value>
    </init-param>
    <!--配置servlet的对象的创建时间点:应用加载时创建
        只能是非0正整数,表示启动顺序-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVCDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!--过滤器-->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

1.3 创建SpringMVC的配置文件(SpringMVC.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">
    <!--配置spring要扫描的包-->
    <context:component-scan base-package="cn.krislin"></context:component-scan>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

1.4 编写控制器并使用注解配置

@Controller("helloController")
public class HelloController {

    @GetMapping("/hello")
    public String sayHello(){
        System.out.println("HelloController中的sayHello方法执行了");
        return "success";
    }
}

1.5 页面

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: LIM
  Date: 20/7/23
  Time: 11:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
    <h2><a href="hello">SpringMVC入门案例1</a></h2>
</body>
</html>

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: LIM
  Date: 20/7/23
  Time: 11:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
    <h1>success</h1>
</body>
</html>

1.6 测试

2.入门案例的执行过程及原理分析

2.1 案例的执行过程

  1. 服务器启动,应用被加载。读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象。
  2. 浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发的路径是根据请求 URL,匹配@RequestMapping 中的内容。
  3. 匹配到了后,执行对应方法。该方法有一个返回值。
  4. 根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
  5. 渲染结果视图,响应浏览器。

2.2 SpringMVC的请求响应流程

3.入门案例中涉及的组件

3.1 DispatcherServlet: 前端控制器

用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。

3.2 HandlerMapping: 处理器映射器

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3.3 Handler: 处理器

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。

3.4 HandlerAdapter: 处理器适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

3.5 View Resolver: 视图解析器

View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

3.6 View: 视图

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。

一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

3.7 <mvc:annotation-driven>说明

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使 用 <mvc:annotation-driven> 自 动加载 RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用<mvc:annotation-driven>替代注解处理器和适配器的配置。

它就相当于在 xml 中配置了:

<!-- 上面的标签相当于 如下配置-->
<!-- Begin -->
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerM
apping"></bean>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter"></bean>
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExcept
ionResolver"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolv
er"></bean>
<bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
></bean>
<!-- End -->

注意:
一般开发中,我们都需要写上此标签(虽然从入门案例中看,我们不写也行,随着课程的深入,该标签还有具体的使用场景)。

明确:
我们只需要编写处理具体业务的控制器以及视图。

4.RequestMapping注解

4.1 使用说明

源码

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
}

作用

用于建立请求 URL 和处理请求方法之间的对应关系。

出现位置

  1. 类上

    请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
    它出现的目的是为了使我们的 URL 可以按照模块化管理。
    例如:
    账户模块:
    /account/add
    /account/update
    /account/delete

    订单模块:
    /order/add
    /order/update
    /order/delete
    红色的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。

  2. 方法上
    请求 URL 的第二级访问目录。

属性

  • value:用于指定请求的 URL。它和 path 属性的作用是一样的。
  • method:用于指定请求的方式。
  • params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
    例如:
    params = {“accountName”},表示请求参数必须有 accountName
    params = {“moeny!100”},表示请求参数中 money 不能是 100。
  • headers:用于指定限制请求消息头的条件。

注意:
以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。

4.2 使用示例

1.出现位置示例

控制器代码

@Controller("accountController")
@RequestMapping("/account")
public class AccountController {
    @RequestMapping("/findAccount")
    public String findAccount() {
        System.out.println("查询了账户。。。。");
        return "success";
    }
}

jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>requestmapping 的使用</title>
    </head>
    <body>
        <!-- 第一种访问方式 -->
        <a href="${pageContext.request.contextPath}/account/findAccount">查询账户</a>
        <br/>
        <!-- 第二种访问方式 -->
        <a href="account/findAccount">查询账户</a>
    </body>
</html>

注意:
在当我们使用此种方式配置时,在 jsp 中第二种写法时,不要在访问 URL 前面加/ ,否则无法找到资源。

2.method属性的示例

控制器代码

/**
* 保存账户
* @return
*/
@RequestMapping(value="/saveAccount",method=RequestMethod.POST)
public String saveAccount() {
    System.out.println("保存了账户");
    return "success";
}

jsp代码

<!-- 请求方式的示例 -->
<a href="account/saveAccount">保存账户,get 请求</a>
<br/>
<form action="account/saveAccount" method="post">
	<input type="submit" value=" 保存账户, post 请求 ">
</form>

注意:
当使用 get 请求时,提示错误信息是 405,信息是方法不支持 get 方式请求

3. params属性示例

控制器代码

/**
* 删除账户
* @return
*/
@RequestMapping(value="/removeAccount",params= {"accountName","money>100"})
public String removeAccount() {
    System.out.println("删除了账户");
    return "success";
}

jsp代码

<!-- 请求参数的示例 -->
<a href="account/removeAccount?accountName=aaa&money>100">删除账户,金额 100</a>
<br/>
<a href="account/removeAccount?accountName=aaa&money>150">删除账户,金额 150</a>

注意:
当我们点击第一个超链接时,可以访问成功。
当我们点击第二个超链接时,无法访问。如下图:

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

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

相关文章

20221223英语学习

今日托福词汇 review n.复习; 回顾, 检讨; 检阅; 评论; 详检, 审核; 回放功能 tentative adj.试验性的; 不确定的; 暂时的; 犹豫的, 踌躇不决的 synonym n.同义词 confine v.限制&#xff1b;监禁 parking n.机动车停放&#xff1b;停车场 sculpture n.雕像&#xff0c;雕…

高通 OpenXR SDK 使用指南(2)

高通 OpenXR SDK 使用指南&#xff08;2&#xff09;1.5 OpenXR 生命周期1.5 OpenXR 生命周期 下图是 OpenXR 框架生命周期的流转过程。 此图中描述了以下过程&#xff1a; 应用程序首先使用 xrEnumerateApiLayerProperties 查询 API 层和扩展属性。 API层可以是以下类型&a…

Zookeeper 4 Zookeeper JavaAPI 操作 4.6 Curator API 常用操作【删除节点】

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.6 Curator API 常用操作4.6.1 删除节点4 Zookeeper JavaAPI 操作 4.6 Curator API 常用操作 4.6.1 删除节点 直接开干 /*** 删除节点* 1. 删除单…

【Java基础知识复盘】ArrayList、LinkedList篇——持续更新中

本人知识复盘系列的博客并非全部原创&#xff0c;大部分摘自网络&#xff0c;只是为了记录在自己的博客方便查阅&#xff0c;往后也会陆续在本篇博客更新本人查阅到的新的知识点&#xff0c;望悉知&#xff01; ArrayList 概述 ArrayList 类是一个可以动态修改的数组&#xf…

C++【图】

文章目录一、什么是图二、图的存储结构1.邻接矩阵2.邻接表三、邻接表的代码实现四、邻接矩阵的代码实现五、图的相关属性六、图的遍历1.深度优先遍历2.广度优先遍历练习七、最小生成树1.Kruskal算法&#xff08;克鲁斯卡尔算法&#xff09;2.prim算法八、最短路径1.Dijkstra算法…

Zookeeper 4 Zookeeper JavaAPI 操作 4.8 分布式锁

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.8 分布式锁4.8.1 分布式锁4.8.2 Zookeeper 分布式锁原理4 Zookeeper JavaAPI 操作 4.8 分布式锁 4.8.1 分布式锁 在我们进行单机应用开发&#x…

[附源码]计算机毕业设计Python失物招领微信小程序论文(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

微信公众号迁移,需要做些什么

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;微信公众平台 文章目录一、开通开发者二、设置IP白名单三、自定义菜单四、认证五、网页授权域名六、模板消息七、转换…

芯片漫游指南(4) -- UVM序列

1 新手上路 1.1 概述 在UVM世界&#xff0c;利用其核心特性&#xff0c;在创建了组件和顶层环境&#xff0c;并且完成组件之间的TLM端口连接之后&#xff0c;接下来就可以使得整个环境开始运转了。 在经过一番时间&#xff0c;掌握了组件之间的TLM通信方式&#xff0c;开辟了…

十四、Docker 微服务实战

1、创建SpringBoot项目 hello_docker 1.1、项目结构 1.2、项目所有代码 pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-inst…

Shiro与SpringBoot整合

Shiro与SpringBoot整合 这里前端页面 采用thymeleaf进行渲染 1、导入基本的依赖坐标 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.9.0</version> </d…

【云原生 | 48】Etcd集群管理

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

HTML知识1

1. title标签&#xff1a;声明网页的标题 2.meta标签&#xff1a;描述应该网页的属性 3.style标签&#xff1a;内嵌css样式 4.script标签&#xff1a;用来引入javascript程序 5.html常用特殊字符 6.注释&#xff1a;<&#xff01;--此处是注释--> 二.标签 属性…

Android实现一维二维码扫描生成功能(一)-zxing导入现有项目

前言 目前二维码扫描功能很流行也非常成熟了&#xff0c;而zxing项目也是目前可以说是最流行的二维码扫描方面的开源项目了&#xff0c;很多大神都对zxing进行了封装&#xff0c;github上也有很多好用的二维码开源库&#xff0c;但是我更喜欢原版的zxing开源库&#xff0c;而原…

Struts2框架简单入门

Struts2框架简单入门1、前言2、Struts2简介2.1、Struts2介绍2.2、Struts2优缺点2.2.1、优点2.2.2、缺点2.2.3、Struts2获取3、入门案例3.1、pom依赖3.2、web.xml配置3.3、准备页面3.4、编写Action控制器3.5、编写核心配置文件struts.xml3.6、部署测试3.6、注意点3.7、小结1、前…

Android -- 每日一问:如何实现自定义View?

经典回答 回忆一下&#xff0c;你去面试时常被问到的自定义 View 方面的问题是那些。有没有&#xff1a; invalidate 和 postInvalidate 方法的区别&#xff1f;自定义 View 的绘制流程&#xff1f;View 的 Touch 事件分发流程&#xff1f; 因为在实际的工作中并不是每个人都…

【Go实现】实践GoF的23种设计模式:命令模式

上一篇&#xff1a;【Go实现】实践GoF的23种设计模式&#xff1a;代理模式 简单的分布式应用系统&#xff08;示例代码工程&#xff09;&#xff1a;https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 现在的软件系统往往是分层设计。在业务层执…

设计vue3组件

在程序设计过程中&#xff0c;我们经常会遇到很多地方用到相同结构内容的情况&#xff0c;这时&#xff0c;我们想复用一部分代码&#xff0c;这时可以将可复用的UI部分以组件的形态封装&#xff0c;形成一定的组件调用关系。 组件化最简单的就是把一段代码提出来单独写进一个…

Netflix Eureka 2.0.0正式发布:借尸还魂还是虚晃一枪?

本文已被https://yourbatman.cn收录&#xff1b;女娲Knife-Initializr工程可公开访问啦&#xff1b;程序员专用网盘https://wangpan.yourbatman.cn&#xff1b;技术专栏源代码大本营&#xff1a;https://github.com/yourbatman/tech-column-learning&#xff1b;公号后台回复“…

【Web前端HTML5CSS3】09、高度塌陷与 BFC

九、高度塌陷与 BFC 1、高度塌陷 在浮动布局中&#xff0c;父元素的高度默认是被子元素撑开的 当子元素浮动后&#xff0c;其会完全脱离文档流&#xff0c;子元素从文档流中脱离将会无法撑起父元素的高度&#xff0c;导致父元素的高度丢失 父元素高度丢失以后&#xff0c;其…