IDEA建立Spring MVC Hello World 详细入门教程

目录

  • 通过IDEA新建Spring MVC项目
  • 设置运行、调试相关配置
  • 导入Spring MVC 相关类库
  • 添加 Controller
  • 修改 url-pattern(web.xml)
  • 配置 component-scan(dispatcher-servlet.xml)
  • 配置 ViewResolver(dispatcher-servlet.xml)
  • 添加视图文件(.jsp)
  • 通过 Model 向 View 传值

 

通过IDEA新建Spring MVC项目

先创建项目,从封面或者主窗体都可以创建

IDEA建立Spring MVC Hello World 详细入门教程

IDEA建立Spring MVC Hello World 详细入门教程

 “New Project”窗口,选择附加的类库"Spring MVC"

 IDEA建立Spring MVC Hello World 详细入门教程

选择项目名称和存放的位置

IDEA建立Spring MVC Hello World 详细入门教程

 最后点击Finish按钮,IDEA会帮你下载需要的类库

IDEA建立Spring MVC Hello World 详细入门教程

 创建完成后项目有这些文件,主要是三个xml文件+一个index.jsp

这个jsp文件最后肯定是不要的,不过也先不要慌着删

 IDEA建立Spring MVC Hello World 详细入门教程

 

设置运行、调试相关配置

 项目建好后,并不能直接运行,Run和Debug菜单都是灰色不能点击的

要需要做一下运行和调试的相关配置

作为.NET转Java的码农,有时候真的很怀念宇宙第一IDE:Visual Studio,根据模板创建的项目很少有不能直接运行的,算了,不说也罢,继续配置。。。

IDEA建立Spring MVC Hello World 详细入门教程IDEA建立Spring MVC Hello World 详细入门教程

IDEA建立Spring MVC Hello World 详细入门教程

先设置“Server”选项卡

 IDEA建立Spring MVC Hello World 详细入门教程

点开“Deployment”选项卡,继续设置,

创建Artifact,最后记得点OK保存

 IDEA建立Spring MVC Hello World 详细入门教程

现在,Run菜单下出现了Run 'mvc-helloworld'的菜单项目(Shift+F10运行,Shift+F9调试)

工具栏上也有了运行和调试按钮,你可以选择自己喜欢的方式运行项目

IDEA建立Spring MVC Hello World 详细入门教程IDEA建立Spring MVC Hello World 详细入门教程

虽然我们还没开始写代码,但是毕竟IDEA帮我们生成了一个jsp文件,可以用这个文件看看站点能否打开(index.jsp代码如下)

IDEA建立Spring MVC Hello World 详细入门教程

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

IDEA建立Spring MVC Hello World 详细入门教程

浏览器输入地址 http://localhost:8080/index.jsp

IDEA建立Spring MVC Hello World 详细入门教程

项目是运行不起来的(其实离运行起来,还缺不少配置,继续往后看),

啥情况?当然要看日志。。。点开下面的“Tomcat Localhost Log”,可以看到问题出在哪里。。。

 IDEA建立Spring MVC Hello World 详细入门教程

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

意思就是找不到ContextLoaderListener这个类

导入Spring MVC相关类库

 Java中,ClassNotFoundException好像是个挺常见的异常,先检查相应的jar包有没有包含进来...

打开Project Structure,跟项目相关配置基本都在个菜单里边。。。

 IDEA建立Spring MVC Hello World 详细入门教程

点开"Artifacts"选项卡后,上面有多出很明显的提示,缺失Spring MVC相关类库的引用

尽管IDEA搞这么多提醒,为啥我感觉还是不够醒目?

 IDEA建立Spring MVC Hello World 详细入门教程

 按照下面的几个方法修复错误,随便选一种就行

让程序部署的时候,把Spring MVC相关类库复制到lib文件夹中

 IDEA建立Spring MVC Hello World 详细入门教程

重新运行一次项目(Shift+F10运行,Shift+F9调试)……

如果你上次没有Stop,这次运行可能会弹出这个对话框,选择“Restart server”然后"OK"吧...

IDEA建立Spring MVC Hello World 详细入门教程

再一次访问 http://localhost:8080/index.jsp

