1. 程式人生 > >Eclipse 下搭建Spring MVC

Eclipse 下搭建Spring MVC

1. Spring MVC的基本概念
1.1 Spring MVC的靜態概念
1.2 Spring MVC的動態概念
2. Eclipse的安裝配置
2.1 Maven的安裝配置與配置檔案修改
2.2 Eclipse整合Maven
3. 建立Maven專案
3.1 Eclipse匯入Maven專案
3.2 Eclipse下配置pom.xml
4. 編寫Spring MVC程式碼
4.1 配置dispatcherServlet
4.2 編寫Controller
4.3 編寫View
5. jetty容器啟動Servlet

6. 結果展示
7. 問題彙總
8.關於web.xml
9.關於applicationContext.xml和dispatcher-servlet.xml的修改

1. Spring MVC的基本概念

1.1 Spring MVC的靜態概念

  • DispatcherServlet:前端控制器,負責分發Requst到Controller,然後將Controller返回的Model傳遞到View;
  • Controller:呼叫業務邏輯產生Model;
  • HandlerAdapter:Controller的一種表現形式,包括具體的Controller例項以及包裹的HandlerInterceptor;
  • HandlerInterceptor: 攔截器,三個介面方法:preHandler,postHandler,afterCompletion分別用於Controller執行之前,之後以及view顯示完成後呼叫;
  • HandlerMapping:幫助DispatcherServlet找到正確的controller,使用HandlerInterceptor包裹Controller;
  • HandlerExecutionChain:執行鏈條
  • ModelAndView:Model或者Map
  • ViewResolver:檢視解析器,告訴DispatcherServlet使用哪一個view,Help DispatcherServlet to Resolve the right View to render page;
  • View:jsp等,用於呈現頁面;

1.2 Spring MVC的動態概念

瀏覽器傳送Request請求到前端控制器,然後DispatcherServlet通過HandlerMapping找到相應的Controller,幷包裹HandlerInterceptor,從而形成HandlerExecutionChain,生成Handler/HandlerAdapter返回給DispatcherServlet,然後獲取ModelAndVIew,通過ViewResolver找到相應的View,返回;

2. Eclipse的安裝配置

(略)

2.1 Maven的安裝配置與配置檔案修改

(略)

2.2 Eclipse整合Maven

windows-preference-Maven-Installations配置本地Maven;
windows-preference-Maven-User Settings配置Maven的配置檔案

3. 建立Maven專案

在命令列中輸入如下命令來建立Maven專案:

mvn archetype:generate -DgroupId=lalala -DartifactId=spring-mvc-study -DarchetypeArtifactId=maven-archetype-webapp

然後在命令列中輸入上面的命令,需要先定位到工作空間目錄,然後在執行;

3.1 Eclipse匯入Maven專案

(略)

3.2 Eclipse下配置pom.xml

<project xmlns="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.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>imooc-arthur</groupId>
  <artifactId>spring-mvc-study</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>spring-mvc-study Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
      <commons-lang.version>2.6</commons-lang.version>
      <slf4j.version>1.7.6</slf4j.version>
      <spring.version>4.1.3.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>

   <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>${commons-lang.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
  </dependencies>

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

  <build>
    <finalName>spring-mvc-study</finalName>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.2.2.v20140723</version>
        </plugin>
    </plugins>
  </build>
</project>

dependencyManager用於解決依賴衝突,並且添加了jetty外掛;jetty是servlet容器。

4. 編寫Spring MVC程式碼

4.1 配置dispatcherServlet

因為使用的是Spring MVC,所以需要在web.xml中新增前端控制器的servlet:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
      <servlet-name>mvc-dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <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>
      <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

注意:comtextConfigLocation指明瞭了servlet的配置檔案路徑,所以要在相應的路徑下建立xml配置檔案
mvc-dispatcher-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: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-3.1.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    <!-- 啟用標註 -->            
    <context:annotation-config/>
    <!-- DispatcherServlet上下文,只搜尋@Controller標註的類 不搜尋其他標註的類 -->
    <context:component-scan base-package="com.imooc.mvcdemo">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsps/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

注意:beans、mvc、context的版本,否則可能會不識別annotation-config和annotation-driven

4.2 編寫Controller

package com.imooc.mvcdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * @author 
 *
 */
@Controller
@RequestMapping("/hello")
public class HelloMvcController {

    @RequestMapping("/mvc")
    public String helloMvc() {
        return "home";
    }
}

新增Controller和RequestMapping註解

4.3 編寫View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello Spring MVC ! Here is iMooc Duan!
</body>
</html>

注意存放路徑在xml檔案中配置了

5. jetty容器啟動Servlet

啟動命令列,cd到專案路徑,然後執行:

mvn jetty:run

6. 結果展示

7. 問題彙總


8.關於web.xml

使用spring的東西,所以將web.xml修改為:

<?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">
  <display-name>Spring MVC Study</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>

  <servlet>
      <servlet-name>mvc-dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <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>
      <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

對層次化的ApplicationContext的理解:
spring的應用上下文有自己的配置檔案,dispatcher-servlet也有自己的配置檔案,這就構成了不同的應用上下文的層次。

圖中WebApplicationContext(s)就是由ContextLoadListener所載入的應用上下文,他提供的是所有應用所使用的公共元件;WebApplicationContext是與特定的DispatcherServlet關聯的應用上下文。

9.關於applicationContext.xml和dispatcher-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: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-3.1.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    <!-- 啟用Spring 基於annotation的DI -->            
    <context:annotation-config/>
    <!-- DispatcherServlet上下文,只搜尋@Controller標註的類 不搜尋其他標註的類 -->
    <context:component-scan base-package="com.imooc.mvcdemo">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 擴充套件了驅動註解,可以將請求引數繫結到控制器引數 -->
    <mvc:annotation-driven/>

    <!-- 靜態資源處理,css, js, img -->
    <mvc:resources location="/resources/" mapping="/resources/**"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsps/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

注意annotation-config以及mvc:resources的作用

<?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: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-3.1.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    <!-- 啟用Spring 基於annotation的DI -->            
    <context:annotation-config/>
    <context:component-scan base-package="com.imooc.mvcdemo">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>