初识SpringMVC框架

1. MVC模式是什么

MVC(Model-View-Controller)是一种设计模式,将应用程序分为三部分:

  • Model(模型):管理应用的数据和业务逻辑
  • View(视图):负责数据展示
  • Controller(控制器):处理用户输入,调用模型和视图
2. 搭建SpringMVC环境

配置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">
<!--    前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        加载配置文件springmvc-servlet.xml-->
        <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>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

配置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: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.xsd">

<!--	定义控制器-->
<!--	定义扫包后要注释掉否则会冲突-->
<!--	<bean name="/hello" class="com.ktjy.controller.HelloController"/>-->


<!--	开启注解驱动-->
	<mvc:annotation-driven/>
<!--	扫包-->
	<context:component-scan base-package="com.ktjy.controller"/>

<!--	视图对应-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix"	value="/WEB-INF/jsp/"/>
		<property name="suffix" value=".jsp"/>
	</bean>

</beans>

(2) 使用注解开发SpringMVC框架

定义控制器HelloController

@Controller
@RequestMapping(value = "/hello")
public class HelloController  {

    Logger logger = Logger.getLogger(HelloController.class);

    @RequestMapping(value = "/hello")
    public ModelAndView hello(@RequestParam String realName) throws Exception {
        logger.info("你好【"+realName+"】欢迎来到SpringMVC课堂");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("realName",realName);
        modelAndView.setViewName("hello");
        return modelAndView;
    }
}

(3) SpringMVC框架梳理

  • DispatcherServlet作为前端控制器,分发请求
  • 使用注解如@Controller@RequestMapping定义控制器和请求映射
  • 视图解析器(如InternalResourceViewResolver)用于解析视图名称
SpringMVC工作流程
  1. 客户端请求发送到服务器

    • 客户端(如浏览器)发送HTTP请求到服务器
  2. DispatcherServlet拦截请求

    • 服务器将请求传递给DispatcherServlet,这是SpringMVC的前端控制器DispatcherServletweb.xml中配置的URL模式映射
  3. 请求处理器映射

    • DispatcherServlet使用HandlerMapping接口查找请求的具体处理器(即控制器)HandlerMapping根据请求的URL找到相应的控制器和方法
  4. 调用处理器(控制器)

    • 一旦找到处理器,DispatcherServlet将请求转发给相应的控制器方法
    • 控制器方法通常通过注解@RequestMapping等来映射请求。控制器处理请求并生成模型数据
  5. 模型数据与视图名返回

    • 控制器处理完成后返回ModelAndView对象或视图名字符串
    • ModelAndView包含视图名和模型数据。视图名是逻辑视图名,如"hello"
  6. 视图解析

    • DispatcherServlet使用ViewResolver接口解析逻辑视图名为具体的视图对象(如JSP、Thymeleaf模板)
    • ViewResolver根据配置找到视图文件(如hello.jsp
  7. 渲染视图

    • 视图对象负责将模型数据渲染为HTML内容。渲染的视图是服务器生成的HTML页面
  8. 生成HTTP响应

    • 渲染完成后,视图生成的内容(通常是HTML)作为HTTP响应体发送回客户端
  9. 客户端显示结果

    • 客户端接收到HTTP响应,浏览器解析并展示结果页面
前后端数据交互

SpringMVC提供了丰富的机制来处理客户端和服务器之间的数据交互,包括请求参数绑定、请求处理、以及数据响应

1. 请求参数绑定
  • @RequestParam

    • 用于将请求中的参数绑定到控制器方法的参数上。可以指定参数名称和是否为必需参数
    • @Controller
      public class HelloController {
      
          @RequestMapping("/hello")
          public String handleRequest(@RequestParam(name = "name", required = false, defaultValue = "Guest") String name, Model model) {
              model.addAttribute("name", name);
              return "hello";
          }
      }
      
  • @PathVariable

    • 用于绑定URL路径中的变量部分到控制器方法的参数
@Controller
public class ProductController {

    @RequestMapping("/product/{id}")
    public String getProduct(@PathVariable("id") int productId, Model model) {
        // 根据 productId 获取产品信息
        model.addAttribute("product", productService.getProductById(productId));
        return "product";
    }
}

URL如/product/123会将路径中的123绑定到方法参数productId

  • @RequestBody

    • 用于将请求体中的内容绑定到方法参数(通常用于接收JSON数据)
@Controller
public class UserController {

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    @ResponseBody
    public User createUser(@RequestBody User user) {
        // 处理用户数据
        return userService.save(user);
    }
}


请求体包含的JSON数据会自动映射到User对象中

2. 响应数据处理
  • 返回视图名

    • 控制器方法通常返回一个视图名,SpringMVC会使用视图解析器将视图名映射为实际的视图(如JSP页面)
@Controller
public class HomeController {

    @RequestMapping("/home")
    public String home() {
        return "homeView";
    }
}

这里返回的"homeView"会被视图解析器处理

  • @ResponseBody

    • 用于直接将方法返回值作为HTTP响应体发送给客户端,适用于返回JSON或XML等数据格式
@Controller
public class UserController {

    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    @ResponseBody
    public User getUser(@PathVariable("id") int id) {
        return userService.getUserById(id);
    }
}

返回的User对象会自动转换为JSON格式

视图解析器

视图解析器负责将控制器返回的逻辑视图名(通常是字符串)解析为具体的视图对象(如JSP、Thymeleaf模板等),然后通过这些视图对象来渲染数据

1. 常见的视图解析器
  • InternalResourceViewResolver

    • 用于解析JSP视图。它将逻辑视图名与实际的JSP文件路径进行映射
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>


这意味着逻辑视图名home将被解析为/WEB-INF/views/home.jsp

  • ThymeleafViewResolver

    • 用于解析Thymeleaf模板。适合需要复杂页面布局和动态内容的应用。
@Bean
public ThymeleafViewResolver viewResolver() {
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    resolver.setTemplateEngine(templateEngine());
    resolver.setCharacterEncoding("UTF-8");
    resolver.setOrder(1);
    return resolver;
}
  • 其他视图解析器

    • 包括FreeMarkerViewResolverVelocityViewResolver等,支持不同的模板引擎。
2. 工作原理

当控制器方法返回一个逻辑视图名时,DispatcherServlet会使用视图解析器根据视图名查找并渲染视图。视图解析器的主要任务是拼接视图路径和扩展名,并找到合适的视图资源来展示数据

例如,InternalResourceViewResolver会将逻辑视图名"home"映射到"/WEB-INF/views/home.jsp",然后将模型数据传递给JSP页面进行渲染

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值