Spring MVC入门案例

一)在IDEA中新建Spring MVC项目。

 

 

 二)按照图片创建如下目录,并设置目录的属性。

 

 

三)在POM.xml中引入依赖。

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.company</groupId>
  <artifactId>SpringMVC01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMVC01 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>SpringMVC01</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

四)controller目录下新建HelloController类,实现Controller接口。

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.setViewName("/WEB-INF/page/result.jsp");
        modelAndView.addObject("message","welcome to spring MVC");
        return modelAndView;
    }
}

五)resources目录下,新建Spring Config文件applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--设置url路径与控制器的映射关系-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello">helloController</prop>
            </props>
        </property>
    </bean>
    <bean id="helloController" class="com.company.controller.HelloController"></bean>
</beans>

六)将WEB-INF目录下的web.xml(格式不对)删除掉,新建一个web.xml,并设置DispatcherServlet。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <!--配置Spring MVC的核心控制器-->
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化参数 用于读取SpringMVC的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
        <!--配置servlet对象的创建时间点:应用加载时创建。
        取值只能是非0正整数,表示启动顺序-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

七)设置index.jsp和result.jsp

webapp目录下index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>spring mvc</h1>
<a href="${pageContext.request.contextPath}/hello">test</a>
</body>
</html>

在WEB-INF目录下,新建page目录,新建result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>

八)部署Tomcat及相关环境

 

 <url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>的区别

  • <url-pattern>/</url-pattern>:会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。即*.jsp不会进入spring的DispatcherServlet类。
  • <url-pattern>/*</url-pattern>:会匹配所有url:路径型url和后缀型url(包括/login,*.jsp,*.js和*.html等)。会出现返回jsp视图时再次进入spring的DispatcherServlet类,导致找不到对应的Controller,报404错误。

使用注解配置Spring MVC

HelloController类加注解

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public ModelAndView getResult(){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("message","welcome to springMVC!");
        modelAndView.setViewName("/WEB-INF/page/result.jsp");
        return modelAndView;
    }
}

applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       https://www.springframework.org/schema/context/spring-context.xsd">
<!--    &lt;!&ndash;设置url路径与控制器的映射关系&ndash;&gt;
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello">helloController</prop>
            </props>
        </property>
    </bean>
    <bean id="helloController" class="com.company.controller.HelloController"></bean>-->

    <context:component-scan base-package="com.company.controller"/>
</beans>

重启服务器,还是可以访问页面。

在此基础上,添加视图解析器ViewResolver。

applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
<!--    &lt;!&ndash;设置url路径与控制器的映射关系&ndash;&gt;
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello">helloController</prop>
            </props>
        </property>
    </bean>
    <bean id="helloController" class="com.company.controller.HelloController"></bean>-->

    <context:component-scan base-package="com.company.controller"/>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

HelloController控制器

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public ModelAndView getResult(){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("message","welcome to springMVC!");
        modelAndView.setViewName("result");
        return modelAndView;
    }
}

案例的执行过程

 

Spring MVC的请求流程

 

 入门案例中涉及的组件

  • DispatcherServlet(前端控制器):它的任务就是拦截请求发送给Spring MVC控制器。
  • HandlerMapping(处理器控制器):HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同映射方式,如:配置文件方式,实现接口方式,注解方式等。
  • Handler(处理器):它就是开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler。由Handler对具体的用户请求进行处理。
  • HandlerAdapter(处理器适配器):通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器执行。
  • ViewResolver(视图解析器):View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  • View(视图):SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。

<mvc:annotation-driver>说明

        在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理器映射器)和RequestMappingHandlerAdapter(处理器适配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

RequestMapping注解

使用说明:

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Mapping 
public @interface RequestMapping { 
}

作用:用于建立请求URL和处理器请求方法之间的对应关系。

使用:

  1. 类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使URL可以按照模块化管理。
  2. 方法上:请求URL的第二级访问目录。

属性:

  • value:用于指定请求的URL。它和path属性的作用是一样的。
  • method:用于指定请求的方式。
  • params:用于指定限制请求参数的条件。它支持简单的表达式,要求请求参数的key和value必须和配置的一模一样。如:params={"accountName"},表示请求参数必须有accountName
  • headers:用于指定限制请求消息头的条件。

以上属性出现2个及以上,其之间是与关系。

 

 posted on 2019-11-25 19:09  会飞的金鱼  阅读(201)  评论(0)    收藏  举报