SpringMVC笔记

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方法就可以通过地址localhost:8080/chapter11/annotationController来访问(HttpServletQuest arg0,HttpServletResponse arg1)throws Exception{
	......
	return modelAndView;
	}

}

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

标注在一个类上

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

实例

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

}

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

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

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

组合注解

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

名称 说明
@GetMapping GET方式的请求
@PostMapping POST方式的请求
@PutMapping PUT方式请求
@DeleteMapping DELETE方式的请求
@PathMapping PATCH方式的请求

以@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"

posted @ 2020-10-21 11:06  xyyyn  阅读(89)  评论(0编辑  收藏  举报