这次终于可以看见点内容了,起码说明服务启动了。。

 IDEA建立Spring MVC Hello World 详细入门教程

如果再看刚才的日志,原来报错也没有了

 

添加Controller

站点可以打开了,不过我们这个不是MVC,因为没有M、没有V也没有C

我们就从MVC中的C(Controller)开始,继续配置

在新建Controller之前,首先要建一个包,SpringMVC是没法运行在默认包下的,按照如下方式建包,

我建的包名称为:wormday.springmvc.helloworld

其实包名随意,但是必须要有。。。

IDEA建立Spring MVC Hello World 详细入门教程

 

 IDEA建立Spring MVC Hello World 详细入门教程

IDEA建立Spring MVC Hello World 详细入门教程

 再这个包下新建Java Class文件 HiController

 IDEA建立Spring MVC Hello World 详细入门教程

代码如下

IDEA建立Spring MVC Hello World 详细入门教程

package wormday.springmvc.helloworld;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/hi")
public class HiController {

    @RequestMapping("/say")
    public String say() {
        return "/WEB-INF/jsp/say.jsp";
    }
}

IDEA建立Spring MVC Hello World 详细入门教程

如果你跟我一样又迫不及待的要访问一下这个Controller的Action 地址应该是:

 http://localhost:8080/hi/say.form   其实这个时候访问结果是404,因为后边还有不少配置没有做...

 IDEA建立Spring MVC Hello World 详细入门教程

 

类上的注解@RequestMapping("/hi")指定 Url路径前边一部分

方法上的注解@RequestMapping("/say")指定 Url路径最后一部分

也可以只把注解写在方法上,比如@RequestMapping("/hi/say”)

那个结尾的form是什么鬼,就接着看下一段 url-pattern...

修改 url-pattern(web.xml)

先打开web\WEB-INF\web.xml文件

有关于ServletMapping的设置,通过这个设置,可以配置那些类型的url用那些servlet来处理

IDEA建立Spring MVC Hello World 详细入门教程

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>

IDEA建立Spring MVC Hello World 详细入门教程

结合这一段xml,我们可以看到,IDEA默认帮我配置了一个名字叫做dispatcher的Servlet

这个Servlet使用org.springframework.web.servlet.DispatcherServlet这个类来处理

这个Servlet对应的Url是*.form

如果你跟我一样不喜欢每个MVC Url后边都带一个form,可以改成斜杠

<url-pattern>/</url-pattern>

如果你现在重新启动程序,然后继续访问http://localhost:8080/hi/say

发现,依旧404,并且伴随每次访问,都在Server的Output窗口有一个错误日志

org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/hi/say] in DispatcherServlet with name 'dispatcher'

IDEA建立Spring MVC Hello World 详细入门教程

意思就是没有找到相应的Controller,不但要把Controller的代码写好,还要告诉Spring(在这里其实是dispatcher servlet)去哪里找这些Controller。。。

作为验证,你可以在Controller里边加一个断点,然后刷新页面,程序根本就没有执行到Controller里边

IDEA建立Spring MVC Hello World 详细入门教程

所以现在轮到修改另外一个配置文件了,dispatcher-servlet.xml

 

配置 component-scan(dispatcher-servlet.xml)

 component-scan就是告诉Servlet去哪里找到相应的Controller

打开 dispatcher-servlet.xml

在已经存在的<beans></beans>中间加上

<context:component-scan base-package="wormday.springmvc.helloworld"/>

base-package指定的就是存放Controller的包

 做完这一步之后,重新启动项目,再次访问  http://localhost:8080/hi/say

这次应该还是404错误,不过比刚才的404错误前进了一大步

毕竟这次Controller已经执行了,如果刚才的断点没有去掉,你可以验证一下看看

这一回是因为是“/WEB-INF/jsp/say.jsp”这个View找不到(我们刚才确实只是告诉他这个位置,但是从来没有创建过这个文件)

再强调一次,Spring Mvc如果找不到Controller或者View都会报404错误,具体找不到的是谁,要具体分析了,好在一般都能简单的分辨出来。

IDEA建立Spring MVC Hello World 详细入门教程

