Spring MVC体系结构和处理请求控制器

本文介绍了Spring MVC的体系结构和处理请求流程。用户请求先到前端控制器,再由其委托给处理器,处理器处理后返回ModelAndView,前端控制器完成视图渲染并返回响应。此外,还说明了使用Spring MVC进行环境搭建的步骤,包括导入jar包、配置Servlet、创建配置文件等。

Spring MVC体系结构和处理请求控制器

1.请求处理流程及体系结构

Spring MVC请求处理流程

在这里插入图片描述

  1. 首先用户发送请求到前端控制器(DispatcherServlet),前端控制器根据用户传入的请求信息决定用哪个页面控制器/处理器(Controller)来处理,并把请求委托给处理器。
  2. 页面控制器/处理器(Controller)接收到请求后,调用业务对象,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)。
  3. 前端控制器收回控制权,然后根据返回的逻辑视图名找到真正的视图,并把模型数据传入以便展示视图渲染。
  4. 前端控制器再次收回控制权,将响应结果返回给用户。
Spring MVC框架的体系结构

在这里插入图片描述

  1. 客户端发出HTTP请求,Web应用服务器接收请求。若匹配DispatcherServlet的请求映射路径(在web.xml中指定),则Web容器将该请求转交给DispatcherServlet处理。
  2. DispatcherServlet接收请求后,将根据请求的信息(包括URL、请求参数、HTTP方法等)及HandlerMapping的配置(在-servlet.xml中配置)找到处理请求的处理器(Handler)。
  3. 当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter可以理解为具体使用Handler来干活的人。
  4. 在请求信息到达真正调用Handler的处理方法之前的这段时间里,Spring MVC会将请求信息以一定的方式转换并绑定到请求方法的入参中,对于入参对象会进行数据转换、数据格式化以及数据校验等操作。在这些之后,真正地调用Handler的处理方法进行相应的业务逻辑处理。
  5. 处理器完成业务逻辑处理之后将返回一个ModelAndView对象给DispatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息。
  6. ModelAndView对象中包含的是“逻辑视图名”而非真正的视图对象。DispatcherServlet会通过ViewResolver将逻辑视图名解析为真真的视图对象View。当然,负责数据展示的视图可以是JSP、XML、PDF、JSON等多种数据格式,对此Spring MVC均可灵活配置。
  7. 当得到真实的视图对象View后,DispatcherServlet会使用ModelAndView对象中的模型数据对View进行视图渲染。
  8. 最终客户端获得响应消息,可以是普通的HTML页面,也可以是一个XML或者JSON格式的数据等。

2.使用Spring MVC进行环境搭建

使用Spring MVC框架的步骤如下:
1.下载jar文件
 	spring-web-3.2.13.RELEASE.jar
	spring-webmvc-3.2.13
2.配置文件
	在web.xml中配置Servlet
	创建Spring MVC的配置文件
3.创建Controller-处理请求的控制器
	BeanNameURLHandlerMapping
4.创建View-jsp
5.部署运行

在导入相关jar包后,在web.xml中配置Servlet,具体代码如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <!-- 核心控制器的配置 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
      <!-- 注此 springmvc-servlet.xml 要与 创建的springmvc的配置文件名一样-->
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app>

之后再创建Spring MVC的配置文件(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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       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.xsd">

    <!--扫描注解@Controller  @RequestMapping-->
    <context:component-scan base-package="cn.kgc.controller"/>

    <mvc:annotation-driven/>
    
    <!-- 完成视图的对应 -->
    <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
        <!--/WEB-INF/jsp/index.jsp-->
        <!--/WEB-INF/jsp/userlist.jsp-->
    </bean>

</beans>

在cn.kgc.controller包下创建IndexController

package cn.kgc.controller;

import cn.kgc.entity.User;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * User: LiKai
 * Date: 2019/7/11
 * Time: 18:15
 */
@Controller
@RequestMapping("/index")
public class IndexController {
    private Logger log = Logger.getLogger(IndexController.class);

    @RequestMapping({"/test","/"})
    public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
        log.info("test succeed");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }

    @RequestMapping(value = "/welcome", method = RequestMethod.GET)
    public ModelAndView welcome(@RequestParam(value = "username",required = false) String username) {
        log.info("test succeed!! POST username: " + username);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }

    @RequestMapping(value = "/test2")
    public ModelAndView index2(@RequestParam String username) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username",username);
        modelAndView.setViewName("index");
        log.info("hello spring mvc!!");
        return modelAndView;
    }
	
    @RequestMapping(value = "/test3")
    public String index3(String username, Model model) {
        model.addAttribute("userName",username);
        model.addAttribute(username);
        User user = new User();
        user.setUserName(username);
        model.addAttribute(user);
        model.addAttribute("current",user);
        log.info("hello spring mvc!user test!");
        return "index";
    }
    @RequestMapping(value = "/test4")
    public String index4(String username, Map<String,Object> model) {
        model.put("username", username);
        return "index";
    }
}

