当前位置: 移动技术网 > IT编程>开发语言>Java > SpringMVC学习笔记(二)创建一个SpringMVC项目

SpringMVC学习笔记(二)创建一个SpringMVC项目

2020年07月27日  | 移动技术网IT编程  | 我要评论

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述如果你创建出来的项目没有src目录,那么请按下面操作,再重新创建
在VM Options加上 -DarchetypeCatalog=internal

在这里插入图片描述

项目需求

用户在页面发起一个请求,请求交给springmvc的控制器对象,并显示请求的处理结果(在结果页面显示一个欢迎语句)。

实现步骤:

1.新建web maven 工程

2.加入依赖 spring-webmvc依赖(做web开发必须加的依赖),因为springmvc是基于spring的,所以
会间接把spring的依赖都加入到项目
jsp,servlet依赖

3.重点:在web . xml中注册springmvc框架的核心对象DispatcherServlet(只要是springmvc项目,就必须有DispatcherServlet,这是衡量有没有用到springmvc的标准)
1 )DispatcherServlet叫做中央调度器,是一个servlet,它的父类是继承HttpServlet
2)DispatcherServlet也叫做前端控制器( front controller )
3 )DispatcherServlet负责接收用户提交的请求,调用其它的控制器对象,并把请求的处理结果显示给用户

4.创建一个发起请求的页面index. jsp

5.创建控制器(处理器)类
1 )在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中
2 )在类中的方法上面加入@RequestMapping注解。

6.创建一个作为结果的jsp,显示请求的处理结果。

7.创建springmvc的配置文件( spring的配置文件一样)
1 )声明组件扫描器,
指定@Contorller注解所在的包名
2)声明视图解析器。帮助处理视图的。

在pom.xml加入依赖

<!--servlet依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
<!--   springmvc依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.5.RELEASE</version>
  </dependency>

点击右侧maven可以查看依赖
在这里插入图片描述

在pom.xml的plugins下面添加插件,可加可不加

 <!-- 编码和编译和JDK版本 -->
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>

接下来我们看看web.xml,看到2.3了吗,我们需要一个更高的版本,所以需要把这个webxml删了重新建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>
</web-app>

在这里插入图片描述删掉之后再添加
在这里插入图片描述在这里插入图片描述
这就4.0了,再看看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>
</web-app>

还是2.3,所以删掉重新建,我们改个名字

在这里插入图片描述现在看看呢,4.0了

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

然后我们把1web.xml改成web.xml 快捷键shift+f6
在这里插入图片描述

或者右键Refactor
在这里插入图片描述

创建springMVC中央调度器(DispatcherServlet)

在web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    注册SpringMVC核心对象DispatcherServlet-->
    <servlet>
<!-- springmvc这个名字是随便取的,是中央调度器的名字   -->
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet是一个servlet,按照servlet规范  ,首次访问对象时再创建对象,现在只是声明,对象还不会被创建 ,因为还没有访问servlet    -->
<!--因为servlet有一个作用是创建springmvc容器对象的,所以我们期望是tomcat服务器启动就把servlet对象创建出来-->
<!--需要在tomcat服务器启动后,创建Di spatcherServlet对象的实例。为什么要创建Di spatcherServlet对象的实例呢?
因为DispatcherServlet在他的创建过程中,会同时创建springmvc容器对象读取springmvc的配置文件, 把这个配置文件中的对象都创建好,当用户发起
请求时就可以直接使用对象了。-->
<!--servlet的初始化会执行init ( )方法。DispatcherServlet在init ( ){
//创建容器,读取配置文件WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc . xml");
//把容器对象放入到ServletContext中getServletContext( ) .setAttribute(key, ctx);
}-->

<!--下面一句实现在tomcat启动后,创建Servlet对象,load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,数值越小 ,
tomcat创建对象的时间越早。大于等于0的整数。-->
        <load-on-startup>1</load-on-startup>
    </servlet>
</web-app>

此时配置tomcat
配置过程可以参考我的文章https://blog.csdn.net/ningmengshuxiawo/article/details/107565397

运行,发现报错

caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/myweb-servlet.xml]

这是因为springmvc创建容器对象时,读取的配置文件默认是/WEB- INF / - servlet . xml
那么我们需要在WEB- INF目录下面去创建这样一个xml文件,但是这样也未免太过拘束
于是我们可以通过配置来自定义springMVC读取的配置文件的位置

<!--        自定义springMVC读取的配置文件的位置-->
        <init-param>
            <!-- sprsingmvc的配置文件的位置的属性-->
            <param-name>contextConfigLocation</param-name>
            <!--    指定自定义文件的位置,我们制定在类路径,所以需要在类路径的resources目录下创建springmvc,xml-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>

