一、目录结构
二、导入jar包
大家可以看到位于WEB-INF下的lib包里什么都没有,是因为我是直接将jar包
导入到了modual中,所以你看到他们都跑到了External Libraries里了。具体的
做法如下图
三、web.xml
在这里面配置一个很重要的东西,它就是DispatcherServlet(简称:前端控制器)
代码如下
<?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">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
四、spring配置文件
(在这里我取的文件名叫mvc-servlet.xml,而且必须这样,具体原因看上面的代码),摘取如下
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc-servlet.xml</param-value>
</init-param>
只有名字一致,才可能关联起来嘛,这个道理很容易懂,对吧
这个配置文件中,记住两个东西
第一个是组件扫描器,因为后面我们自己定义的类要想把它作为控制器,就需要使用到@Controller注解,而要想注解起作用,就必须配置组件扫描器,扫描类所在的包即可。
第二个是 InternalResourceViewResolver(内部资源视图解析器),它的作用就是将控制器类返回的结果(我们称为逻辑视图名)+ 前缀 + 后缀后组合成物理视图名。比如待会提到的我们自己定义的MyController控制类,它就返回一个字符串"hello", 就是一个逻辑视图名,InternalResourceViewResolver就把它处理为一个名叫 /hello.jsp 的物理视图,这个物理视图名前面只有一个 / 说明它的位置是在web项目路径下的,所以你再去看一眼目录结构,会更好理解,它的位置在web目录下,也就是web项目路径下。
具体的文件代码,如下
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--组件扫描-->
<context:component-scan base-package="com.wang.springmvc.controller"/>
<!--内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
五、自定义控制器类
先看代码
package com.wang.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping("/tallAndStrong")
public String say(){
System.out.println("执行say()方法...");
return "hello";
}
}
一个只有一个方法的简单类,但是由于加上了两个注解,就不一般了
第一个:@Controller
上面已经提到过它的作用了,再说的直白点,被它标记的类,就会成为DispatcherServlet的小跟班,DispatcherServlet就好比是包工头,包公头收到客户的任务需求,也就是收到客户端的请求,他就把这个任务需求匹配给相应的小跟班(MyController类)去做,MyController类有几个方法,就好比小跟班下面有几个打工仔,小跟班再把任务需求交给相应的打工仔,也就是将请求和方法进行匹配,怎么匹配的呢?就是根据下面的注解了
第二个:@RequestMapping
任务需求的人需要高大威猛的(/tallAndStrong),看看打工仔(say方法)的样子 ----->> @RequestMapping("/tallAndStrong"),刚好满足这样的条件,于是他就接到了这个任务需求,开始干活了,也就是执行了say方法。控制台打印出“执行say()方法…”,并且返回一个“hello”字符串
六、物理视图(hello.jsp)
之前我们说过了,控制器类返回的结果(“hello”),通过InternalResourceViewResolver(内部资源视图解析器)的前缀和后缀,组合成了一个名叫 /hello.jsp 的物理视图,位置web目录下,文件名hello.jsp。OK,去看我们的目录结构图,确实没错,代码如下
<%--
Created by IntelliJ IDEA.
User: wang
Date: 2018/12/15
Time: 16:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello标题</title>
</head>
<body>
欢迎加入hello page....
</body>
</html>
七、运行tomcat
1.部署项目(关于tomcat安装和集成略过)
缺少DispatcherServlet类,这就奇怪了??
怎么可能呢,我们确实是导入了包含DispatcherServlet类的
哈哈,当初可是困惑我半天哦,绞尽脑汁,不得其解呀!
各种百度,果然还是有遇到相同问题的人,而且给出了解决方法,在此,特别感谢他!希望帮助更多的人,原文链接在此[https://www.cnblogs.com/chenloveslife/p/8973912.html]
那么根据那篇文章,原因就是tomcat运行需要的lib文件夹以及其中的jar包都没有而导致的。所以往下看解决办法。
最后,记得点击OK,重启tomcat,再去浏览器看效果吧
八、总结一下
1.jar包
缺少commons-logging-1.2.jar 或者 spring-expression-5.0.2.RELEASE.jar或者 javax.servlet-api-3.1.0.jar 都会引起tomcat报错。因此,最稳妥的做法就是把spring的jar包和commons-logging-1.2.jar以及javax.servlet-api-3.1.0.jar都导入进去。
2.IDEA tomcat部署
Project Structure --> Artifacts --> 选择Module --> Output Layout ,点击右下角的Fix按钮,选择第二项,确保Output Layout中的lib下都生成了这些jar,这样tomcat才能正常运行。
完成时间:2018.12.17 00:00:00 这可是熬夜呀,明天星期一还要上班呀!上天保佑不要迟到呀!