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

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

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

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;这时用户需要进行数据恢复。本文将详细介绍多闪软件聊天记录的恢复过程。 一、多闪软件聊天记录恢复方法 从手机备份中恢…

【每日刷题】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和数据库等…

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是阿里巴巴中间…

基于大模型(LLM)相互协商的情感分析

Sentiment Analysis through LLM Negotiations https://arxiv.org/abs/2311.01876https://arxiv.org/abs/2311.01876 1.概述 在情感分析任务中,传统的单一大型语言模型(LLM)通常只通过单轮输出来做出决策。这种方法的主要缺点是无法完美应对需要深入推理的复杂语言现象,…

Vue.js【路由】

初识路由 提到路由&#xff08;Route&#xff09;&#xff0c;一般我们会联想到网络中常见的路由器&#xff08;Router&#xff09;&#xff0c;那么路由和路由器之间有什么关联呢&#xff1f;路由是指路由器从一个接口接收到数据&#xff0c;根据数据的目的地址将数据定向传送…

【how2j JQuery部分】课后题答案及相关笔记

练习题 <script src"jquery.min.js"></script><script>$(function(){$(tr:odd).css({"background-color":"#f8f8f8"});}); </script> <style> table{border-collapse:collapse;width:90%;} tr{border-bottom-sty…

力扣每日一题108:将有序数组转换为二叉搜索树

题目 简单 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也…

VS编辑器下使用MFC完成学生成绩统计分析系统

背景&#xff1a; &#xff08;一&#xff09;实验目的 通过该实验&#xff0c;使学生掌握windows程序设计的基本方法。掌握学生管理中学生成绩统计分析方面的基本知识&#xff0c;熟练应用数据库技术完成对学生成绩管理活动中各类信息的增加、修改、删除、查询等操作。通过处…