返回顶部
首页 > 资讯 > 操作系统 >Spring MVC详解
  • 947
分享到

Spring MVC详解

springmvcjava 2023-08-30 11:08:12 947人浏览 薄情痞子
摘要

文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、

文章目录

一、springMVC


1.1 引言

java开源框架,Spring Framework的一个独立模块。

MVC框架,在项目中开辟MVC层次架构

对控制器中的功能 包装 简化 扩展践行工厂模式,功能架构在工厂之上

1.2 mvc架构

1.2.1 概念
名称职责
Model模型:即业务模型,负责完成业务中的数据通信处理,对应项目中的 service和dao
View视图:渲染数据,生成页面。对应项目中的jsp
Controller控制器:直接对接请求,控制MVC流程,调度模型,选择视图。对应项目中的Servlet
1.2.2 好处
  • MVC是现下软件开发中的最流行的代码结构形态;

  • 人们根据负责的不同逻辑,将项目中的代码分成 M V C 3个层次;

  • 层次内部职责单一,层次之间耦合度低;

  • 符合低耦合 高内聚的设计理念。也实际有利于项目的长期维护。

二、开发流程


2.1 导入依赖

<dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-WEBmvcartifactId>    <version>5.1.6.RELEASEversion>dependency>

2.2 配置核心(前端)控制器

作为一个MVC框架,首先要解决的是:如何能够收到请求!

所以MVC框架大都会设计一款前端控制器,选型在 Servlet 或 Filter两者之一,在框架最前沿率先工作,接收所有请求。

此控制器在接收到请求后,还会负责springMVC的核心的调度管理,所以既是前端又是核心。

<servlet>    <servlet-name>mvcservlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>        <init-param>        <param-name>contextConfigLocationparam-name>        <param-value>classpath:mvc.xmlparam-value>    init-param>        <load-on-startup>1load-on-startup>servlet><servlet-mapping>    <servlet-name>mvcservlet-name>    <url-pattern>/url-pattern>servlet-mapping>

2.3 后端控制器

等价于之前定义的Servlet

@Controller //声明这是一个控制器@RequestMapping("/hello")  //访问路径 ,等价于url-patternpublic class HelloController {@RequestMapping("/test1")  //访问路径public String hello1(){System.out.println("hello world");return "index"; // 跳转:/index.jsp  }@RequestMapping("/test2") //访问路径public String hello2(){System.out.println("hello c9");return "views/users";//  跳转:/views/user.jsp}}

2.4 配置文件

默认名称:核心控制器名-servet.xml 默认位置:WEB-INF

随意名称:mvc.xml 随意位置:resources 但需要配置在核心控制器中

<beans xmlns="Http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.qf.controller">context:component-scan><mvc:annotation-driven>mvc:annotation-driven><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/">property><property name="suffix" value=".jsp">property>bean>beans>

2.5 访问

http://localhost:8989/hello/test1http://localhost:8989/hello/test2

接口方法的返回值:

  1. 没有返回值
  2. 返回逻辑视图名
  3. 返回字符串
  4. 返回 JSON

三、接收请求参数


3.1 基本类型参数

请求参数和方法的形参 同名即可

springMVC默认可以识别的日期字符串格式为: yyyy/MM/dd HH:mm:ss
通过@DateTimeFORMat可以修改默认日志格式

// id  name gender// http://localhost:8989/xxx/../test1?id=1&name=zzz&gender=false&birth=2018-12-12 12:20:30@RequestMapping("/test1")public String testParam1(Integer id,                         String name,                         Boolean gender,                         @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date birth){    System.out.println("test param1");    return "index";}

3.2 实体收参【重点

请求参数和实体的属性 同名即可

public class User {private Integer id;private String name;@DateTimeFormat(pattern="yyyy-MM-dd")private Date birth;private Boolean gender;//set/get ...}//http://localhost:8989/.../test2?id=1&name=zzz&gender=false&birth=2018-12-12 12:20:30@RequestMapping("/test2")public String testParam2(User user){    System.out.println("test param2");    System.out.println("user:"+user);    return "index";}

3.3 数组收参

简单类型的 数组

<form>    ......    <input type="checkbox" name="hobby" value="fb"/>足球     <input type="checkbox" name="hobby" value="bb"/>篮球     <input type="checkbox" name="hobby" value="vb"/>排球    form>
//http://localhost:8989/.../test3?hobby=football&hobby=basketball@RequestMapping("/test3")public String testParam3(String[] hobby){    for(String h:hobby){        System.out.print(h+" ");    }    return "index";}

3.4 集合收参 【了解】

public class UserList {//private User[] users;private List<User> users;//set/get..}// // post请求:http://...?users[0].id=1&users[0].name=zhangsan&users[0].birth=2018-12-12&users[1].id=2&....@RequestMapping("/test4")public String testParam4(UserList userList){    for(User user:userList.getUsers()){        System.out.println(user);    }    return "index";}

3.5 路径参数

// {id} 定义名为id的路径;【/hello/{id}】的匹配能力和【/hello@Overridepublic ModelAndView resolveException(httpservletRequest request,HttpServletResponse response, Object handler, Exception ex) {ex.printStackTrace();//打印异常栈//创建一个ModelAndViewModelAndView mv = new ModelAndView();//识别异常if (ex instanceof Exception1) {mv.setViewName("redirect:/xxx/error1");}else if(ex instanceof Exception2){mv.setViewName("redirect:/xxx/error2");}else{mv.setViewName("redirect:/xxx/error");}return mv;}}
<bean class="com.baizhi.exception.resolver.MyExResolver">bean>

九、拦截器

和过滤器的区别:

