SpringMVC笔记

本文详细介绍了SpringMVC的程序执行过程,从用户请求到DispatcherServlet,再到处理器映射器、处理器适配器、视图解析器的工作原理。此外,还探讨了SpringMVC的注解使用,包括DispatcherServlet、Controller、RequestMapping的使用场景,以及组合注解的简化。最后,讲解了参数与返回值的处理方式,如redirect和forward,以及ViewResolver的作用。
摘要由CSDN通过智能技术生成

Spring

SpringMVC程序执行过程

  • 用户通过浏览器向服务器发动请求,请求会被SpringMVC的前端拦截器(DispatcherServlet)所拦截
  • DispatcherServlet拦截以后会调用HandlerMapping处理器映射器
  • 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给DispatcherServlet
  • DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)
  • HandlerAdapter会调用并执行Handler(处理器),这里的处理器就是程序中的Controller,也被称为后端控制器
  • Controller执行完以后,会返回一个ModelAndView对象,该对象中包含视图名或包含模型与视图名
  • HandlerAdapter将ModelAndView对象返回给DispatcherServlet
  • DispatcherServlet会根据MAV对象选择一个合适的ViewResolver(视图解析器)
  • ViewResolver解析后,会向Dispatcher Servlet中返回具体的view(视图)
  • Dispatcher Servlet对view进行渲染(即将模型数据填充至视图中)
  • 视图渲染结果会返回给客户端浏览器显示

DispatcherServlet,HandlerMapping,HandlerAdapter,ViewResolver对象的工作是在框架内部执行的,开发人员不需要关心这些对象的内部实现,只需要配置前端控制器(DispatcherServlet),完成Controller中的业务处理并在视图(view)中展示响应的信息即可

Spring MVC注解

在spring2.5之前,只能使用实现Controller接口的方法来开发一个Controller控制器,在spring2.5之后,新增了基于注解的控制器以及其他的一些常用注解,非常方便

DispatcherServlet

DispatcherServlet在程序中充当着前端控制器的角色,在使用DispatcherServlet时只需要将其配置在web.xml中即可

代码如下

<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-config.xml</param-value>
    </init-param>
    <!--容器在启动时自动加载servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

如果配置中没通过init-param配置servletXml文件的地址,应用程序就会去WEB-INF目录下自动寻找如下格式命名的配置文件

servletName-servlet.xml

Controller

Controller注解类型用于指示该类是一个控制器,其注解形式为@Controller.该注解在使用时就不再需要实现Conreoller接口,只需要将该注解加到控制器类上,然后通过Spring扫描即可。

实例

import org.springframework.stereotype.Controller

//Controller注解
@Controller
public class ControllerTest{
	......
}

为了保证spring框架可以找到该控制器类,还需要再springmvc的配置文件中添加相应的扫描配置信息

完整配置实例:

<?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">
	<!--指定需要扫描的包-->
	<context:component-scan base-package="com.ssm.controller" />
</beans>

Controller接口的实现类只能处理一个单一的请求动作,而基于注解的控制器可以同时处理多个请求动作,在使用上更加灵活。

RequestMapping

Spring通过注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用RequestMapping注解类型。
RequestMapping用于映射一个请求或一个方法,其注解形式为@RequestMapping,可以使用该注解标注在一个方法或者一个类上。

标注在一个方法上

当标注在一个方法上时,该方法会成为一个请求处理方法,他会在程序接收到对应的URL请求时被调用。

实例

@Controller
public class AnnotationControllerTest{
	@RequestMapping(value="/annotationController")
	public ModelAndView handleRequest(HttpServletQuest arg0,HttpServletResponse arg1)throws Exception{
	//handleRequest方法就可以通过地址localhost:8080/chapter11/annotationController来访问
	......
	return modelAndView;
	}

}

使用RequestMapping标注以后,上述代码中的handleRequest方法就可以通过地址localhost:8080/chapter11/annotationController来访问

标注在一个类上

当标注在一个类上时,该类的所有方法都将映射为对应类级别的请求,标识该控制器所处理的所有请求都被映射到value属性值所指定的路径下。

实例

@Controller
@RequestMapping(value="/controll")
public class AnnotationControllerTest{
	@RequestMapping(value="/annotationController")
	public ModelAndView handleRequest(HttpServletQuest arg0,HttpServletResponse arg1)throws Exception{
	//handleRequest方法就可以通过地址localhost:8080/chapter11/controll/annotationController来访问
	......
	return modelAndView;
	}

}

