Spring MVC(一)

news2024/11/15 20:01:28

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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://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 {
	@Override
	protected 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.coloradmin.cn/o/1677632.html

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

相关文章

【408精华知识】计算机系统结构

感觉教材和网络上对于计算机系统的结构描述都比较模糊&#xff0c;我自己对其进行了总结&#xff0c;并且画出图&#xff0c;不过因为学习的还是不够深入和全面&#xff0c;有的地方肯定是有问题的&#xff0c;烦请大家批评指正&#xff0c;我会进行修改~ 文章目录 零、结构图总…

OpenAI 新发布的 GPT-4o,有血有肉的Ai来了,可实时语音视频交互

今天&#xff0c;OpenAI又又又开发布会了。 在大众心里&#xff0c;现在也基本上都知道&#xff0c;奥特曼是一个贼能PR的人。 每一次的PR的时间点&#xff0c;都拿捏的极其到位&#xff0c;精准的狙击其他厂商。比如说上一次Sora&#xff0c;其实你会发现从头到尾就是一个PR的…

中腾食品上海食堂承包创新食堂空间,构建企业第三文化沙龙

在快节奏的现代职场生活中&#xff0c;企业食堂已不再是简单的餐饮供应地&#xff0c;而是逐渐演变成为员工休息休闲、互动体验、阅读思考的重要场所。中腾国际团餐产业集团通过专业的定制化食堂承包&#xff0c;在企业食堂内部打造企业第三文化空间&#xff0c;为员工提供一个…

基于ProxySQL中间件实现MySQL的读写分离

目录 ProxySQL简介 ProxySQL安装 配置YUM仓库 YUM安装 关于读写分离的实现 集群信息 测试读写分离 测试总结 ProxySQL Configuration CLI ProxySQL简介 ProxySQL是一个高性能的MySQL协议代理&#xff0c;它支持多种数据库后端&#xff0c;包括Amazon Aurora、RDS、Cl…

外卖订餐总后台系统原型

页面数量&#xff1a;共 210 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10 应用领域&#xff1a;O2O领域、网上订餐、外卖行业 文章展示不够全面&#xff0c;如有兴趣请联系作者 该原型作品为外卖订餐总后台管理系统&#xff0c;定位偏向美团外卖与饿了么一…

unapp写微信小程序封装水印相机组件怎么实现?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">编辑资料</block></cu-custom> --><…

让大模型更贴近人类认知水平,上海AI实验室发布首个因果推理评测体系CaLM

近日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;联合同济大学、上海交通大学、北京大学及商汤科技发布首个大模型因果推理开放评测体系及开放平台CaLM&#xff08;Causal Evaluation of Language Models&#xff0c;以下简称“CaLM”&#xff09;。首…

MySQL:MySQL索引结构为什么选用B+树?

一、前言 当我们发现SQL执行很慢的时候&#xff0c;自然而然想到的就是加索引。在MySQL中&#xff0c;无论是Innodb还是MyIsam&#xff0c;都使用了B树作索引结构。我们知道树的分类有很多&#xff0c;MySQL中使用了B树作索引结构&#xff0c;这是为什么呢&#xff1f; 本文将从…

HOJ 修改首页 和后端logo图片 网页收藏标识ico 小白也会的方法

HOJ 是一款优雅知性的在线评测系统&#xff0c;像一位温文尔雅的女性&#xff0c;你会慢慢喜欢上她的。 制作图片素材 用图像编辑软件 比如 **光影魔术手4.0** 制作以下素材 logo.a0924d7d.png 为前台导航栏左边的logo&#xff0c; 600*200 backstage.8bce8c6e.png 为后台侧…

虚拟化技术 在vCenter Server创建数中心、添加主机

一、实验内容 1.安装Flash 2.在vCenter Server创建数中心、添加主机 二、实验主要仪器设备及器材 1.安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置 2.在Windows Server 2008 R2已安装vCenter Server 3.Adobe Flash Player 12.0.0.70.e…

数据结构【顺序表】

文章目录 1.顺序表的概念线性表物理结构逻辑结构 2.顺序表的分类2.1静态顺序表2.2动态顺序表 3.顺序表接口的实现头文件(SQList.h)如下源文件初始化顺序表销毁顺序表插入扩容尾插头插 封装扩容函数删除尾删头删 查找元素在指定位置前插入数据情况一(指定的位置不是首元素)情况二…

CMF认证是什么?怎么报名?考试费用多少?有必要参加培训吗?

CMF认证是由国际变革管理学院&#xff08;CMI&#xff09;颁发的一种认证&#xff0c;旨在评估个人在变革管理领域的知识和技能&#xff0c;并确认其在该领域具备专业能力。通过学习和理解变革管理知识体系&#xff08;CMBoK&#xff09;&#xff0c;参与者可以掌握变革管理的理…

4 特征构造

4 特征构造 学习目标 知道未来信息的概念,及处理未来信息的方法掌握从原始数据构造出新特征的方法掌握特征变换的方法掌握缺失值处理的方法1 数据准备 1.1 梳理数据的内在逻辑 关系种类 一对一:一个用户有一个注册手机号 一对多:一个用户多笔借款 多对多:一个用户可以…

第1章 初始Spring Boot【仿牛客网社区论坛项目】

第1章 初始Spring Boot【仿牛客网社区论坛项目】 前言推荐项目总结第1章初识Spring Boot&#xff0c;开发社区首页1.课程介绍2.搭建开发环境3.Spring入门体验IOC容器体验Bean的生命周期体验配置类体验依赖注入体验三层架构 4.SpringMVC入门配置体验响应数据体验响应Get请求体验…

【原创】java+springboot+mysql企业邮件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

jar包安装成Windows服务

一、前言 很多年前写过一篇《使用java service wrapper把windows flume做成服务》的文章&#xff0c;也是把jar包安装成windows服务&#xff0c;今天介绍另外一种更简便的方案。 二、正片 这次使用的工具是 winsw&#xff0c;一个Windows服务包装器。下面看详细介绍 首先从g…

QT状态机8-使用恢复策略自动恢复属性

当状态分配的属性不再活动时,可能希望将其恢复到初始值,通过设置全局的恢复策略可以使状态机进入一个状态而不用明确制定属性的值。 QStateMachine machine; machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);当设置了恢复策略以后,状态机将自动恢复所有…

神策数据付力力入选福布斯中国 30 Under 30 十周年名人堂

福布斯中国 30 UNDER 30&#xff08;U30&#xff09; 持续关注青年才俊。在 U30 十周年之际&#xff0c;福布斯中国通过跟踪、梳理、比较历年 U30 们入选后的表现、社会影响力事件&#xff0c;以及创业精神诠释&#xff0c;编制了福布斯中国首期 U30 名人堂名单。神策数据联合创…

低代码开发平台在城市数字化转型中的技术实现与案例分析

城市数字化转型需要政策引导、技术创新、基础设施建设、人才培养、多方合作以及安全保障等全方位的支持与助力&#xff0c;共同推动城市的数字化进程&#xff0c;提升其竞争力和可持续发展能力。 其中&#xff0c;技术创新是推动数字化转型的核心动力&#xff0c;需要不断加强…

从零开始详解OpenCV条形码区域分割

前言 在识别二维码之前&#xff0c;首先要划分出二维码的区域&#xff0c;在本篇文章中将从零开始实现二维码分割的功能&#xff0c;并详细介绍用到的方法。 我们需要处理的图像如下&#xff1a; 完整代码 首先我们先放出完整代码&#xff0c;然后根据整个分割流程介绍用到…