前言
最近闲来无事,在学习spring MVC过程中,发现配置文件有点繁琐,尤其是配置文件定义相关的映射多起来的时候。所以我们想起了注解的方式来解决这种问题!注解最大的好处就是简化了XML配置;其实大部分注解一定确定后很少会改变,所以在一些中小项目中使用注解反而提供了开发效率,所以没必要一头走到黑。
一、配置解析
1.Dispatcherservlet
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。
Spring Web模型 - 视图 - 控制器(MVC)框架是围绕DispatcherServlet设计的,它处理所有的HTTP请求和响应。 Spring MVC DispatcherServlet的请求处理工作流如下图所示:
在接收到HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller。Controller接受请求并根据使用的GET或POST方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。DispatcherServlet将从ViewResolver获取请求的定义视图。当视图完成,DispatcherServlet将模型数据传递到最终的视图,并在浏览器上呈现。
所有上述组件,即: HandlerMapping,Controller和ViewResolver是WebApplicationContext的一部分,它是普通ApplicationContext的扩展,带有Web应用程序所需的一些额外功能。
2.InternalResourceViewResolver 视图名称解析器
SpringMVC中的视图解析器(ViewResolver)负责解析视图。可以通过在配置文件中定义一个ViewResolver来配置视图解析器,其配置示例如下:
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
二、SpringMVC常用注解
@Controller-—负责注册一个bean 到spring 上下文中
@RequestMapping----注解为控制器指定可以处理哪些 URL 请求
@RequestBody-—该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
@ResponseBody-— 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
@ModelAttribute ----在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法, 在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中
@RequestParam----在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法
@PathVariable----绑定 URL 占位符到入参
@ExceptionHandler----注解到方法上,出现异常时会执行该方法
@ControllerAdvice----使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常
三,基于注解的Spring MVC应用
该项目的图录如下:
如果进行试验的话,直接复制我的代码到你的项目中,记得包名,配置文件位置等不要出错。
springmvc-config.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 指定需要扫描的包 -->
<context:component-scan base-package="com.zsj.controller" />
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
在该文件中,首先通过组件扫描器指定了需要扫描的包,然后定义了视图解析器,并在视图解析器中设置了视图文件的路径前缀和文件后缀名。
FirstController.java
package com.zsj.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器类
*/
@Controller
@RequestMapping(value="/hello")
public class FirstController{
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
// 向模型对象中添加数据
model.addAttribute("zsj", "这是zsj改编的;");
System.out.println("/n");
model.addAttribute("yyh", "基于注解的Spring MVC程序;");
// 返回视图页面
return "first";
}
}
使用了**@Controller** 注解来标注控制器类,该注解在使用时控制器类不需要再实现Controllr接口在控制器类上使用了**@RequestMapping** 注解。注解标注在类名和方法名上来映射请求方法在项目启动时,Spring就会扫描到此类,以及此类中标注了**@RequestMapping** 注解的方法由于标注在类上**@RequestMapping注解的value 值为"hello"** ,因此类中所有请求方法的路径都需要加上**"/hello"** .由于类中handlerRequest() 方法的返回类型为String ,而String 类型的返回值又无法携带数据,所以需要通过参数Model 对象的addttribute() 方法来添加数据信息因为在配置文件的视图解析器中定义了视图文件的前缀和后缀名,所以handlerRequest()方法只需返回视图名"first" 即可,在访问此方法时,系统会自动访问"WEB-INF/jsp/" 路径下名称为first .jsp文件
注意: 由于ModelAndView未能实现数据和视图的解耦,所以在企业开发时通常选择String 返回类型。由于String类型不能携带数据,于是在参数中增加一一个Model类型的参数,由Model将数据带入视图页面。如果方法中添加了Model参数,则每次调用该请求处理方法时, Spring MVC都会创建Model对象,并将其作为参数传递给方法。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
first.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>入门程序</title>
</head>
<body>
${zsj}
${yyh}
</body>
</html>
这篇博客只是最近对于Spring MVC注解开发的一点心得,肯定会有所不足的地方!!!在后续积累的过程中会进行补充和完善。希望各位能多多给予意见。
本文参考文献:
Spring 4 官方文档学习(十一)Web MVC 框架
易百教程
SpringMVC框架理解