一、SpringMVC框架概述
什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC要高于Struts2;注意这里的SpringMVC很明确的指明了使用了MVC框架,Struts2也使用了MVC框架。
1.环境准备
和之前使用的spring环境几乎是差不多的,但是需要增加两个核心包:
org.springframework.web.servlet-3.0.0.RELEASE.jar
org.springframework.web-3.0.0.RELEASE.jar
当然,这是在Spring3.2之前的环境下,Spring3.2有了重大的升级,不再使用org.springframework.web.servlet-3.0.0.RELEASE.jar,而是取而代之的使用了下面的jar包:
spring-webmvc-3.2.0.RELEASE.jar
当然,还是推荐使用Spring3.2的版本,根据spring官方文档中的声明,自3.0版本之后一直到3.2版本的所有版本都存在已知的而且很明显的bug;在spring3.2中则解决了相当数量的bug。
2.需要的完整jar包列表
由于我使用的是Eclipse,所以相关的jstl先关jar包IDE并没有提供支持,所以只能手动添加jstl.jar以及standard.jar了:
aopalliance.jar
commons-logging.jar
jstl.jar
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-context-support-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
spring-web-3.2.0.RELEASE.jar
spring-webmvc-3.2.0.RELEASE.jar
standard.jar
很明显了,使用SpringMVC的另外一个最大的好处就是不用像在Struts2中那样再引入一大批的jar包了。
二、第一个SpringMVC程序
1.首先在web.xml配置文件中配置一个Servlet
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
2.配置spring配置文件
默认的Servlet将会读取WEB-INF文件夹下的相应配置文件;当然该配置文件的命名还需要满足规则才行:$servletName-servlet.xml,否则Servlet也找不到相应的配置文件;根据上述的配置中的servlet-name标签的值,我们将配置文件的名字命名为:action-servlet.xml,这个配置文件实际上就是Spring的配置文件
首先配置“内部资源视图解析器”
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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"> <!-- 内部资源视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsps/"></property> <property name="suffix" value=".jsp"></property> </bean> <beans>
内部视图资源解析器确定了一种规则,那就是将Controller返回的ModelAndView对象进行解析,并将viewName提取出来和"prefix"以及"suffix"进行拼接,得到需要跳转的资源位置,并执行跳转,具体是重定向还是转发,需要根据ModelAndView的内容进行确定。
这里则是假设所有jsp页面都保存到了/jsps目录下,并且都是以.jsp结尾。
3.新建控制器
所有控制器的超类都是AbstractController,这里直接继承该类,并重写该类的核心方法:handleRequestInternal,该方法返回值是ModelAndView对象,该对象必须赋予一个字符串代表资源的位置。
package com.kdyzm.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; public class HomeController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("你好,这是第一个SpringMVC程序!"); return new ModelAndView("index"); } }
这里的index经过"内部视图资源解析器"解析之后,就转变成了真正的地址:/jsps/index.jsp,在浏览器上就需要使用http://localhost:8080/项目名称/jsps/index.jsp来访问了。
新建控制器之后需要将控制器注入到spring容器管理。
<bean name="/home.action" class="com.kdyzm.controller.HomeController"></bean>
4.在/jsp/文件夹下新建jsp页面index.jsp
1 <%@ page language="java" pageEncoding="utf-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6 <title>Insert title here</title> 7 </head> 8 <body> 9 你好,这是第一个SpringMVC程序! 10 </body> 11 </html>
5.在浏览器上输入http://localhost:8080/springmvc/home.action进行测试
测试成功。
三、三种不同的URL处理器映射
所谓的处理器映射就是一种Map对象,它储存着请求的url到控制器的映射,它能够将我们的请求转交给某一个指定的控制器处理。
1.Bean名url处理器映射
这是默认的url处理器映射,也是最常使用的url处理器映射;所谓默认,就是不配置也会自动加载,这里显式声明一下意思意思:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="order" value="3"></property> </bean>
它有一个serOrder方法,该方法能够确定该url处理器的优先级,如果配置了多个url处理器映射,那么该值越大的越有限匹配;之前的例子由于没有明确的配置url处理器映射,所以使用的是默认的url处理器映射。
2.简单url处理器映射
这种url处理器映射基本上没有人使用,因为使用这种方式需要将key和值一一列举出来,这种工作量即使在一个中型项目中也是难以承受的。