Spring MVC(一)

1 Spring MVC概述

        我们在之前学习Servlet的时候,认识了在WEB开发中MVC设计模式,其最为经典的设计就是,通过控制器(Controller)分离模型(Model)和视图(View)。在具体的WEB开发中,我们实现最多的功能就是页面的跳转和参数的传递。每次在使用Servlet进行操作的时候,都要手动的控制页面的跳转,开发效率非常低,虽然也可以使用一定的代码封装(BaseServlet),来简化操作,但是参数的传递只能频繁的使用getParameter方法来处理。鉴于以上问题,逐渐出现了一些自动化的MVC框架,其中Spring MVC就是目前非常优秀的MVC框架之一。

        Spring MVC属于Spring Frame Work的后续产品,现已归属为Spring Web Flow里,Spring MVC是对传统的Servlet进行了一系列的封装。Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。因此,在使用Spring MVC进行程序设计的时候,往往只需要编写少量的代码,就可以达到Servlet中复杂的实现。

        Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将Web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发。

        既然Spring MVC属于Spring的一部分,当然可以实现Spring到Spring MVC的无缝对接。在开发的时候,我们可以利用Spring的IOC容器来管理SpringMVC中所有的控制器,一个普通的POJO就可以被当做一个控制器来使用。Spring MVC提供了一个强大的中央控制器,我们可以通过该中央控制器轻松的实现页面跳转,同时可以利用Spring的注解,很方便的实现参数的传递。

2 Spring MVC项目环境搭建

        既然Spring MVC是一个MVC框架,在开发的时候同样也需要导入相关的jar包。开发最基本的Spring MVC程序,需要导入的jar包有:

commons-logging-1.2.jar

spring-aop-4.3.9.RELEASE.jar

spring-beans-4.3.9.RELEASE.jar

spring-context-4.3.9.RELEASE.jar

spring-core-4.3.9.RELEASE.jar

spring-expression-4.3.9.RELEASE.jar

spring-web-4.3.9.RELEASE.jar

spring-webmvc-4.3.9.RELEASE.jar

        创建一个web项目,我们暂时把项目名称命名为springmvc,然后拷贝上述jar包到项目的WebRoot/WEB-INF/lib目录中。项目的结构图如图所示。

        上一节说过Spring MVC具有一个中央控制器,我们可以通过Spring MVC的中央控制器来轻松的完成对页面跳转和参数传递的控制。中央控制器如何才能得到利用呢,接下来需要在web.xml添加相应的配置,代码如下。

<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>

        其中的<load-on-startup>配置的值为1,在学习Servlet的时候,我们知道,此处的配置意为在服务启动以后,立即加载该Servlet对象,因为Spring MVC中央控制器需要优先启动。其中的<url-pattern>配置的值为/,这样是为了拦截所有的URL请求。

        在Spring MVC中,被中央控制器拦截的请求,全部交由一个统一的处理文件中,这个文件的位置必须在项目的WebRoot/WEB-INF目录下,名字必须是dispatcher-servlet.xml,因为我们在配置中央控制其的时候,指定的servlet-name是dispatcher,所以名字必须以servlet-name配置的名字开头。

        其实,配置文件的名字和位置也是可以更改的,在web.xml文件中配置DispatcherServlet的时候,在其中的<servlet>配置中添加如下内容。

<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>

        这样一来,我们就可以在项目的src目录下创建配置文件了,文件的名字就可以指定为springmvc.xml。不过,在具体的开发过程中一般都是使用的默认值,也就是在WEB-INF目录下创建配置文件。

        在WEN-INF目录下创建dispatcher-servlet.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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"></beans>

        通过之前Spring的学习,我们可以看到,其中的内容非常类似Spring的配置文件,这也意味着同样可以使用Spring IOC容器来管理对象。但是,在Spring MVC中管理的对象就是所有的控制器。接下来创建一个控制器HelloController,并编写以下代码。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;@Controller
