Spring MVC之基于xml配置的web應用構建

小編:啊南 59閱讀 2020.11.19

直接用SpringBoot構建web應用可以說非常非常簡單了,在使用SpringBoot構建后端服務之前,一直用的是Spring + SpringMVC基于xml的配置方式來玩的,所以在正式進入SpringBoot Web篇之前,有必要看一下不用SpringBoot應該怎么玩的,也因此方便凸顯SpringBoot的優越性

image.png

<!-- more -->

I. Web 構建1. 項目依賴

我們選擇使用傳統的SpringMVC + Tomcat/Jetty 運行war包方式來運行任務,創建一個maven項目之后,先添加上基本的依賴

<artifactId>201-mvc-xml</artifactId>
<!-- 注意這一行,我們指定war包 -->
<packaging>war</packaging>

<properties>
    <spring.version>5.1.5.RELEASE</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
</dependencies>
2. 項目結構

對于web項目,和我們傳統的不一樣的地方在于,會多一個webapp目錄,在這個目錄的WEB-INF文件夾下,會存有幾個必要的配置文件

項目結構

圖中的三個目錄,都屬于比較重要的

  • java : 存放源碼
  • resources: 項目資源文件存放地
  • webapp: web的配置文件,資源文件默認存放地
3. 配置文件說明

java和resources這兩個目錄沒啥好說的,主要來看一下webapp下面的三個xml配置文件

a. web.xml

在我們使用xml配置的生態體系中,這個配置文件至關重要;本節說到SpringMVC構建的應用,是在Servlet的生態上玩耍的;而web.xml這個配置文件,比如我們常見的Servlet定義,filter定義等等,都在這xml文件中

實例如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://java.sun.com/xml/ns/j2ee/web-app_3_1.xsd" version="3.1">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <!-- 解決亂碼的問題 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

上面的配置中,定義了DispatcherServlet的名字為mvc-dispatcher,根據規范,會有一個叫做mvc-dispatcher-servlet.xml的配置文件,其中的配置將應用于DispatcherServlet的上下文

b. mvc-dispatcher-servlet.xml

這個文件主要可以用來定義Servlet相關的配置信息,比如視圖解析,資源路徑指定等;一個最簡單的配置如下

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:beans="http://www.springframework.org/schema/mvc"
       xmlns="http://www.springframework.org/schema/beans"
       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  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--指定掃描的包路徑,自動注冊包含指定注解的對象到Spring容器,并包含了 context:annotation-config 的作用-->
    <context:component-scan base-package="com.git.hui.spring"/>
</beans>

在web.xml中,context:component-scan非常非常重要,用來指定自動掃描并注冊bean到容器的包路徑,上面這一行配置,簡單來講可以認為做了下面幾件事情

  • 掃描包com.git.hui.spring下所有的類,如果類上有@Component,@Service,@Repository,@Contorller,@RestContorller,@Configuration等注解,會實例化為bean對象,并注冊到Spring容器中
  • 其次就是實現DI的功能,實現bean的依賴注入

接下來看一下,如果不加上面這一行,也想實現對應的效果改怎樣配置呢?

<!-- 這個使用來激活注冊的Bean,簡單來講就是使Ioc工作起來 -->
<context:annotation-config/>

<bean name="printServer" class="com.git.hui.spring.PrintServer"/>
<bean name="helloRest" class="com.git.hui.spring.HelloRest"/>

源碼后面會給出,首先是主動定義兩個bean,其中helloRest為Controller,printServer為一個Service,并被注入到helloRest中

如果只定義了兩個bean,而不加上<context:annotation-config/>,則HelloRest中的printService會是null,演示如下圖

異常示意圖

此外,如果用了舊的Spring版本,直接用前面的配置,可能依然無法訪問web服務,這個時候有必要加一下下面的注解; 對于使用aop,希望使用cglib代理的,需要如下配置

<!-- 支持mvc注解-->
<mvc:annotation-driven/>

<!-- 使用cglib實現切面代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

額外說明:現在基本上不怎么用xml配置了,有更簡單的注解方式,上面的配置內容了解即可

c. applicationContext.xml

前面的截圖中,還有個配置文件,這個是干嘛的呢?

DispatchServlet加載包含在web組件中的bean(如mapper,Controller,ViewResolver);我們應用中,還有些其他的Spring Bean(比如其他rpc訪問的服務bean代理,db驅動組件等)則更多的是放在這個配置文件中定義

當然這個里面最簡單的配置內容就是啥都沒有,比如我們的demo工程

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
4. 實例代碼

配置完了之后,我們簡單的定義一個reset服務用來測試,比如一個簡單dean對象和一個簡單的Controller

簡單的bean對象

@Component
public class PrintServer {

    public void print() {
        System.out.println(System.currentTimeMillis());
    }

}

Controller如下

@RestController
public class HelloRest {

    @Autowired
    private PrintServer printServer;

    @ResponseBody
    @GetMapping("hello")
    public String sayHello(HttpServletRequest request) {
        printServer.print();
        return "hello, " + request.getParameter("name");
    }
}
5. 測試

上面我們的web應用就搭建完畢了,然后就是把它部署起來,看下能不能愉快的玩耍了;我們有兩個方法

方法一:tomcat方式

  • 打包mvn clean package -DskipTests=true,然后target目錄下會生成一個war包
  • 將war包放在tomcat的webapps目錄下,然后啟動tomcat進行訪問即可

方法二:jetty方式

前面一種方式,有很多公司的服務是這么玩的,將服務達成war包丟到tomcat中,然后服務上線;然而在本地開發測試時,這樣有點麻煩(當然可以通過idea配置tomcat調試法,個人感覺,依然麻煩)

我們使用jetty來玩耍就很簡單了,首先在pom中添加配置,引入jetty插件

<build>
    <finalName>web-mvc</finalName>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.4.12.RC2</version>
            <configuration>
                <httpConnector>
                    <port>8080</port>
                </httpConnector>
            </configuration>
        </plugin>
    </plugins>
</build>

然后啟動方式可以使用命令:mvn jetty:run, 也可以使用idea,如下,直接雙擊運行或者右鍵選擇debug模式啟動

啟動說明

然后我們愉快的啟動測試過程如下

web測試

到此,一個基于 Spring + SpringMVC + Jetty + xml配置的web應用就搭建起來了

關聯標簽:
华东15选5彩票奖结果 (★^O^★)MG法老王的秘密闯关 北京快三开奖 26选5的开奖规则 高频彩票停售文件 江苏7位数最新开奖结果特等奖 (★^O^★)MG龙龙龙_正规平台 (^ω^)MG太阳征程_官方版 (^ω^)MG华丽剧场技巧介绍 (*^▽^*)MG特工简.布隆德归来_正规平台 北京快3走势图带跨度 (★^O^★)MG热带动物园爆分技巧 贵州快3一定牛下载 新疆18选7开奖结果 艺创网赚手续费合法吗 江西快3跨度是什么 20选5型彩票旋转矩阵