创建View
        在第二部配置视图解析器时,根据定义prefix(前缀) —/WEB-INF/jsp/和suffix(后缀)—.jsp所以在WEB-INF下创建jsp文件夹,并在该文件夹下创建真正的JSP视图–index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%-- <%@ page isELIgnored="true|false"%>
   如果设定为真,那么JSP中的表达式被
当成字符串处理。比如下面这个表达式<p>${2000 % 20}</p>
在isELIgnored="true"时输出为${2000 % 20},
而isELIgnored="false"时输出为100。--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Hello Spring MVC</h1>

<h1>username----------->${userName}</h1>
<h1>username----------->${string}</h1>
<h1>username----------->${user.userName}</h1>
<h1>username current----------->${current.userName}</h1>
<h1>username map----------->${username}</h1>
</body>
</html>
本文旨在系统阐述利用MATLAB平台执行多模态语音分离任务的方法,重点围绕LRS3数据集的数据生成流程展开。LRS3(长时RGB+音频语音数据集)作为一个规模庞大的视频与音频集合,整合了丰富的视觉与听觉信息,适用于语音识别、语音分离及情感分析等多种研究场景。MATLAB凭借其高效的数值计算能力与完备的编程环境,成为处理此类多模态任务的适宜工具。 多模态语音分离的核心在于综合利用视觉与听觉等多种输入信息来解析语音信号。具体而言,该任务的目标是从混合音频中分离出不同说话人的声音,并借助视频中的唇部运动信息作为辅助线索。LRS3数据集包含大量同步的视频与音频片段,提供RGB视频、单声道音频及对应的文本转录,为多模态语音处理算法的开发与评估提供了重要平台。其高质量与大容量使其成为该领域的关键资源。 在相关资源包中,主要包含以下两部分内容: 1. 说明文档:该文件详细阐述了项目的整体结构、代码运行方式、预期结果以及可能遇到的问题与解决方案。在进行数据处理或模型训练前,仔细阅读此文档对正确理解与操作代码至关重要。 2. 专用于语音分离任务的LRS3数据集版本:解压后可获得原始的视频、音频及转录文件,这些数据将由MATLAB脚本读取并用于生成后续训练与测试所需的数据。 基于MATLAB的多模态语音分离通常遵循以下步骤: 1. 数据预处理:从LRS3数据集中提取每段视频的音频特征与视觉特征。音频特征可包括梅尔频率倒谱系数、感知线性预测系数等;视觉特征则涉及唇部运动的检测与关键点定位。 2. 特征融合:将提取的音频特征与视觉特征相结合,构建多模态表示。融合方式可采用简单拼接、加权融合或基于深度学习模型的复杂方法。 3. 模型构建:设计并实现用于语音分离的模型。传统方法可采用自适应滤波器或矩阵分解,而深度学习方法如U-Net、Transformer等在多模态学习中表现优异。 4. 训练与优化:使用预处理后的数据对模型进行训练,并通过交叉验证与超参数调整来优化模型性能。 5. 评估与应用:采用信号失真比、信号干扰比及信号伪影比等标准指标评估模型性能。若结果满足要求,该模型可进一步应用于实际语音分离任务。 借助MATLAB强大的矩阵运算功能与信号处理工具箱,上述步骤得以有效实施。需注意的是,多模态任务常需大量计算资源,处理大规模数据集时可能需要对代码进行优化或借助GPU加速。所提供的MATLAB脚本为多模态语音分离研究奠定了基础,通过深入理解与运用这些脚本,研究者可更扎实地掌握语音分离的原理,从而提升其在实用场景中的性能表现。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值