SpringMVC篇-程序员宅基地

技术标签: Java进阶  

1 什么是SpringMVC

1.1 概述

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

官方文档:https://docs.spring.io/spring-framework/docs/5.3.x-SNAPSHOT/reference/html/web.html#spring-web

Spring MVC的特点:

  • 轻量级,简单易学
  • 高效 , 基于请求响应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定优于配置
  • 功能强大:RESTful、数据验证、格式化、本地化、主题等
  • 简洁灵活

Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。
DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁;

1.2 中心控制器

Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。

Spring MVC框架以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
在这里插入图片描述
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。

1.3 SpringMVC执行原理

在这里插入图片描述
图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

简要执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
    如上url拆分成三部分:
    http://localhost:8080服务器域名
    SpringMVC部署在服务器上的web站点
    hello表示控制器
    通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  6. Handler让具体的Controller执行。
  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  12. 最终视图呈现给用户。

2 创建MVC程序

2.1 配置方式

1.给项目添加web的支持!

2.确定导入了SpringMVC 的依赖!(maven中以及Artifacts中)
要确保有lib并且其中还有相应的包
在这里插入图片描述

3.配置web.xml , 注册DispatcherServlet


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">

   <!--1.注册DispatcherServlet-->
   <servlet>
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       <!--启动级别-1-->
       <load-on-startup>1</load-on-startup>
   </servlet>

   <!--/ 匹配所有的请求;(不包括.jsp)-->
   <!--/* 匹配所有的请求;(包括.jsp)-->
   <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>
</web-app>

4.编写SpringMVC 的 配置文件!
文件名称:springmvc-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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

5.添加处理映射器(HandlerMapping)

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

6.添加处理器适配器(HandlerAdapter)

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

7.添加视图解析器
添加到springmvc-servlet.xml中


<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
   <!--前缀-->
   <property name="prefix" value="/WEB-INF/jsp/"/>
   <!--后缀-->
   <property name="suffix" value=".jsp"/>
</bean>

8.编写我们要操作业务Controller ,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,装数据,封视图;


package com.controller;

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

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

//注意:这里我们先导入Controller接口
public class MyController implements Controller {
    

   public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
       //ModelAndView 模型和视图
       ModelAndView mv = new ModelAndView();
	   
	   //调用业务层方法
		
       //封装对象,放在ModelAndView中。Model
       mv.addObject("msg","HelloSpringMVC!");
       //封装要跳转的视图,放在ModelAndView中
       mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
       return mv;
  }
   
}

9.将自己的类交给SpringIOC容器,注册bean
因为这个处理BeanNameUrlHandlerMapping,所以要在spring-mvc.xml中注册bean。开发中一般不使用它

<!--Handler-->
<bean id="/hello" class="com.kuang.MyController"/>

10.写要跳转的jsp页面,显示ModelandView存放的数据,以及我们的正常页面;

11.配置Tomcat 启动测试!

2.2 注解方式

1.给项目添加web的支持!
2.由于Maven可能存在资源过滤的问题,我们将配置完善

<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
   </resources>
</build>

3.在pom.xml文件引入相关的依赖:主要有Spring框架核心库、Spring MVC、servlet , JSTL等。

4.配置web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">

   <!--1.注册servlet-->
   <servlet>
       <servlet-name>SpringMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
       <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>

   <!--所有请求都会被springmvc拦截 -->
   <servlet-mapping>
       <servlet-name>SpringMVC</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>

</web-app>

<!--
注意web.xml版本问题,要最新版!

注册DispatcherServlet

关联SpringMVC的配置文件

启动级别为1

映射路径为 / 【不要用/*,会404】
-->

<url-pattern></url-pattern>当中//*的区别
1./不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 。
2./* 会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

5.添加Spring MVC配置文件
在resource目录下添加springmvc-servlet.xml配置文件,配置的形式与Spring容器配置基本类似,为了支持基于注解的IOC,设置了自动扫描包的功能。

<?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"
      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
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

   <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
   <context:component-scan base-package="com.controller"/>
   <!-- 让Spring MVC不处理静态资源 -->
   <mvc:default-servlet-handler />
   <!--
   支持mvc注解驱动
       在spring中一般采用@RequestMapping注解来完成映射关系
       要想使@RequestMapping注解生效
       必须向上下文中注册DefaultAnnotationHandlerMapping
       和一个AnnotationMethodHandlerAdapter实例
       这两个实例分别在类级别和方法级别处理。
       而annotation-driven配置帮助我们自动完成上述两个实例的注入。
    -->
   <mvc:annotation-driven />

   <!-- 视图解析器 -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
         id="internalResourceViewResolver">
       <!-- 前缀 -->
       <property name="prefix" value="/WEB-INF/jsp/" />
       <!-- 后缀 -->
       <property name="suffix" value=".jsp" />
   </bean>
<!--
让IOC的注解生效
静态资源过滤 :HTML . JS . CSS . 图片 , 视频 .....
MVC的注解驱动
配置视图解析器
-->
</beans>

在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。

6.创建Controller


package com.controller;

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

@Controller
@RequestMapping("/MyController")
public class MyController {
    

   //真实访问地址 : 项目名/MyController/hello
   @RequestMapping("/hello")
   public String sayHello(Model model){
    
       //向模型中添加属性msg与值,可以在JSP页面中取出并渲染
       model.addAttribute("msg","hello,SpringMVC");
       //web-inf/jsp/hello.jsp
       return "hello";
  }
}

参考文章:狂神说

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45135434/article/details/119547390

智能推荐

React样式策略_jsx中编写classname 为什么要写styles.-程序员宅基地

文章浏览阅读175次。React样式策略_jsx中编写classname 为什么要写styles.

android获取当前按钮文本,从Android中的EditText获取文本点击按钮-程序员宅基地

文章浏览阅读471次。您好我正在使用android中的计算器。 我有一个EditText在wchich不会显示,具体取决于特定号码的点击,例如当用户按1时,它将显示1.现在当用户点击2时,它将显示12等等。从Android中的EditText获取文本点击按钮我有这样的事情public class Main extends Activity implements OnClickListener {public stati..._androidstudio点击按钮获取文本框内容

第3章 信息系统治理_it审计的固有风险-程序员宅基地

文章浏览阅读679次。第3章 信息系统治理_it审计的固有风险

C语言数组详解-程序员宅基地

文章浏览阅读1.2k次,点赞41次,收藏40次。数组是编程中一种基础且重要的数据结构,用于存储一系列相同类型的元素,这些元素在内存中是连续存放的。在 C 语言中,数组可以存储任何数据类型的元素,如整数、浮点数、字符等。了解数组的工作原理及其特性对于编写有效和高效的程序至关重要。

vue使用QrCode生成二维码_qrcode-vue-程序员宅基地

文章浏览阅读2.9k次。1、安装cnpm i qrcodejs2 --save2、在相应的Vue组件中引入qrcode插件import QRCode from "qrcodejs2";3、在html中增加相应的DOM结构<div id="qrcode"></div>4、在methods定义方法 qrcode() { let qrcode = new QRCode("qrcode", { render: "canvas", //也可以替换为table_qrcode-vue

EMV规范学习与研究(一)——背景介绍_e mv标准语什么开始执行-程序员宅基地

文章浏览阅读582次。 EMV标准是由国际三大银行卡组织--Europay(欧陆卡,已被万事达收购)、MasterCard(万事达卡)和Visa(维萨)共同发起制定的银行卡从磁条卡向智能IC卡转移的技术标准,是基于IC卡的金融支付标准,已成为公认的全球统一标准。1999年2月,当时的国际三大卡组织共同成立了EMVCo组织,用来管理、维护和完善EMV智能(芯片)卡的规格标准。 EMVCo组织的成员有: M..._e mv标准语什么开始执行

随便推点

解决ThinkPad 笔记本电脑无法连接手动添加的隐藏网络问题-提示“无法连接这个网络”_thinkpad e460安装网卡失败,没法上网-程序员宅基地

文章浏览阅读3.8k次。本人ThinkPad E460,Win10操作系统,因为工作内容,需要在特定的网络中开发,要连接隐藏网络。公司分配的是台式机,给了个2.4g的网卡,5g没到货时,用着是在憋屈,所以就用自己的笔记本连接隐藏5g网。然后按照正常步骤进行:点击网络图标 - 网络和Internet设置 - 网络和共享中心 - 设置新的网络 - 手动连接到无线网络 ...当点击连接时就给反馈:“无法连接这个..._thinkpad e460安装网卡失败,没法上网

YOLOV8安卓端部署_yolov8部署到手机-程序员宅基地

文章浏览阅读1.7k次,点赞5次,收藏31次。之前部署的yolov5-ncnn不支持调用本地摄像头进行在线推理,多少还是感觉遗憾。说实话yolov8-ncnn的部署属实有点割韭菜的嫌疑,这篇博客教你从0部署yolov8到安卓手机。_yolov8部署到手机

举例说明计算机图形学的主要应用领域,计算机图形学-程序员宅基地

文章浏览阅读2.6k次。1、 举例说明计算机图形学的主要应用领域(至少说明5个应用领域)计算机及辅助设计与制造、可视化、图形实时绘制与自然景物仿真、计算机动画、用户接口、计算机艺术2、 分别解释直线生成算法DDA法、中点画线法和Bresenham法的基本原理。 DDA法:设过端点P0(x0 ,y0)、P1(x1 ,y1)的直线段为L(P0 ,P1),则直线段L的斜率L的起点P0的横坐标x0向L的终点P1的横坐标x1步进..._列举有关计算机图形学的应用

python中在一个类中调用另一个类的方法_python中类方法如何调用-程序员宅基地

文章浏览阅读5.3w次,点赞17次,收藏67次。通过实例化一个对象,使一个类能调用另一个类的方法主题代码主题描述老张开车去东北这件事类人实例变量:名字name实例方法:去go_to车实例方法:run代码class Person: def __inti__(self,name): self.name = name def go_to(self,position,type): ''' :par..._python中类方法如何调用

Zookeeper可视化工具PrettyZoo_prettyzoo mac-程序员宅基地

文章浏览阅读2.2w次,点赞9次,收藏13次。文章目录安装创建连接虽然市面上 Zookeeper 的 WEB 管理工具很丰富,但是却很难找到一款满意的图形化客户端。鉴于这样的情况,经过时间的查找,找到了这款管理 Zookeeper 的图形化工具,取名 PrettyZoo,意为:Pretty nice Zookeeper GUI。PrettyZoo 是一个基于 JavaFX 和 Apache Curator 实现的 Zookeeper 图形化工具,该项目完全开源,可以通过 Github 主页查看。github:https://github.com_prettyzoo mac

AD10导出文件【摆位图】【上文中comment不是value值得情况】【DXF结构文件】【低版本protel能打开的原理图、PCB文件】【导出gerber文件无边框】_ad生成gerber文件无边框-程序员宅基地

文章浏览阅读8.4k次。方便焊接的值value文件在焊接过程中最方便的是在图中直接显示元件的值,因为这样即知道了这个是什么元件,也知道了这个元件的具体指,最适合手焊,如下:在AD软件中如果在comment这个属性就是值得情况(protel软件)只要把原件的标号隐藏掉,并显示conment即可,元件属性如下:这时候导出设置如下:导出结果如下:但是这时候的导出结果过于混乱,调整方式是直接隐..._ad生成gerber文件无边框

推荐文章

热门文章

相关标签