public class HelloController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {System.out.println("Hello SpringMVC!!!");return new ModelAndView("/WEB-INF/jsp/hello.jsp");}
}

        创建的控制器类HelloController继承了一个抽象类AbstractController,其实在Spring MVC中,所有的控制器完全可以不用继承任何类,这个在接下来的章节中会重点讲述,在此,先按照这种方式创建。

        其实AbstractController类我们可以当做在创建Servlet的时候继承的HttpServlet。其中的handleRequestInternal方法我们可以当做Servlet中的doGet或者doPost方法,也就是所这个方法肯定会被自动调用。在方法中我们可以看到,传递了两个参数,这正是我们熟悉的HttpServletRequest对象和HttpServletResponse对象,这也就说明了我们编写的这个控制器,其根本也就是一个Servlet。handleRequestInternal方法的返回类型是ModelAndView,返回了一个ModelAndView对象,其中的参数为“/WEB-INF/jsp/hello.jsp”,这正是我们熟悉的页面跳转,也就是返回的页面。此时我们应该在项目的WEB-INF目录下创建一个目录jsp,在其中创建一个hello.jsp文件,在<body>标签中添加相应的代码,具体内容如下。

<body>
<br><h1 align="center">Hello Spring MVC</h1><br><hr>
</body>

        既然创建了一个控制器,这个控制器如何被Spring MVC所管理呢?之前提到过,Spring MVC可以使用Spring IOC容器来管理对象,我们就可以利用在dispatcher-servlet.xml文件中添加配置,代码如下。

<bean id="/hello" class="com.tedu.controller.HelloController" />

        注意:此时配置的id的值为“/hello”,这就是访问HelloController控制器的URL地址。把该项目部署到Tomcat中,启动服务就可以访问了。

        在浏览其中输入地址http://localhost:8080/springmvc/hello 就可以访问项目了,具体的结果如图所示。

3 Spring MVC项目过程分析

        Spring MVC项目执行的大致过程为:通过在浏览器中输入一个地址,首先这个地址请求资源的URL(在本例中就是/hello),会被在web.xml中配置的中央控制器拦截,然后交由dispatcher-servlet.xml文件处理,接下来会在该配置文件中查找id值为“/hello”的<bean>,然后到达指定控制器类,根据handleRequestInternal方法返回对象的参数,寻找到指定的视图页面。大致的执行过程,可以归纳为如图所示。

4 Spring MVC项目改进

        在学习Spring的时候,我们在配置Spring IOC容器来管理对象的时候,推荐使用的是基于注解的操作,Spring MVC又是如何通过注解来操作呢?接下来把刚才的项目通过注解的形式重新改进一下,首先在dispatcher-servlet.xml文件中删除刚才的<bean>配置,并添加如下新的配置,以实现基于注解的操作。

<!-- 打开基于注解的操作 -->
<mvc:annotation-driven />
<!-- 到哪些包下扫描controller -->
<context:component-scan base-package="com.tedu.controller" />

        此时的控制器HelloController就不需要再继承AbstractController类了,控制器HelloController要被Spring IOC容器管理,只需要在类上添加注解@Controller,通过Spring IOC容器来管理控制器,同时请求的地址可以在方法上通过注解@RequestMapping("/hello")来指定,具体的代码如下所示。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("/hello")public String hello() {System.out.println("Hello SpringMVC!!!");return "/WEB-INF/jsp/hello.jsp";}
}

        通过以上操作,简化了控制器类的编写,控制器类可以不用继承任何类,也不用实现任何接口,就是一个POJO,却能到达同样的效果。

        在本例中,控制器的操作方法返回的页面地址有点过于复杂,能不能通过简单的操作优化一下呢?接下来在dispatcher-servlet.xml文件添加如下配置。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 配置前缀和后缀映射 --><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property>
