概述
Spring MVC属于SpringFrameWork的产品,采用Model-View-Controller进行数据交互,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 mvc架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
环境搭建
所需软件
Eclipse:下载
Tomcat: 8.0.36 下载
JDK:1.8.0_60 下载
Spring-framework: 4.3.7.RELEASE 下载
commons-logging-1.1.1.jar 下载
环境搭建
Eclipse新建web项目,将Spring-framework Jar文件放到WEB-INFo下的Lib文件夹下,配置web.xml
HelloWorld-Demo搭建演示
配置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"> <display-name>MDBIMVC</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
<!--设置mvc-spring配置,映射到springservletconfig.xml--> <servlet> <servlet-name>SpringMVCService</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springservletconfig.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<!--设置mvc文件,指向所有网站目录/--> <servlet-mapping> <servlet-name>SpringMVCService</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
<!--设置.css、.jpg、.js、.htm文件处理使用默认服务处理-->
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.txt</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>
</web-app>
在项目的src目录下新建springservletconfig.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" 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/util http://www.springframework.org/schema/util/spring-util.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" >
<!-- 开启注解映射支持 --> <mvc:annotation-driven/> <!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 --> <mvc:default-servlet-handler/> <!-- 开启controller注解支持 --> <!-- use-default-filters="false" 只扫描指定的注解 --> <context:component-scan base-package="justin.com.controllers" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="contentType" value="text/html"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
<mvc:annotation-driven/> 开启注解映射支持,它是为了简化配置的缩写形式,它相当于以下2个配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
扫描指定Controllers
<context:component-scan base-package="justin.com.controllers" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
component-scan的几个属性:
1、base-Packages:Spring将扫描的基础package名,Spring会扫描该包以及其子孙包下的所有类;
2、use-Default-Filters:默认为true,此时Spring扫描类时发现如果其被标注为 @Component、@Repository、@Service、@Controller则自动实例化为bean并将其添加到上下文中,如果设置为false,即使将其标注为@Component或者其他,Spring都会忽略;
3、include-Filters 指定扫描时需要实例化的类型,我们可以从名字看到这是一个Filter,你可以自己定义该Filter,Spring为我们提供了一套方便的实现,我们可以根据标注、类、包等相关信息决定当扫描到该类时是否需要实例化该类,需要注意的是如果你仅仅想扫描如@Controller不仅要加includeFilters,还需要将useDefaultFilters设置为false;
4、exclude-Filter 指定扫描到某个类时需要忽略它,实现和上一个Filter一样,区别只是如果Filter匹配,Spring会忽略该类
转换到指定的视图格式:prefix+XXX+.jsp
<!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="contentType" value="text/html"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
新建HelloWorldController:在Src目录下,新建类HelloWorldController,代码如下
package justin.com.controllers; import javax.servlet.http.HttpServletRequest; import org.apache.catalina.connector.Request; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("/helloworld") public class HelloWorldController { @AuthPassport @RequestMapping(value={"/*","/say"},method=RequestMethod.GET) public ModelAndView China() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("HelloWorld/CIndex"); return modelAndView; } }
代码解析如下:
@Controller是mvc spring的注解,理解成控制器Controller;
@RequestMapping也是mvc注解,可理解成路由的映射,其中RequestMapping的方法参数还可以这么使用:
--第一种使用方式:指定默认值,匹配URL中地址(/helloworld)请求
@RequestMapping("/helloworld")
--第二种使用方式:指定特定值,可以是单个值也可以是多个值,匹配RUL地址,还指定请求的方式; @RequestMapping(value={"/*","/say"},method=RequestMethod.GET)
--第三种使用方式:匹配正则,即参数cname是字符,id为数字
@RequestMapping(value="/City/{cname:\w+}-{id:\d+}",method=RequestMethod.GET)
--第四种使用方式:匹配请求headers头,header中必须包含cookie值
@RequestMapping(value="CHome",method=RequestMethod.GET,headers="Cookie")
--第五中使用方式:url必须包含参数example或者不包含exacmle(params="!example")
@RequestMapping(value="/paramstest", params="example", method = {RequestMethod.GET})
--第六使用方式:url必须参数example必须等于(params="example=abc")或者不等于某个值(params="example!=abc")
@RequestMapping(value="/paramstest", params="example", method = {RequestMethod.GET})
ModelAndView 是mvc spring中,用于传递视图的中间类,ModelAndView 中包含设置view名称setViewName("视图名称")和传递视图实体数据addObject("key","value");
在WEB-INF下新建文件夹views/HelloWorld/CIndex.jsp,前台通过${message}获取后台传入的值
<%@ 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"> </head> <body> <p>Hi,I'm China Index Page </p> <p>${message}</p> </body>