详细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类型的请求。
l
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