</bean>

        通过配置bean在Spring IOC容器中管理了InternalResourceViewResolver类的对象,用来对控制器类返回的URL地址进行重新编辑。在该类的父类中有一些属性,其中有“prefix”和“suffix”,分别对应返回URL的前缀和后缀。通过<property>标签完成了对前缀和和后缀值的注入,当执行控制器中的方法后,会根据方法的返回值加上前缀和后缀,组成一个完整的URL地址。

        因此方法的返回值就可以简化为“hello”,dispatcher-servlet.xml配置文件会自动为其加上前缀“/WEB-INF/jsp/”和后缀“.jsp”,然后组成完整的返回地址。

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

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

相关文章

Redis进阶学习

Redis进阶学习 一、Redis事务1.2 Redis监控1.3 Jedis连接1.4 SpringBoot整合1.5 自定义RedisTemple1.6 Redis.conf详解 二、 Redis持久化2.1 RDB2.2 AOF进程 三、Redis发布订阅3.1 Redis主从复制3.2 集群环境配置3.3、复制原理3.4、宕机后主动变为主机3.5、哨兵模式 四、Redis缓…

【ITK配准】第七期 尺度(Metric)-基匹配Metric

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的基匹配Metric,即itk::MatchCardinalityImageToImageMetric ,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…

【算法刷题day45】卡码网:70. 爬楼梯(进阶版);Leetcode:322. 零钱兑换、279. 完全平方数

文章目录 Leetcode 70. 爬楼梯&#xff08;进阶版&#xff09;解题思路代码总结 Leetcode 322. 零钱兑换解题思路代码总结 Leetcode 279. 完全平方数解题思路代码总结 草稿图网站 java的Deque Leetcode 70. 爬楼梯&#xff08;进阶版&#xff09; 题目&#xff1a;70. 爬楼梯&…

2024年大数据与艺术设计国际学术会议(ICBDAD 2024)

2024年大数据与艺术设计国际学术会议(ICBDAD 2024) 2024 International Conference on Big Data and Art Design 一、【会议简介】 2024年大数据与艺术设计国际学术会议&#xff0c;听起来好像两个完全不相关的领域&#xff0c;却意外地融合在了一起。 在这个会议上&#xff0c…

力士乐触摸屏维修VCP11.2DWN-003-NN-NN-PW工业液晶屏幕电脑主机深圳捷达工控维修

扩展的性能、高系统可用性和多种配置选项 借助 lndraControl 系列工业 PC 和显示器&#xff0c;实现高性能和高灵活性。 lndraControl PR 性能分级盒采用最新的 Intel ATOM 和 Core-i 处理器&#xff0c;可与 lndraControl DR 多点触控显示屏集成&#xff0c;连接距离可达 100M…

el-carousel走马灯页数回到第一页

我的走马灯是在一个弹窗里,包裹着一些button,切换到下一页时 关闭弹窗再打开弹窗还显示的是上次第二页位置 领导很不满意 1. 2.写在你打开弹窗或者关闭弹窗的位置 this.$refs.carousel && (this.$refs.carousel.activeIndex 0); 解释一下: this.$refs.carousel: thi…

开源数据可视化大屏对接表单数据实践!

如果你需要一个表单系统&#xff0c;进行数据收集&#xff1b;可以使用tduck填鸭进行私有化部署&#xff0c;进行表单制作&#xff0c;完成数据收集。 在实际业务中&#xff0c;往往需要将收集的数据进行展示或分析&#xff1b;此时就可以使用表单数据推送到TReport中&#xf…

华为eNSP中型企业局域网网络规划设计(下)

→b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;上&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩← 配置ospf AR3 [AR3]ospf 1 router-id 3.3.3.3 //出口默认路由 [AR3-ospf-1]default-route-advertise always #area…

R语言数据探索与分析-中国GDP回归分析与预测

首先读取数据&#xff1a; 将GDP列转换为常规数字格式 # 可视化GDP数据 # 查看数据结构 # 确保数据类型是正确的 第一张图片展示了中国2002年到2021年间的GDP增长趋势&#xff0c;这是一个时间序列图&#xff0c;其中横轴表示年份&#xff0c;纵轴表示GDP&#xff08;单位未…

