springMVC学习笔记(1),包含实例的详细步骤和截图,方便实践。还有避免入坑提醒。

学习SpringMVC,除了看视频,写代码之外,还是需要记笔记。可以把重点,知识结构,关键代码,还有一些想法记录下来。以备今后在使用过程中查阅或复习。

学习视频是B站的2020最新SpringMVC教程【IDEA版】-springmvc从入门到精通

SpringMVC简介

  • SpringMVC,也称为Spring web MVC,是基于spring的一个框架,实际上是spring的一个模块
  • 专门做web开发,让web开发更方便
  • 可以理解为servlet的升级版,底层是servlet来实现的。
  • 本身也是Spring,即也是一个容器,可以创建和管理对象。
    • SpringMVC容器中放的是控制器对象
    • 使用@Controller注解来创建控制器对象
    • @Controller注解创建的对象不是Servlet,但SpringMVC会让其有控制器的功能。能接收用户的请求,显示处理结果。
    • 实现方式是
      • SpringMVC中有一个servlet对象,DispatcherServlet
      • DispatcherServlet负责接收用户的所有请求,并将请求转发给相应的Controller对象,由Controller对象处理主流。
      • index.jsp —> DispatcherServlet(Servlet) (转发或分配) —>Controller对象(@Controller注解创建)

idea实例

实现一个简单需求:用户在网页上发起请求,请求交给springMVC的控制器对象处理,并显示请求处理结果。

实现步骤

  • 新建web maven工程
  • 加入依赖
    • springMVC依赖,间接把spring的依赖都加入
    • jsp,servelt依赖
  • 重点:在web.xml中注册 springMVC框架的核心对象DispatcherServlet
    • DispatcherServlet叫中央调度器,是Servlet,其父类是HttpServlet
    • DispatcherServlet也叫前端控制器(front controller)
    • DispatcherServlet负责接收用户请求,调用其他的控制器对象,并把请求的处理结果显示给用户(是否采用SpringMVC的标志)
  • 创建请求页 index.jsp
  • 创建控制器(处理器)类
    • 在类的上面加入@Controller注解,创建对象,并放入到SpringMVC容器中
    • 在类的方法上面加入@RequestMapping注解
  • 创建一个结果页,显示请求处理结果
  • 创建SpingMVC的配置文件(spring配置文件一样)
    • 声明组件扫描器,指定@Controller注解所在包名
    • 声明视图解析器。帮助处理视图。

在这里插入图片描述

创建项目

在这里插入图片描述

完善目录结构

在这里插入图片描述
完整目录结构如下:
在这里插入图片描述

修改pom.xml

把jdk版本修改为1.8

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

添加依赖

servlet依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
springMVC依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.14</version>
</dependency>

添加的依赖如下:
在这里插入图片描述
可以看出,spring的核心依赖也间接被加入。

修改web.xml

提升dtd文件版本

原有的web.xml文件中的dtd版本号有些低,功能有些弱。
在这里插入图片描述
可以进行提高。方法如下:
点击工程设置
在这里插入图片描述
点击工程结构
在这里插入图片描述
在这里插入图片描述
删除原有的web.xml
再点击“+”号添加新的web.xml文件
技巧:添加时,文件名为web1.xml文件,然后再在工程目录结构中,再将新添加的web1.xml文件改名为web.xml文件。(因为如果直接取名web.xml文件名,刚修改不会成功,会保持原来web.xml的内容)
在这里插入图片描述
修改后,web.xml文件内容如下:
在这里插入图片描述

注册DispatcherServlet

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

该对象是在第一次用户请求时创建对象,但我们希望在Tomcat服务器启动时就创建该对象,因为:

  • DispatcherServlet创建时,会同时创建springMVC容器对象
  • 并读取springMVC的配置文件,将配置文件中的对象都创建好。
  • 方便用户请求时,就可以直接使用这些对象。
  • 而且这些操作只会做一次。
  • 实现原理是:DispatcherServlet会在初始化时,执行init()方法,在该方法中,实现以下功能:

    //创建spring容器,读取配置文件
    WebApplicationContext ctx = new ClassPathXmlApplicationContext(“springmvc.xml”);
    //把容器对象放入到ServletContext应该域中
    getServletContext(key,ctx).;

这样,在后面的处理中,可以从应用域中取到容器对象了。

服务器启动时自动创建DispatcherServlet对象

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        
        <!--在tomcat启动后,创建Servlet对象
        该标签的值表示tomcat启动后创建对象的顺序,整数,值越小,创建时间越早,一般大于等于0的整数
		-->
        <load-on-startup>1</load-on-startup>
    </servlet>

指定springmvc配置文件信息

springMVC创建容器对象时,读取的配置文件默认是/WEB-INF/<servlet-name>-servlet.xml
一般我们可以自定义配置文件的位置

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--springmvc配置文件的位置属性-->
            <param-name>contextConfigLocation</param-name>
            <!--指定自定义文件的位置,使用类路径,类路径根目录是resources目录-->
            <param-value>classpath*:springmvc.xml</param-value>
        </init-param>
        <!--在tomcat启动后,创建Servlet对象-->
        <load-on-startup>1</load-on-startup>
    </servlet>

指定自定义文件的位置,使用类路径,类路径根目录是resources目录。
在这里插入图片描述

设置url-pattern

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

