详细Spring MVC项目搭建过程见链接:AAAAAAAAAAAAAAAAAA

此处使用Maven项目管理工具来管理SpringMVC项目。

第一步:Maven安装和项目搭建

       详细步骤见Maven篇:

第二步:Spring MVC项目

1、pom.xml文件配置

<!--头部项目约束信息、属性信息-->
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.my.mavenweb</groupId>
<artifactId>testMavenWebDemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>testMavenWebDemoMaven Webapp</name>
<url>http://maven.apache.org</url>
<!—-

第一,在属性中声明一些软件包的版本 ,原因:如果工程比较复杂庞大,则可以通过这个配置比较清晰的指导依赖包的版本,方便我们做一些其他的而处理。

-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.1.RELEASE</spring.version>
<junit.version>3.8.1</junit.version>
</properties>
<!--

第二、依赖管理,依赖管理是MAven比较核心的东西,声明使用指定版本的包,重在声明依赖,可以不引入实际的依赖,下面要使用4.3.1版本的spring包。

-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-->
第三,加入依赖的软件包。
-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--

第四,加入插件,用Jetty容器来测试部署项目。

-->
<build>
<finalName>testMavenWebDemo</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
<executions>
<!--  在打包成功后使用jetty:run来运行jetty服务-->
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

2、web.xml文件配置

<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:web="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<!-- 自动生成的DocType默认使用webApp2.3的标准,会自动关闭EL表达式语言,所以此处不使用这个语言统一替换成版本2.4,默认支持EL -->

<!--  

第一, 首先,载入spring MVC的监听器ContextLoaderListener,监听器中含有contextLoader,可以加载spring框架的包。作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。

然后,载入Spring MVC上下文配置文件applicationContext.xml,指定其路径,如果不指定,则默认在/WEB-INF/的根目录下。

 -->

<display-name>ArchetypeCreated Web Application</display-name>
    <!--Spring应用上下文,理解层次化的ApplicationContext -->
    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
       <listener-class>
           org.springframework.web.context.ContextLoaderListener
       </listener-class>
    </listener>

<!--

第二、DispatcherServlet是一种前端控制器,加载DispatcherServlet类,并配置指定其相应的DispatcherServlet.xml文件路径。

            DispatcherServlet 是Spring MVC的核心----前端控制器,用于Spring MVC的集中访问,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 

             DispatcherServlet主要担任职责调度工作,本身主要用于控制流程,职责如下:

            1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

            2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

            3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

            4、通过ViewResolver解析逻辑视图名到具体视图实现;

            5、本地化解析;

            6、渲染具体的视图等;

 

 -->

<servlet>
       <servlet-name>mvc-dispatcher</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--默认为/WEB-INF/$servlet-name$-servlet.xml,下面语句改变了该默认参数 -->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>mvc-dispatcher</servlet-name>
       <!-- 表示mvc-dispatcher拦截所有请求 -->
       <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3、applicationContext.xml文件配置

applicationContext是Spring 上下文相关的一个配置文件,此文件组成了整个应用中通用组件共同使用的bean管理,继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问、事件传播等方面进行了良好的支持。

其中,applicationContext的加载实现由两种方式,分别是ContextLoaderListener和ContextLoaderServlet。

<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
    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/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">
    <!--启动基于Annotation的DI管理 -->
    <context:annotation-config/>
    <context:component-scanbase-package="com.terence.mvcdemo">
       <context:exclude-filtertype="annotation"
       expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

4、DispatcherServlet.xml文件配置

<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
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/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-dispatcher的DispatcherServlet提供的Spring MVC配置。

第一,利用annotationContext激活对标签生命周期的管理 ,方便识别标签配置的beans的声明 。用于激活@Required @Autowired,JSR 250's @PostConstruct @PreDestory and @Resource等标注

附:启动基于Annotation的DI管理

-->
<context:annotation-config/>
<!--

第二,是请求和控制区发生联系 DispatcherServlet上下文,只搜索@Controller标注的类 不搜索其他标注的类。

 -->

<context:component-scan base-package="com.terence.mvcdemo">
<context:include-filtertype="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 
HandleMapping无需配置,SpringMVC可以默认启动下面的类,解析一些基于注解的AnnotationMapping、DefaultAnnotationHandlerMapping、
       annotation-drivenHandlerMapping。-->
<!--

第三,扩充注解驱动,可以将请求参数绑定到控制器参数,将URL中的参数直接映射到Controller注解中某个方法的参数,功能强大快捷。