OpenAI 高管:一年后,你会觉得现在的 ChatGPT 像笑话一样糟糕|TodayAI

OpenAI 的首席运营官 Brad Lightcap 表示&#xff0c;一年后&#xff0c;你会觉得现在的 ChatGPT 像笑话一样糟糕。未来的 ChatGPT 版本将会有重大升级。他还讨论了 AI 取代人类工作和对电网的压力的可能性。 虽然我们不知道 OpenAI 何时会推出 GPT-5&#xff0c;但公司高管已…

三年软件测试经验遭遇求职困境?揭秘求职市场的隐藏陷阱

1.个人背景 小李&#xff0c;我的一位朋友&#xff0c;拥有三年多的软件测试工作经验。他本科毕业后便投身于测试行业&#xff0c;熟练掌握Python编程&#xff0c;能够编写自动化测试脚本&#xff0c;并且熟悉Selenium和性能测试。然而&#xff0c;尽管他具备这些技能和经验&am…

Zabbix+Grafana-常见报错及异常处理方式记录

文章目录 Zabbix安装篇Zabbix Web页面连接数据库失败 Zabbix使用篇中文显示不全 Zabbix报警篇新建的用户&#xff0c;配置报警后&#xff0c;无法收到报警 Grafana安装篇Windows系统安装时&#xff0c;添加zabbix报错&#xff1a;An error occurred within the plugin Zabbix安…

社交媒体数据恢复:多闪

社交软件多闪是一款深受用户喜爱的社交应用&#xff0c;用于与朋友、家人保持联系。有时&#xff0c;多闪软件的聊天记录可能会丢失或被删除&#xff0c;这时用户需要进行数据恢复。本文将详细介绍多闪软件聊天记录的恢复过程。 一、多闪软件聊天记录恢复方法 从手机备份中恢…

【数组】Leetcode 274. H 指数【中等】

H 指数 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a; h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xf…

【每日刷题】Day34

【每日刷题】Day34 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; 2. 1475. 商品折扣后…

Rust开发工具有哪些?

目录 一、JetBrains公司的RustRover​编辑 二、微软公司的Visual Studio Code 三、Rust编译工具 一、JetBrains公司的RustRover RustRover是由JetBrains开发的一款专为Rust开发量身定制的新兴IDE&#xff0c;目前还处于早期访问阶段。它支持Rust、Cargo、TOML、Web和数据库等…

5.27日学习记录及相关问题解答

1. 阅读文章 复习 JAVA基础——接口&#xff08;全网最详细教程&#xff09; Java之对象的多态性&#xff08;使用生活中通俗的例子讲解&#xff09; 新学 JavaWeb——Servlet&#xff08;全网最详细教程包括Servlet源码分析&#xff09; 有用 创建Dynamic Web Project工程&…

Unity如何使用adb工具安装APK

1、下载adb工具 SDK 平台工具版本说明 | Android Studio | Android Developers (google.cn) 2、配置环境变量 把platform-tools的路径添加进去就行 打开cmd&#xff0c;输入adb&#xff0c;即可查看版本信息 3、使用数据线连接设备&#xff0c;查看设备信息&#xff08;…

黄金投资怎么判断走势好坏?

投资黄金&#xff0c;就是押注于这一贵金属价格的变动。判断黄金价格的走势好坏&#xff0c;对于投资者来说至关重要。这需要从宏观经济指标、技术分析指标和市场情绪等多元化角度进行综合分析。 宏观经济指标 货币政策&#xff1a;中央银行的货币政策&#xff0c;尤其是利率决…

分布式事务Seata使用

我们要学习seata&#xff0c;首先需要具备如下技术储备&#xff1a; 数据库事务的基本知识&#xff1b;maven工具的使用&#xff1b;熟悉SpringCloudAlibaba技术栈&#xff1b;掌握SpringDataJPA简单使用&#xff1b; 一. Seata基本概念 1.seata是什么 Seata是阿里巴巴中间…