这个地方有个问题要额外说明一下,一般来说Controller代码的返回值是成字符串“say”就可以了,不需要.jsp,也不需要前边的路径,比如

IDEA建立Spring MVC Hello World 详细入门教程

但是如果现在这样写,会报一个很奇怪的500错误,而不是404
IDEA建立Spring MVC Hello World 详细入门教程

HTTP Status 500 - Circular view path [say]: would dispatch back to the current handler URL [/hi/say] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

 原因是:

  1. 我们还没有配置ViewResolver,Spring会默认帮我们生成一个,自动生成的并没有配置View默认的前缀和后缀(针对本项目本别是"/WEB-INF/jsp/"和".jsp"),所以暂时只能写绝对路径,本文后边也会讲到如何配置
  2. 如果不是"/"开头的路径(也就是相对路径了),Spring会把当前路径给配上去,当前Controller路径是"/hi/"配上View的路径"say",变成了"/hi/say",Controller执行结果发给View,这个View恰恰又是Controller本身,Spring发现这是个死循环,就不再执行直接报上面的错误了
  3. 这个错误我再Controller单元测试的时候也遇到过,原理知道了就知道如何解决了

但是目前必须制定View的绝对路径,因为我们还没有配置 配置 ViewResolver,后边会专门说到这个问题 

 

添加视图文件(.jsp)

 

 这个没啥好解释的,刚才你让Spring去哪里找这个View,就把这个View创建在哪里

如果找不到,他就简单粗暴的报404错误,根据前边我写的代码,创建位置应该入下图。

IDEA建立Spring MVC Hello World 详细入门教程

其实Spring并不限制你必须创建在WEB-INF下,但是这样更安全,因为WEB-INF目录用户是不能直接访问的,毕竟View里边可能会有一些代码

IDEA建立Spring MVC Hello World 详细入门教程

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>hello world</body>
</html>

IDEA建立Spring MVC Hello World 详细入门教程

再次访问 http://localhost:8080/hi/say

终于不再报错了,看起来Controller也把相应的视图找到了

IDEA建立Spring MVC Hello World 详细入门教程

  

配置 ViewResolver(dispatcher-servlet.xml)

还记得刚才Controller返回值必须是View的绝对路径这个事情么?一般情况下,我们是不会这样写的

网上的教程大部分也仅仅返回View的名字,比如

 IDEA建立Spring MVC Hello World 详细入门教程

原因是一般都会在dispatcher-servlet.xml上指定如下的代码。

IDEA建立Spring MVC Hello World 详细入门教程

    <!--指定视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 视图的路径 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 视图名称后缀  -->
        <property name="suffix" value=".jsp"/>
    </bean>

IDEA建立Spring MVC Hello World 详细入门教程

 class 指定ViewResolver的实现的类,你可以根据不同的情况,使用不用的ViewResolver,这里指定的是 org.springframework.web.servlet.view.InternalResourceViewResolver

刚才我没有指定,默认的也是这个类

后边的前缀和后缀比较简单,看看就明白了

记得改完xml之后,同步修改Controller的返回值。。不然又要404了

通过 Model 向 View 传值

通过上面的操作,已经完成了MVC中的(V和C),M还没见影子,让我们继续修改

打开刚才定义的Controller 也就是 HiController.java文件

修改如下(修改点我已经高亮了)

IDEA建立Spring MVC Hello World 详细入门教程

package wormday.springmvc.helloworld;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; // 这里导入了一个Model类
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/hi")
public class HiController {

    @RequestMapping("/say")
    public String say(Model model) { // 参数中传入Model
        model.addAttribute("name","wormday"); // 指定Model的值
        model.addAttribute("url","http://www.cnblogs.com/wormday/p/8435617.html"); // 指定Model的值
        return "say";
    }
}

IDEA建立Spring MVC Hello World 详细入门教程

然后再打开View,也就是say.jsp文件,修改如下

IDEA建立Spring MVC Hello World 详细入门教程

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
hello world,${name}
<br/>${url}</body>
</html>

IDEA建立Spring MVC Hello World 详细入门教程

两个之间的关系就不解释了,然后重新运行项目,刷新页面

IDEA建立Spring MVC Hello World 详细入门教程

一个最简单的MVC项目完成了!!!