使用springMVC框架时,url-pattern常使用两种设置:

  1. 使用扩展名,语法:*.xxxx,其中xxxx为自定义的扩展名,常用的为*.do,*.action,*.mvc等。
    表示,只要扩展名为上述,就交由springmvc对象即DispatcherServlet处理
    例如:http://localhost:8080/myweb/some.do
  2. 使用斜杠 “/”
    这里使用*.do,表示,只要请求的扩展名为.do,则该请求将交由DispatcherServlet处理。即交给SpringMVC框架来处理。

以下对于web.xml的配置,不同项目基本相同,新建项目时,只需要直接复制过去,稍做修改即可。

创建请求页

新建一个jsp页面
在这里插入图片描述
命名为index.jsp(将原有的index.jsp文件可以删除,因为缺少一些关于字符集等的申明)。

编写index.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>第一个SpringMVC项目</p>
    <p><a href="some.do">发起some.do请求</a></p>
</body>
</html>

这里通过链接来发起一个请求,请求资源为some.do。

创建Controller对象

在com.javaoldman.controller包下面创建MyController类
在这里插入图片描述
在这里插入图片描述

使用@Controller注解

在MyController类定义的上面使用@Controller注解,用于创建该处理器(Controller)对象,对象会放在springMVC容器中。类似Spring中的@Service,@Compoent注解的作用。

package com.javaoldman.controller;

import org.springframework.stereotype.Controller;

@Controller
public class MyController {
}

处理用户提交的请求

  • springMVC使用方法来处理用户提交的请求。
  • 方法是自定义的,可以有多种返回值,多种参数,方法名自定义

例如:准备使用doSome方法处理some.do请求

需要使用@RequestMapping注解(请求映射),作用是把一个请求地址和一个方法绑定,一个请求指定一个方法处理。

属性value:

  • value 是一个String类型,表求请求的uri地址(本例中是some.do)。
  • value值要求唯一,不能重复
  • 推荐地址以"/"开头

@RequestMapping注解可以放置于:

  • 方法的上面(常用)
  • 类的上面

使用@RequestMapping注解的方法叫做处理器方法或控制器方法,用于处理用户请求,功能上类似Servlet中的doGet,doPost。

package com.javaoldman.controller;

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

@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){  //功能上类似doGet()
        //处理some.do的请求,处理代码这里省略

        //处理返回值
        ModelAndView mv = new ModelAndView();
        //添加ModelAndView数据,原理是框架在请求的最后把数据放入到request域中
        //request.setAttribute("msg","欢迎使用SpringMVC");
        mv.addObject("msg","欢迎使用SpringMVC");
        mv.addObject("fun","执行的是doSome方法");

        //指定视图,指定视图的完整路径
        //框架对视图执行forward转发操作,request.getRequestDispatcher("/show.jsp").forward(...)
        mv.setViewName("/show.jsp");

        //返回mv
        return mv;
    }
}

上面代码中,处理器方法的返回值ModelAndView,表示本次请求的处理结果

  • Model:数据,请求处理完成后,要显示给用户的数据
  • View:视图,比如jsp等。

在处理器方法中,处理代码执行完后,就是要处理返回值。
我们可以通过ModelAndView对象来添加数据,以及指定显示处理结果的视图(即显示处理结果的页面)。使用ModelAndView的addObject方法可以添加任何Object类型的数据,并通过setViewName方法可以指定视图的完整路径。

框架会在处理器方法返回ModelAndView对象后,自动执行setAttribute方法来为request域添加数据,并将该请求转发到视图。

创建处理结果显示页show.jsp

创建show.jsp文件,并编写代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>show.jsp从request域中获取数据</h2>
    <h3>msg:${msg}</h3>
    <h3>fun:${fun}</h3>
</body>
</html>

其中${变量名}是jsp语法,用于获取request域中的变量名所指的属性值。

编辑springmvc配置文件

需要在springmvc配置文件中声明组件扫描器,指定@Controller注解所在的包名。

修改springmvc.xml文件

    <!--声明组件扫描器-->
    <context:component-scan base-package="com.javaoldman.controller"/>

这样,springmvc容器会自动的扫描指定的包,对有@Controller注解的类自动创建对象,该对象将用来处理用户的请求。

相对于DispatcherServlet(front controller),例如MyController类叫做后端控制器(back controller)

配置Tomcat

添加配置
在这里插入图片描述
在这里插入图片描述
设置服务器参数

注意(小心入坑):由于Tomcat10支持的Servlet包名称为 jakarta.servlet包,不是javax.servlet包。但是现在Spring暂不支持jakarta包名,所以,建议安装Tomcat9版本。
在这里插入图片描述

设置web应用发布信息
在这里插入图片描述

在这里插入图片描述
设置web应用名称
在这里插入图片描述
这里将web应用的名称设置为/hello
启动tomcat服务器
在这里插入图片描述
查看服务器启动日志
在这里插入图片描述
服务器启动成功,web应用发布成功。

测试

打开浏览器,地址栏输入http://localhost:8080/hello/
在这里插入图片描述
点击链接
在这里插入图片描述
运行成功。点击链接后,用户发起的some.do请求,由于web.xml中设置的servlet映射,会提交给DispatcherServlet处理,进而将请求分配给由@Contorller注解,自动由springMVC容器创建的MyController对象,并通过@RequestMapping请求映射,找到some.do绑定的处理器方法doSome(),并在处理完成请求后,将所需要的参数值绑定到request域中,并通过转发请求,转发到视图show.jsp,最后在视图页中,通过${}标签,获取request域中的数据,并显示出来。

到此,第一个springMVC框架支持的web应用就创建完成。

下一篇:springMVC学习笔记(2),包括三层架构与SSM的关系,springMVC中MVC模式的实现,配置视图解析器。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值