一. 软件环境
eclipse-jee-mars-R-win32-x86_64
jdk1.7.0_79
apache-tomcat-7.0.52
spring-framework-3.2.0.RELEASE-dist
二. 环境搭建及实例
2.1 新建动态web工程
2.2 导入jar包
2.3 配置Spring MVC前端控制器和访问的url
在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>SpringMVC</display-name> <!-- 配置SpringMVC DispatcherServlet(前端控制器) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 指定Spring MVC启动所需加载的配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <!-- 配置DispatcherServlet所要拦截的url -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <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> </web-app>
其中:
a) 9~13行用于指定Spring MVC启动所需加载的配置文件,这里的配置含义是指在src目录下。默认为WEB-INF目录下,名称为[servlet-name]-servlet.xml,如spring-servlet.xml
<!-- 指定Spring MVC启动所需加载的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
b) 14行含义为:标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet。
当是一个负数或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
(为什么不是true或false呢?这是因为如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序)。
c) 18~21行表示拦截的模式。这里是"/"表示对所有的请求都进行拦截,包括静态资源如js,css,jpg等。关于拦截的模式以及如何访问静态资源详细请看另一篇:SpringMVC访问静态资源的springmvc.xml配置。
2.4 既然12行指示需要加载src目录下的一个名为springmvc.xml文件,接下来创建该文件
创建springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 注解扫描(实现方式四), 通过扫描将带有@Controller注解的类交由spring容器管理并维护 -->
<context:component-scan base-package="com.pers.controller"/> <!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean> </beans>
其中:
a) 2~16行这些文件头详细介绍请看另一篇文章:XXXXXX。
b) 19行表示指定注解扫描的范围,这里是"com.pers.controller"即:扫描com.pers.controller包下的所有文件(当然,首先需要创建package:com.pers.controller)。
c)22、25行分别配置处理器映射器和处理器适配器,实际开发中,使用下面注解驱动的方式代替上面两种配置(更简洁),使用这种配置默认加载了很多需要的类型转换器,如json,还可以将自定义类型转换器添加到该配置中。
<!-- 注解驱动自动注册组件, 处理器映射器和处理器适配器通过注解驱动的方式配置代替下面的处理器映射器和处理器适配器 -->
<mvc:annotation-driven/>
c) 28~31行,配置视图解析器ViewResolver,通过配置逻辑地址(前缀和后缀),将ModelAndView对象进行拆分,将model对象渲染到视图页面。如果不配置ViewResolver,Spring MVC默认依然将org.springframework.web.servlet.view.InternalResourceViewResolver作为ViewResolver,但是prefix和suffix的value都为空。
2.5 创建index.jsp(WebContent下)
<%@ 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>SpringMVC登录页面</title>
</head>
<body>
<h2>SpringMVC示例</h2>
<form action="./user/login" method="post">
username:<input type="text" id="name" name="username" /><br/>
password:<input type="password" id="password" name="password" /><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
其中:
a) 11行action="./user/login"表示请求的url,method="post"表示post请求。
2.6 创建UserController类(com.pers.controller包下)
package com.pers.controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView; /**
* @author liangyadong
* @date 2017年2月28日 下午2:25:39
* @version 1.0
*/
@Controller
@RequestMapping("/user")
public class UserController { @RequestMapping(value="/login",method={RequestMethod.POST,RequestMethod.GET})
public ModelAndView login(String username, String password){
ModelAndView mv = new ModelAndView();
// 指定返回页面loginSucc.jsp
mv.setViewName("loginSucc");// 当不配置视图解析器的时候,参数loginSucc改为:/WEB-INF/jsp/loginSucc.jsp
// 设置返回信息
mv.addObject("msg", "欢迎,登录成功!");
return mv;
} }
其中:
a) 13行@Controller注解,表明自己是一个Controller。
b) 14行@RequestMapping("/user")注解,和17行@RequestMapping(value="/login")注解共同组合为/user/login作为jsp中请求的url。/user注解放在类上,/login注解放在方法上并且与方法名login()相同。之所以拆开,目的是分类化管理Controller,这一点称为“窄化请求”。
c) 14行@RequestMapping(value="/login",method={RequestMethod.POST,RequestMethod.GET})的method限定请求方法。
d) 21行指定返回的页面loginSucc.jsp,不是瞎返回的,这个jsp的位置是和springmvc.xml配置文件的视图解析器相匹配的,视图解析器前缀"/WEB-INF/jsp/",后缀".jsp",意思就是返回这个目录下的页面loginSucc.jsp。
e) 关于Controller的返回值可以参考另一篇文章:XXXXXX
2.7 创建返回成功的页面
创建loginSucc.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>SpringMVC欢迎页面</title>
</head>
<body>
返回信息:${msg}
</body>
</html>
2.8 测试
将该动态工程加入tomcat,启动tomcat,打开浏览器地址栏输入:localhost:8080/SpringMVC/index.jsp,如下图所示:
点击"登录",成功跳转到登录成功页面如下图:
三. 附图
3.1. 最终项目结构图:
四. 总结
以上是Spring MVC基于注解的实现方式,也是最常用的方式。除了注解还有非注解的实现方式,非注解的实现方式是通过实现Controller接口或HttpRequestHandler接口,但是这种方式仅仅实现了一个方法(handlerRequest()),而在实际开发中一个Controller往往代表一个模块,该模块下会有许多方法,那么非注解的实现方式显然不合适了,于是就通过注解的方式实现来解决。
默认加载的配置信息(在web.servlet中的DispatcherServlet.properties中配置了默认的各种器)详见下图:
可以看到,该文件里面加载了处理器映射器、处理器适配器、视图解析器。
SpringMVC环境搭建并不难,重要的是要看源码。