  • 执行时机:拦截器晚于过滤器。
  • 拦截器是一种 aop 风格的过滤器。

9.1 作用

作用:抽取handler中的冗余功能

9.2 定义拦截器

执行顺序: preHandle–postHandle–afterCompletion

public class MyInter1 implements HandlerInterceptor{//主要逻辑:在handler之前执行:抽取handler中的冗余代码@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {System.out.println("pre~~~");        return true;//放行,后续的拦截器或handler就会执行}//在handler之后执行:进一步的响应定制@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("post~~");}//在页面渲染完毕之后,执行:资源回收@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("after~~");}}

9.3 配置拦截路径

<mvc:interceptors>    <mvc:interceptor>        <mvc:mapping path="/inter/test1"/>        <mvc:mapping path="/inter/test2"/>        <mvc:mapping path="/inter/test*"/>         <mvc:mapping path="/inter    }function delUser(){  // 发送删除请求        var xhr = new XMLHttpRequest();        //定义 put,delete,get,post方式 即可,不用定义_method        xhr.open("delete","${pageContext.request.contextPath}/rest04/users/1");        xhr.send();        xhr.onreadystatechange=function(){            if(xhr.readyState==4 && xhr.status==200){                var ret = xhr.responseText;                console.log(JSON.parse(ret));            }        }    }script>

十四、跨域请求


14.1 域

域:协议+IP(域名)+端口

  • http://localhost:8989

  • http://localhost:8080

  • http://www.baidu.com:80

14.2 ajax跨域问题

  • Ajax发送请求时,不允许跨域,以防用户信息泄露。

  • 当Ajax跨域请求时,响应会被浏览器拦截(同源策略),并报错。即浏览器默认不允许ajax跨域得到响应内容。

  • 互相信任的域之间如果需要ajax访问,(比如前后端分离项目中,前端项目和后端项目之间),则需要额外的设置才可正常请求。

14.3 解决方案

  • 允许其他域访问

  • 在被访问方的Controller类上,添加注解

@CrossOrigin("http://localhost:8080") //允许此域发请求访问public class SysUserController {....}
  • 携带对方cookie,使得session可用

