Eclipse 下搭建Spring MVC

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>    

猜你喜欢

转载自www.cnblogs.com/sniper-1987/p/9936609.html