SpringMVC:组件介绍与流程,结合例子简单使用

本文深入解析SpringMVC的工作原理,涵盖组件与流程、基于XML配置与注解的使用方式,以及开发流程详解,包括配置@RequestMapping、控制器开发、获取请求参数等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringMVC

一、SpringMVC组件与流程(p372)

1.1 组件

在这里插入图片描述

  • DispatcherServlet:前置控制器,整个流程控制的核心,控制其他组件的执行并进行调度,降低组件之间的耦合性
  • HandlerMapping:由Handler处理器和HandlerInterceptor拦截器共同组成,Handler处理器用来完成具体的业务逻辑,DispatcherServlet接收到请求后,根据HandlerMapping将不同请求分映射到不同的Handler。HandlerInterceptor是一个拦截器处理的接口
  • HandlerExecutionChain:处理器执行链,包括一个Handler和一个HandlerInterceptor,一般会由默认拦截器,如果需要自己添加就可以实现这个接口
  • HandlerAdapter:处理器适配器,表单数据类型转换,表单数据封装到JavaBean一系列操作都是由HandlerAdapter完成
  • ModelAndView:装载模型数据和视图信息,这里视图信息是指逻辑视图,作为handler的处理结果返回到DispatcherServlet
  • ViewResolver:视图解析器,将逻辑视图解析为物理视图,最终将结果渲染给客户端
1.2 流程
  • 客户端请求被DispatcherServlet接收
  • DispatcherServlet根据HandlerMapping的映射,将请求映射到Handler
  • 生成Handler以及HandlerInterceptor
  • 返回HandlerExecutionChain(Handler+HandlerInterceptor)给DispatcherServlet
  • DispatcherServlet通过HandlerAdapter执行Handler
  • 返回ModelAndView给DispatcherServlet,包括逻辑视图与模型数据
  • DispatcherServlet通过ViewResolver进行解析
  • 返回填充了模型数据的View,响应给客户端

二、SpringMVC深入使用

2.1 基于XML配置的使用
  • SpringMVC基础配置
  • XML配置Controller、HandlerMapping组件映射
  • XML配置ViewResolver组件映射
2.1.1 导入需要的jar
    <!--spring MVC-->
	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.1RELEASE</version>
    </dependency>
	<!--servlet-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
2.1.2 web.xml配置前置控制器
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置springmvc.xml的路径,contextConfigLocation代表上下文路径-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
      <!--拦截所有请求-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
2.1.3 在java文件下创建MyHandler
public class MyHandler implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        //添加模型数据,加入到request作用域或者JSP内置对象当中
        modelAndView.addObject("name","Tom");
        //添加逻辑视图
        modelAndView.setViewName("show");
        return modelAndView;
    }
}
2.1.4 在resources文件下创建springmvc.xml
<!--配置HandlerMapping,将url请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHadnlerMapping">
    <!--配置mapping-->
    <property name="mappings">
        <pros>
            <!--配置test请求对应的handler-->
            <prop key="/test">testHandler</prop>
        </pros>
    </property>
</bean>

<!--配置handler-->
<bean id="testHandler" class="com.derrick.handler.MyHandler"></bean>

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--配置前缀与后缀-->
    <property name="prefix" value="/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
2.1.5 访问localhost:8080/test

2.2 基于注解方式的使用
  • SpringMVC基础配置
  • Controller,HandlerMapping通过注解进行映射
  • XML配置ViewResolver组件映射
2.2.1 AnnotationHandler
@RequestMapping("/derricktest")
@Controller
public class AnnotationHandler {
    //ModelAndView完成数据的传递、视图的解析
    ModelAndView modelAndView = new ModelAndView();
    //填充模型数据
    modelAndView.addObject("name","Derrick");
    //设置逻辑视图
    modelAndView.setViewName("show");
    return modelAndView;
}
2.2.2 springmvc.xml

为了让springIOC容器知道AnnotationHandler是一个handler,需要将这个类将给IOC容器管理,所以需要配置自动扫描

<!--将controller层所有类自动扫描到IOC容器中-->
<context:component-scan base-package="com.derrick.handler"></context:component-scan>

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--配置前缀与后缀-->
    <property name="prefix" value="/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
2.2.3 业务方法二:使用Model传值,String进行视图解析
@RequestMapping("/derricktest2")
public String ModelTest(Model model){
    //填充模型数据
    model.addAttribute("name","Derrick");
    //设置逻辑视图
    return "show";
}
2.2.4 业务方法三:使用Map传值,String进行视图解析
@RequestMapping("/derricktest3")
public String MapTest(Map<String,User> map){
    //填充模型数据
    map.put("name","derrick");
    //设置逻辑视图
    return "show";
}

三、SpringMVC开发流程详解,课本内容补充(p389)

3.1 配置@RequestMapping
3.1.1 RequestMapping类
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    //请求路径,可以是数组
    String[] value() default {};
    //请求类型,常用的是get和post请求
    RequestMethod[] method() default {};
    //请求参数,当请求带有配置的参数时,才匹配处理器
    String[] params() default {};
    //请求头,当http请求头为配置项时,才匹配处理器
    String[] headers() default {};
	//请求类型为配置类型才匹配处理器
    String[] consumes() default {};
	//处理器之后的响应用户的结果类型
    String[] produces() default {};
}
3.1.2 例子

这里最常用的是请求路径和请求类型,如果没有配置method则所有请求都会响应

@RequestMapping(value="/index2",method=RequestMethod.GET)
3.2 控制器开发
  • 获取请求参数
  • 处理业务逻辑
  • 绑定模型和视图
3.2.1 获取请求参数方法一

建议不使用Servlet容器所给予的API,因为这样控制器将会依赖于Servlet容器,SpringMVChui自动解析代码中的方法参数session、request,然后传递关于Servlet容器的API参数

@RequestMapping("/test")
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
...
}
3.2.2 使用@RequestParam获取参数

如果要获取一个HTTP请求的参数id,可以使用注解方式获取,通过@RequestParam注解,Spring MVC就知道从Http请求中获取参数,在默认情况下参数不能为空,当获取不到HTTP请求的参数的时候,Spring MVC会抛出异常,所以会有两个配置项

  • required:默认为true,即代表不允许参数为空
  • defaultValue:匹配默认值
@RequestMapping("/test")
public ModelAndView handleRequest(@RequestParam("id") Long id){
    //在url中输入:localhost:8080/**/?id=441908080
    System.out.println(id);
    ...
}

@RequestMapping("/test")
public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName){
    ..
}
3.2.3 使用@SessionAttribute获取Session参数

假设系统已经在Session中设置了userName

@RequestMapping("/test")
public ModelAndView index(@SessionAttribute("userName") String userName){
    ...
}
3.2.4 显示JSON数据

由于MappingJackson2JsonView是一个非逻辑视图,因为对于它而言并不需要视图解析器进行解析,返回JSON数据后,提供给Ajax异步请求使用

@RequestMapping("/derricktest")
@Controller
public class AnnotationHandler {
    //ModelAndView完成数据的传递、视图的解析
    ModelAndView modelAndView = new ModelAndView();
    //填充模型数据
    modelAndView.addObject("name","Derrick");
    //指定视图类型
    modelAndView.setView(new MappingJackson2JsonView());
    return modelAndView;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值