  • 在访问方,ajax中添加属性:withCredentials: true

$.ajax({     type: "POST",     url: "http://localhost:8989/web/sys/login",     ...,     xhrFields: {       // 跨域携带cookie       withCredentials: true     }});var xhr = new XMLHttpRequest();// 跨域携带cookiexhr.withCredentials=true;

十五、SpringMVC执行流程


在这里插入图片描述

十六、Spring整合


16.1 整合思路

此时项目中有两个工厂

  • DispatcherServlet 启动的springMVC工厂==负责生产C及springMVC自己的系统组件
  • ContextLoaderListener 启动的spring工厂==负责生产其他所有组件
  • springMVC的工厂会被设置为spring工厂的子工厂,可以随意获取spring工厂中的组件
  • 整合过程,就是累加:代码+依赖+配置。然后将service注入给controller即可

16.2 整合技巧

Spring 是一个父容器,SpringMVC 是一个子容器,子容器中可以访问父容器的组件,父容器不可以访问子容器的组件。

例如,我们将 Service、Dao、Component 都注册到 Spring 容器中,将 Controller 注册到 SpringMVC 容器中,则在 Controller 中,可以注入 Service、Dao、Component ;但是 Service、Dao、Component 中无法注入 Controller。

两个工厂不能有彼此侵入,即,生产的组件不能有重合。

<context:component-scan base-package="com.zhj" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>context:component-scan>
<context:component-scan base-package="com.zhj" use-default-filters="true"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>context:component-scan>

服务端数据校验:http://springmvc.javaboy.org/2019/1112/validation

来源地址:https://blog.csdn.net/a2285786446/article/details/132477081

--结束END--

本文标题: Spring MVC详解

本文链接: https://lsjlt.com/news/382659.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring MVC详解
    文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、...
    99+
    2023-08-30
    spring mvc java
  • Spring MVC 详解 (Spring Boot)
    Spring MVC 详解 - Spring Boot 一、什么是 Spring MVC1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系1.3 学习目的 二、Spring MVC 创建和连接2.1 创建 Sp...
    99+
    2023-12-22
    spring mvc spring boot java 后端
  • 详解Spring MVC CORS 跨域
    介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求时:简单请求(先简单理解为正常的get/post吧):浏览器将请求的地址添加到header的Origin里面发送请求。接...
    99+
    2023-05-31
    spring mvc cors
  • Spring MVC的web.xml配置详解
    spring是目前最流行的框架。创建java web项目时,我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中。下面我们将简单讲讲web.xml中的配置。一、一个空的web.xml<...
    99+
    2023-05-31
    spring mvc web.xml
  • 详解Spring MVC事务配置
    要了解事务配置的所有方法,请看一下《Spring事务配置的5种方法》本文介绍两种配置方法: 一、XML,使用tx标签配置拦截器实现事务二、Annotation方式以下所使用环境为Spring4.0.3、Hibernate4.3.5...
    99+
    2023-05-31
    spring mvc 事务
  • Spring MVC详解(学习总结)
    一、Sprig MVC简介1.1介绍1.2MVC是什么 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、第一个Spring MVC四、常用注解五、参数绑定5.1URL风格参数绑定5.2RESTful风格...
    99+
    2023-08-16
    mvc spring 学习 Spring MVC
  • Spring中MVC模块代码详解
    SpringMVC的Controller用于处理用户的请求。Controller相当于Struts1里的Action,他们的实现机制、运行原理都类似Controller是个接口,一般直接继承AbstrcatController,并实现han...
    99+
    2023-05-30
    springmvc 多模块 sprin
  • 详解Spring MVC 集成EHCache缓存
    废话少说,直接上代码:ehcache.xml 文件<?xml version="1.0" encoding="UTF-8"?><ehcache dynamicConfig="false" monitorin...
    99+
    2023-05-31
    spring mvc ehcache
  • Spring MVC数据响应处理详解
    目录1. 内置视图解析器2. 使用原生servlet的对象传递数据3. 使用ModelAndView对象传输数据4. 使用Model、Map、ModelMap传输数据5. 使用ses...
    99+
    2024-04-02
  • 详解spring mvc中url-pattern的写法
    在Spring MVC中,URL pattern用于指定请求的URL应该如何映射到控制器方法。URL pattern可以在配置文件(...
    99+
    2023-08-11
    spring
  • spring mvc中的@PathVariable动态参数详解
    目录springmvc@PathVariable动态参数springmvc是如何做到根据参数名动态绑定参数的?反射获取参数名-parameters参数-g参数ASMSpringMVC...
    99+
    2024-04-02
  • Spring手写简化版MVC流程详解
    spring是一个非常流行的技术框架,其中spring mvc组件在其中非常重要的地位,主要面要客户端提供服务,我们今天来手写一个简化版的mvc,且包括ioc部分,主要利用servl...
    99+
    2022-11-16
    Spring MVC Spring手写MVC
  • Spring MVC项目中的异常处理详解
    目录前言1. 基于配置的简单异常处理2. 基于注解的全局异常处理总结 前言 我们在项目的开发中,难免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统...
    99+
    2024-04-02
  • Spring MVC项目中log4J和AOP使用详解
    前言日志处理是每个项目当中一个非常重要的内容。没有了日志,也就失去了对系统的可控性。没有日志,系统出现任何问题,都会没有踪迹可寻,这对一个信息系统而言是非常危险的。项目中需要将service中的类方法的调用过程,使用log4j日志记录。se...
    99+
    2023-05-30
    springmvc aop log4j
  • Java spring mvc请求详情介绍
    目录一、源码执行流程二、源码执行流程图三、spring mvc中的一核心组件四、源码分析五、获取组件相关逻辑:六、获取参数,执行方法源码分析七、渲染视图逻辑前言: 本文源码基于spr...
    99+
    2024-04-02
  • Java Spring MVC获取请求数据详解操作
    目录1. 获得请求参数2. 获得基本类型参数3. 获得POJO类型参数4. 获得数组类型参数5. 获得集合类型参数6. 请求数据乱码问题7. 参数绑定注解 @requestParam...
    99+
    2024-04-02
  • Java 超详细讲解Spring MVC异常处理机制
    目录异常处理机制流程图异常处理的两种方式简单异常处理器SimpleMappingExceptionResolver自定义异常处理步骤本章小结异常处理机制流程图 系统中异常包括两类: ...
    99+
    2024-04-02
  • Spring Mvc中传递参数方法之url/requestMapping详解
    前言相信大家在使用spring的项目中,前台传递参数到后台是经常遇到的事, 我们必须熟练掌握一些常用的参数传递方式和注解的使用,本文将给大家介绍关于Spring Mvc中传递参数方法之url/requestMapping的相关内容,分享出来...
    99+
    2023-05-31
    springmvc 参数传递 url
  • Spring Boot中使用Spring MVC的示例解析
    目录1.MVC2.Spring MVC3.Spring Boot中使用Spring MVC3.1.配置3.1.1.文件配置3.1.2.代码配置3.2.使用3.2.1.映射处理器3.2...
    99+
    2023-05-15
    Spring Boot使用Spring MVC Spring Boot Spring MVC
  • Spring MVC利用Swagger2如何构建动态RESTful API详解
    前言本文主要给大家介绍了关于Spring MVC用Swagger2构建动态RESTful API的相关内容,当多终端(WEB/移动端)需要公用业务逻辑时,一般会构建 RESTful 风格的服务提供给多终端使用。为了减少与对应终端开发团队频繁...
    99+
    2023-05-30
    swagger2 springmvc restful
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作