由于在类上添加了@RequestMapping注解,并且其value值为"/controll",因此上述代码方法的请求路径就会变成localhost:8080/chapter11/controll/annotationController,如果该类中还有其他方法,那么在其他方法的请求路径中也需要加入"/controll"

属性名类型描述
nameString可选属性,用于为映射地址指定别名。
valueString[]可选属性,同时也是默认属性,用于映射一个请求和一种方法,可以标注在一个方法或一个类上。
methodRequestMethod[]可选属性,用于指定该方法用于处理哪种类型的请求方式,其请求方式包括GET、POST、HEAD、OPTIONS、 PUT、PATCH、DELETE和TRACE 例如method=RequestMethod.GET表示只支持GET请求,如果需要支持多个请求方式则需要通过{}写成数组的形式,并且多个请求方式之间是有英文逗号分隔。
paramsString[]可选属性,用于指定Request中必须包含某些参数的值,才可以通过其标注的方法处理。
headersString[]可选属性,用于指定Request中必须包含某些指定的header的值,才可以通过其标注的方法处理。
consumesString[]可选属性,用于指定处理请求的提交内容类型(Content-type),比如application/json,text/html等。
producesString[]可选属性,用于指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。

所有的属性都是可选的,但其默认属性是value。当value是其唯一属性值时,可以省略属性名。

组合注解

从Spring4.3版本开始引入了组合注释来帮助简化常用的HTTP方法映射,并更好地表达被注释方法的语义。组合注释如下所示:

名称说明
@GetMappingGET方式的请求
@PostMappingPOST方式的请求
@PutMappingPUT方式请求
@DeleteMappingDELETE方式的请求
@PathMappingPATCH方式的请求

以@GetMapping为例,该组合注解是@RequestMapping(method=RequestMethod.GET)的缩写,它会将Http Get映射到特定的处理方法上。在实际开发中,传统的@RequestMapping注解使用方式如下。

@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
public String selectUserById(String id){
......
}

使用新注解@GetMapping后,可以省略method属性,从而简化代码,使用方式如下:

@GetMapping("/user/{id}")
public String selectUserById(){
......
}

参数与返回值

上面实例中请求处理方法返回的是一个ModelAndView类型的数据。除了这种类型外,请求处理方法还可以返回其他类型的数据。如下:

  • ModelAndView
  • Model
  • Map
  • View
  • String
  • void
  • HttpEntity<?>或ResponseEntity<?>
  • Callable<?>
  • DeferredResult<?>

上面的而返回类型中,常见的返回类型有ModelAndView,String和void。其中,ModelAndView可以添加Model数据,并指定视图;String类型的返回值可以跳转视图,但不能携带数据;而void类型主要是在异步请求的时候使用,他只是返回数据,而不会跳转视图。

由于ModelAndView类型未能完成数据与视图之间的解耦,因此在开发时,方法的返回类型通常会使用String,既然String类型的返回值不能携带数据,那么在方法中如何完成数据的带入呢?这里就用到了Model类型了,通过该参数类型即可添加需要在视图中显示的数据

实例

@RequestMapping("/annotationController")
public String handlerRequest(HttpServletQuest arg0,HttpServletResponse arg1,Model model)throw Exception{
	model.addAttribute("msg","第一个SpringMVC程序");
	return "/WEB-INF/jsp/welcome.jsp"
}
redirect复位向

例如,在修改用户信息后,将请求复位向到用户查询方法下

@RequestMapping("/update")
public String update(HttpServletQuest arg0,HttpServletResponse arg1,Model model)throw Exception{
	model.addAttribute("msg","第一个SpringMVC程序");
	return "redirect:queryUser"
}
forward转发

例如,用户执行修改操作时,转发到用户修改页面

@RequestMapping("/toEdit")
public String toEdit(HttpServletQuest arg0,HttpServletResponse arg1,Model model)throw Exception{
	model.addAttribute("msg","第一个SpringMVC程序");
	return "forward:editUser"
}

ViewResolver(视图解析器)

SpringMVC中的视图解析器负责解析视图,可以在配置文件中定义一个ViewResolver来配置视图解析器

<!--定义一个视图解析器-->
<bean id = "viewResolver" class="org.springframe.web.servlet.view.InternalResourceViewResolver">
	<!--设置前缀-->
	<property name="prefix" value="/WEB-INF/jsp/" />
	<!--设置后缀-->
	<property name="suffix" value=".jsp" />
</bean>

通过设定视图解析器,方法中定义的view路径将可以简化,例如可以将"/WEB-INF/jsp/welcome.jsp"简化成"welcome"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值