使用idea构建我的第一个spring mvc

第一次操作

需求:我发请求,后台有一个类处理这个请求,并跳转成功页面

1.首先用maven构建项目,使用webapp模版,构建好了之后在main文件夹内新建java、resources、webapp(自带)三个文件夹,其中java文件夹要标记为source root(用于存放源代码),resources文件夹标记为resources root(用于存放配置文件),此时项目目录构建完毕。

2.index.jsp代码如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>入门程序</h3>
    <a href="hello">入门程序</a>
</body>
</html>

其中有一个超链接,href为相对路径格式的hello(从http://localhost:8080/springmvc1/跳转到http://localhost:8080/springmvc1/hello)(注意:如果这个地方写/hello,意思就是在从(http://localhost:8080/springmvc1/)跳转到http://localhost:8080/hello,显然无法成功)

3.控制器的类

package com.dwz.controller;


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

//控制器类
@Controller
public class HelloController {
    @RequestMapping(path = "/hello")
    public String sayHello(){
        System.out.println("hello spring mvc");
        return "success";
    }

}

@Controller 注解,该HelloController类被spring进行管理

@RequestMapping(path = “/hello”) 请求映射,表明什么request才会map到该方法,需要提供一个request的路径path,本例中的/hello就是该方法的请求路径

return “success” 跳转到success.jsp文件

4.springmvc的配置文件springmvc.xml(位于resources文件夹下)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 注解扫描 -->
    <context:component-scan base-package="com.dwz"></context:component-scan>
    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 开启spring mvc 框架注解的支持-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

(1)<context:component-scan base-package=“com.dwz”></context:component-scan>可以让HelloController这个类被spring扫描到,此时@Controller生效

但是此时springmvc.xml这个配置文件并没有被识别到,也就是无法生效,因此需要在其他地方加载它,才能让springmvc.xml生效,因此我们需要在web.xml中进行配置

5.web.xml(位于WEB-INF下)

web.xml

<!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>
  <!-- SpringMVC的核心控制器 -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 配置servlet启动时加载对象 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

其中

<servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>

表示我们想要给DispatcherServlet传初始化参数,参数名称为contextConfigLocation,参数值为classpath:springmvc.xml,此时DispatcherServlet就可以帮我们加载springmvc.xml这个配置文件

1是因为,对于正常的servlet,其只会在第一次发请求的时候才会被创建,而我们配置load-on-startup,可以让该servlet在服务器启动的时候就创建,该servlet一旦创建,就可以帮我们创建srpingmvc.xml这个配置文件

配置文件springmvc.xml一旦加载,其中的注解扫描就可以正常进行。HelloController就可以被扫到,其中的requestmapping注解就可以将特定的request映射到相应的方法

6.跳转页面

HelloController这个Controller创建,其中的requestmapping映射的方法sayHello就可以被正常调用,之后return “success” 可以让页面跳转到success.jsp(在WEB-INF下新建pages文件夹存放页面)

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>入门成功</h3>
</body>
</html>

但是这个过程需要使用视图解析器帮助页面跳转

<!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

配置视图解析器bean的id属性和class属性,其中class为InternalResourceViewResolver

其中需要配置两个参数prefix(目录)和suffix(后缀)

最后, 开启spring mvc 框架注解的支持(现在这个入门的项目还不需要,之后会用到)

<!-- 开启spring mvc 框架注解的支持-->
    <mvc:annotation-driven></mvc:annotation-driven>

作用:springmvc的各个组件中,处理器映射器HandlerMapping、处理器适配器HandlerAdapter、视图解析器ViewResolver被称为springmvc的三大组件。配上spring mvc框架注解支持,相当于把流程中的处理器映射器HandlerMapping、处理器适配器HandlerAdapter

之后配置tomcat的访问路径application context(可以不写,也可以写/项目名)

如果不写

主页为http://localhost:8080/

点击后跳转http://localhost:8080/hello

如果写/项目名

主页为http://localhost:8080/springmvc1/

点击后跳转http://localhost:8080/springmvc1/hello

详细流程

  1. 启动服务器,加载配置文件
    1. DispatcherServlet对象创建
    2. springmvc.xml被加载
    3. HelloController创建成对象(默认为单例??啥意思??)
  2. 发送请求,后台处理请求

精简版

img

复杂版

img

spring mvc基于组件的方式执行流程

1.用户请求request先到达前端控制器DispatcherServlet

2.请求查找Handler:HandlerMapping这个地方,体现在我们程序中的Controller类中的方法前加RequestMapping,其中path为/hello,同时我们在1.Request的时候带的也有路径/hello,这二者一致,说明我们的hello请求就会通过RequestMapping找到Controller中的相应的方法

3.返回执行链

4.处理器适配器HandlerAdapter,采用了适配器模式,不管是任何类型的Controller,都可以得到适配,都可以执行(Controller就是Handler)

5.执行

6.7.返回ModelAndView,也就是本例中的success.jsp

8.9.视图解析器通过返回的ModelAndView帮你找到相应的视图(success.jsp)返回给前端控制器DispatcherServlet

10.渲染视图

11.返回响应response

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值