老左说spring MVC3 第一章:最简入门
2014-02-03 16:14 阅读(223)

spring相应jar包即源码下载地址:http://maven.springframework.org/release/org/springframework/spring/

这是手工下载,当然也可使用maven下载,如何使用spring官网上也有实例,大家可参考下。


最简入门的完整实例下载:myspring3.0.5.rar


一、搭建最简实例

步骤1、引入springmvc 需要的jar包

以上是必须要引入的jar包,当然你也可以把所有jar包都引入进去也没关系。另外commons-logging-1.1.jar、commons-lang-2.1.jar是apache的俩个工具包,需要单独下载,不过我提供的实例中已经有了,可直接用就行。

步骤2、配置主控制器(web.xml)

打开web.xml 添加mvc的主控制器servlet:  org.springframework.web.servlet.DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>spring3</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring3</servlet-name>
    <url-pattern>*.do</url-pattern>    
  </servlet-mapping>
</web-app>
DispatcherServlet 是spring mvc的总入口,所有请求都由它处理,由它在调度其他模块工作。<load-on-startup>设置为1表示tomcat(假设使用的是tomcat作为web服务器)容器启动时就加载并实例化DispatcherServlet 。


<url-pattern>设置为*.do,表示只处理以".do"结尾的http请求,当然你也可以设成".html"、".jsp"、或者所有请求"/"。

步骤3、配置spring的配置文件spring3-servlet.xml

在WebRoot/WEB-INF下建个spring3-servlet.xml的xml文件,注意这个xml文件的文件名是有命名规则的,其中spring3就是web.xml中配置的DispatcherServlet 的servlet-name值,后面再加上"-servlet.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" 
     xsi:schemaLocation=" 
          http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <!-- 把标记了@Controller注解的类转换为bean -->     
    <context:component-scan base-package="com.controller" /> 
	
</beans>
该xml配置需要由spring mvc管理的bean、以及常量。<context:component-scan>标记设置了我们自己写的控制器(controller)的路径。spring启动时会将com.controller包名下的所有带有@Controller注解的类作为控制器,并把它纳入上下文的管理中。


步骤4、写控制器

根据<context:component-scan>的配置,需要建个com.controller包,在该包下任意写个控制器,如AdminController,但需要加@Controller注解.

代码

package com.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

@Controller  
public class AdminController {
	
	@RequestMapping("/toAdmin.do") 
	public ModelAndView toAdmin(){
		Map<String,String> modal = new HashMap<String,String>();
		modal.put("helloWorld", "hello 老左!");
		return new ModelAndView("sayHello.jsp",modal);
	}

}

注解 @RequestMapping 配置了请求路径,也就是说当http请求为/toAdmin.do时,由toAdmin()方法处理,如:http://localhost:8080/myspring3.0.5/toAdmin.do

方法最后返回个new ModelAndView("sayHello.jsp",modal);"sayHello.jsp"是返回的页面(视图),modal 存放返回给sayHello.jsp的值,在sayHello.jsp中可获取这些值。

步骤5、创建视图sayHello.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>
<%=request.getAttribute("helloWorld") %>
</body>
</html>

处理控制器返回的数据,并展示给用户,比较简单。


ok,整个搭建就完成了,在地址栏输入  http://localhost:8080/myspring3.0.5/toAdmin.do  即可。



二、不配置不等于最简配置

在步骤3中,spring3-servlet.xml文件中除了配置个控制器的搜索路径,其他的都没配置,也可以说是零配置或最简配置。但这并不等于说spring mvc在实际工作时所用到的配置也是最简配置。

正常情况下我们至少需要配置如:HandlerAdapter、HandlerMapping以及ViewResolver一些核心组件。如:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"  p:prefix="/view/" p:suffix=".jsp" />   
这些核心组件都是spring工作时必须的。 但是,当我们不配置时,spring会使用自己默认的配置,默认配置可到 DispatcherServlet.properties文件找到,如下:


DispatcherServlet.properties内容:


# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver 
HandlerMapping组件配置了俩个处理类BeanNameUrlHandlerMapping、DefaultAnnotationHandlerMapping 。HandlerAdapter组件配置了三个:HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter、AnnotationMethodHandlerAdapter。


所以默认配置并非最简配置,如果你只需要使用到注解来配置控制器,可以将spring3-servlet.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" 
     xsi:schemaLocation=" 
          http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <!-- 把标记了@Controller注解的类转换为bean -->     
    <context:component-scan base-package="com.controller" /> 
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
</beans>
上面的配置即可是最简配置。


当然,我们并不是一味追求最简配置,只是为了说明他的原理,使用默认的也完全没问题。


三、如何组织视图

通过ViewResolver组建可以设置视图的基础路径以及文件的前缀后缀,可以将spring3-servlet.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" 
     xsi:schemaLocation=" 
          http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <!-- 把标记了@Controller注解的类转换为bean -->     
    <context:component-scan base-package="com.controller" /> 
	
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"  p:prefix="/view/" p:suffix=".jsp" />   
</beans>
 p:prefix="/view/" p:suffix=".jsp"   属性分别配置了视图文件的前缀和后缀,这样控制器AdminController就可以简写如下:
@RequestMapping("/toAdmin.do") 
	public ModelAndView toAdmin(){
		Map<String,String> modal = new HashMap<String,String>();
		modal.put("helloWorld", "hello 老左!");
		return new ModelAndView("sayHello",modal);
	}
去掉了sayHello.jsp的后缀。


同时还需要在WebRoot下建个view文件夹,将sayHello.jsp移到view下



这样就将所有视图统一管理到view下。