1. 程式人生 > >Spring MVC入門-專案搭建步驟解析

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>

  <

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>

               <!--  在打包成功後使用jettyrun來執行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-dispatcherDispatcherServlet提供的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可以預設啟動下面的類,解析一些基於註解的AnnotationMappingDefaultAnnotationHandlerMapping

       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);     

    }

}

參考程式碼