设置servlet-mapping

  <servlet-mapping>
<!--       此处的myweb与上面的myweb对应-->
        <servlet-name>myweb</servlet-name>

<!--使用框架的时候,url- pattern可以使用两种值
1. 使用扩展名方式,语法*.xXxx , xxx是自定义的扩展名。 常用的方式*.do, *.action, * .mvc等等
意思是如果我们的请求是以.do, .action, .mvc结尾的,就交给myweb这个servlet处理
例如 :请求地址http:/ / localhost : 8080/ myweb/ some.do
http:/ / localhost : 8080/ myweb/ other.do
我们下面url-pattern是*.do,所以.do请求交给myweb这个中央调度器处理

2.使用斜杠  “/-->
         <url-pattern>*.do</url-pattern>
    </servlet-mapping>

注意:servlet的配置是固定的,上述配置可以直接拷贝到其他工程使用

创建请求页面

默认创建的jsp没有指定的编码方式,我们把它删掉重新创建一个jsp页面
在这里插入图片描述在这里插入图片描述

创建控制类

在这里插入图片描述

创建控制器方法

package com.bjpowernode.controller;

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

//@Controller这个注解是创建处理器对象的,对象放在springmvc容器中
//@Controller放在类的上面,与spring中的@Service,@Component一样,都是创建对象的,表示这是一个控制器对象,能够处理请求
//能处理请求的都是控制器(处理器): MyController能处理请求,叫做后端控制器(back controller)
@Controller
public class MyController {

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

    /**
     * 准备使用doSome方法处理some.do请求。@RequestMapping:这个注解告诉框架我这个方法要处理用户请求
     * @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。
     *                  一个请求指定一个方法处理。
     *       属性: 1. value 是一个String,表示请求的url地址的(some.do)。
     *                value的值必须是唯一的, 不能重复。 在使用时,推荐地址以“/”为开头
     *       使用位置:1.在方法的上面,这是最常用的。
     *                2.在类的上面
     *  说明: 使用RequestMapping修饰的方法叫做处理器方法或者控制器方法。
     *  使用@RequestMapping修饰的方法可以处理请求的,类似Servlet中的doGet, doPost
     *
     *  返回值:ModelAndView 表示本次请求的处理结果,包含两部分,Model和View
     *   Model: 数据,请求处理完成后,要显示给用户的数据
     *   View: 视图, 比如jsp等等。
     */
 @RequestMapping(value="/some.do")//some.do"是请求地址,和index.jsp中的值一样,加个斜杠表示是根地址
    //这个注解就表示如果请求是some.do,那么这个请求都由doSome()方法来处理
 public ModelAndView doSome(){// doGet()--service请求处理
//处理some.do的请求,相当于service调用处理完成了。
//ModelAndView是框架中的类


     //创建返回值
     ModelAndView mv=new  ModelAndView();
     //添加数据    框架在请求的最后把数据放入到request作用域。相当于执行request.setAttribute("msg","欢迎使用springmvc做web开发");
     mv.addObject("msg","欢迎使用springmvc做web开发");
     mv.addObject("fun","执行的是doSome方法");

     //指定视图   指定视图的完整路径
     //框架对视图执行的forward操作, request.getRequestDispather("/show.jsp).forward(...)
     mv.setViewName("/show.jsp");
//     mv.setViewName("/WEB-INF/view/show.jsp");
//     mv.setViewName("/WEB-INF/view/other.jsp");

     return mv;//数据和视图放到mv了,Mv后期会做setAttribute,forward处理
    //some.do请求执行之后,会调用show.jsp显示结果
     }


}

接下来在webapp下创建show.jsp,在show.jsp写以下内容

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>show.jsp从request作用域获取数据</h3><br/>
<h3>msg数据:${msg}</h3><br/>
<h3>fun数据:${fun}</h3><br/>
<%--${msg}是正则表达式,从mv中获取key为msg的数据值--%>
</body>
</html>

声明组件扫描器

控制器类是一个类,要用注解的话,必须要有组件扫描器,所以需要在springmvc.xml中声明组件扫描器

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

这样注解修饰的类就能够创建对象了,就能处理请求了

运行

运行之后,我们在浏览器中访问http://www.lhsxpumps.com/_localhost:8080/ch02_HellospringMVC_war/
在这里插入图片描述在这里插入图片描述

点击some.do链接,跳转到show.jsp页面
在这里插入图片描述

总结

与写servlet没有太大的区别,框架做简单工作时会比较麻烦,框架适合中型大型项目,项目越小用框架反而越麻烦,框架在大项目中体现优势,因为很多重复的工作框架都做好了

附件

源码地址
提取码:vy3z

本文地址:https://blog.csdn.net/ningmengshuxiawo/article/details/107578538

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网