-->
<mvc:annotation-driven/>
    <!-- 静态资源配置,对一些文件用到的图片等资源路径的映射配置 -->
<mvc:resources mapping="/resources/**" location="/resources/"/>
<!--

第四,配置ViewResolver告诉DispatcherServlet应该用哪个View ,使用了JSTlView,前缀prefix和后缀suffix来配置

附:可以配置多个ViewRsolver,但是要使用order属性排序,并且必定要将InternalResolver放在最后,因为它最后会返回一个对象。

-->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>     
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
	<property name="messageConverters">		         
		<list>			             
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="supportedMediaTypes">			                     
					<list>						                         
						<value>
							text/html;charset=UTF-8
						</value>						                         
						<value>
							application/json;charset=UTF-8
						</value>						                     
					</list>					                 
				</property>				             
			</bean>			         
		</list>		     
	</property>	 
</bean>
   
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">      
	<propertyname="viewClass" value="org.springframework.web.servlet.view.JstlView"	/>	      
	<propertyname="prefix" value="/WEB-INF/jsps/" />	      
	<propertyname="suffix" value=".jsp" />	   
</bean>
</beans>

5、控制层Controller

@Controller   
@RequestMapping("/courses")
public class CourseController {
    private static Logger log=LoggerFactory.getLogger(CourseController.class);
    private CourseServicecourseService;   
    @Autowired
    public void setCourseService(CourseService courseService)    {
        this.courseService=courseService;
    }
    @RequestMapping(value="/view",method=RequestMethod.GET) 
    public String viewCourse(@RequestParam("courseId") Integer courseId,Model model)    {
        Course course=courseService.getCourseById(courseId);
        model.addAttribute(course);
        System.out.println(courseId);
        return"course_overview";
    }

解释

l        @Controller,通知上下文,声明这个类是一个Controller,用于访问控制使用,标识Controller注解之后会被Spring的DispatcherServlet的上下文所管理,并且完成依赖注入。

l        @RequestMapping(“/courses”),通过类级别的annotation映射注解 标明应该反映哪种类型的url,然后再映射到类中的方法上。该映射处理根目录url下的所有/courses/**,此类url都将被拦截。

l        @Autowired,声明自动执行,可对成员变量、方法和构造函数进行标注,来完成自动装配的工作。

l        @RequestMapping(value="/view",method=RequestMethod.GET),业务方法,提供一个根据标识查询内容的业务逻辑,通过注解Annotation,映射到类中的方法上,配合映射的类完成请求。

l        该声明方法将处理 http://localhost:8080/courses/view?courseId=123类型的请求。

public String viewCourse(@RequestParam("courseId") Integer courseId,Model model)    {   }

       @RequestParam(“courseId”),用于将路参courseId绑定给方法中的形参courseId,其中Model是SpringMVC特有的类型,可装载包装返回的对象。

 

6、服务层Service

 

1、@Service 告知上下文,声明一个服务的接口

 

@Service
public  interface CourseService {
   Course getCourseById(IntegercouseId);
}

 

2、写一个实现该接口的服务类,并声明告知spring这是一个服务类。

@Service("courseService")
public  class CourseServiceImpl implements CourseService {
    public Course getCourseById(Integer courseId)
    {
        Course course=new Course();
        course.setCourseId(courseId);
"Java多线程");
"resources/imgs/course-img.jpg");
        course.setLearningNum(23568);
        course.setLevel(2);
"中级");
        course.setDuration(7200l);

"多线程是日常开发中的常用知识,也是难用知识,一定要掌握好。");

       

List<Chapter>chapterList=new ArrayList<Chapter>();
        wrapChapterList(courseId,chapterList);
        course.setChapterList(chapterList);
        return course;
    }
    public  void wrapChapterList(Integer courseId,List<Chapter>chapterList)
    {
        Chapter chapter=new Chapter();
        chapter.setId(1);
        chapter.setCourseId(courseId);
        chapter.setOrder(2);

"第1章 Java多线程背景应用");

"主要介绍一下Java多线程的背景应用,了解背景知识,可以更好的应用的相应的场景中。");

  

chapterList.add(chapter);
       
        Chapter chapter1=new Chapter();
        chapter1.setId(1);
        chapter1.setCourseId(courseId);
        chapter1.setOrder(2);

"第2章 Java线程初体验");

"Java语言层面对线程的支持,如何创建,启动和停止线程。如何使用常用的线程方法。用隋唐演义作为实例进行解说。");

chapterList.add(chapter1);     
    }
}

 

 

参考代码

Reference Demo: testMavenDemo