Spring MVC入門-專案搭建步驟解析
詳細Spring MVC專案搭建過程見連結:AAAAAAAAAAAAAAAAAA
此處使用Maven專案管理工具來管理SpringMVC專案。
第一步: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>
<
<!—-
第一,在屬性中宣告一些軟體包的版本 ,原因:如果工程比較複雜龐大,則可以通過這個配置比較清晰的指導依賴包的版本,方便我們做一些其他的而處理。
-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.1.RELEASE</spring.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、渲染具體的檢視等;
7、如果執行過程中遇到異常將交給HandlerExceptionResolver來解析。
-->
<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-scanbase-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:resourcesmapping="/resources/**"location="/resources/"/>
<!--
第四,配置ViewResolver告訴DispatcherServlet應該用哪個View ,使用了JSTlView,字首prefix和字尾suffix來配置
附:可以配置多個ViewRsolver,但是要使用order屬性排序,並且必定要將InternalResolver放在最後,因為它最後會返回一個物件。
-->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<propertyname="messageConverters">
<list>
<beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<propertyname="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<beanclass="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);
course.setTitle("Java多執行緒");
course.setImgPath("resources/imgs/course-img.jpg");
course.setLearningNum(23568);
course.setLevel(2);
course.setLevelDesc("中級");
course.setDuration(7200l);
course.setDescr("多執行緒是日常開發中的常用知識,也是難用知識,一定要掌握好。");
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);
chapter.setTitle("第1章 Java多執行緒背景應用");
chapter.setDescr("主要介紹一下Java多執行緒的背景應用,瞭解背景知識,可以更好的應用的相應的場景中。");
chapterList.add(chapter);
Chapter chapter1=new Chapter();
chapter1.setId(1);
chapter1.setCourseId(courseId);
chapter1.setOrder(2);
chapter1.setTitle("第2章 Java執行緒初體驗");
chapter1.setDescr("Java語言層面對執行緒的支援,如何建立,啟動和停止執行緒。如何使用常用的執行緒方法。用隋唐演義作為例項進行解說。");
chapterList.add(chapter1);
}
}