由于SpringMVC的内容太宽泛,太大了,所以这里就先写个小demo,可以讲一些简单的东西,不影响使用,又不用讲解的太过详细、深究过深。
那么,就开始吧~
这里只讲例子,不讲太深的原理,那些会在另一篇开讲。
下面直接看一下这个小demo吧。
前期准备
建立SpringMVC项目是需要一些准备的,不是一下子就可以完成的哦~
首先我们先看一下如何创建一个web项目,因为SpringMVC是构建web项目的,所以我们需要一个像样的web模板。
下面是在IDEA中操作:
后面就简单了,不说了,只要注意模板问题就行。
之后项目结构图是这个样子的
然后,我们就可以准备大展手脚了,但是首先需要配置pom文件
<!-- Spring dependencies -->
<!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
因为项目比较简单,所以只引用了几个jar包,这个需求随项目的扩展而扩展。
为了项目可以运行我们需要配置web容器,这里就配置最常用的Tomcat了:
开始撸代码
然后看一下我的真正的项目结构图吧:
首先,这两个文件就是最愁人的配置文件,可能在以后的SpringMVC的学习中,最让你头痛的就是这些配置文件了,不过不要害怕,征服了它们,你就基本能够应付绝大多数SpringMVC的项目了。
而这个项目结构基本就是一个标准的mavenWeb项目,可能少了一个test文件夹,不过对于我们不影响。
还是老规矩,先贴代码,然后我再慢慢讲。
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>
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-mvc.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<context:component-scan base-package="Controller"/>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
然后是Controller
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Created by yubotao on 2017/09/28.
*/
@Controller
public class HelloController {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String getHW(){
return "hello";
}
}
最后是我们测试用的页面
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset= UTF-8">
<title>Success!</title>
</head>
<body>
<h4>Success Page</h4>
</body>
</html>
运行后结果就是这样的:
简单讲解
这里划重点了,这里的url是和我们Controller中的代码有对应关系的:
@RequestMapping(value = "/hello",method = RequestMethod.GET)
可以看到,这里url和我们的@RequestMapping
的value值是相同的,而method里对应的是相关方法,至于是怎么回事,百度REST风格,了解REST你应该就会明白为什么这么写了,这里不展开。
而return "hello";
中,hello恰好就是我们jsp页面的名字,那Controller是如何通过相应的String找到对应的jsp的呢?
关键点在我们的spring-mvc.xml
配置文件中:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
这部分叫做视图解析器,它的具体原理这里简单的提一下,就是它将Controller中的String进行拼接,我们可以看到它配置了两个属性,分别是prefix
前缀以及suffix
后缀,Controller中的hello经过这个InternalResourceViewResolver
类处理后,就变成了/WEB-INF/jsp/hello.jsp
,这样我们的SpringMVC就找到对应的jsp页面啦~
所以我们看到的内容就是hello.jsp中的内容。
这样Controller中就只有一个@Controller
注解了,这个就是标记,告诉SpringMVC我是Controller,然后就做它该做的事了,不然SpringMVC会限制它,如果我们没有Controller,我们的web项目是没有办法工作的。
接下来就重点讲解这两个配置文件,先看之前已经讲过一部分的spring-mvc.xml
,还剩一点内容:
<context:component-scan base-package="Controller"/>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
文件头的内容我们跳过,只看着三个标签。
第一个标签是开启自动扫描注解的作用,即我们所配置的包内所有注解都会在SpringMVC中进行注册,因为我们只有一个Controller
包,且里面只有一个HelloController
类,而它恰好有一个注解@Controller
,所以这个标签的作用就是开启@Controller
注解的。
第二个标签,相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。
第三个标签是用来开启静态资源的,虽然我们项目中没有使用到,但是,这个是常用标签,所以我给加上了,和它有同等作用的还有这个标签<mvc:resources mapping="" location=""/>
这个标签使用映射来使用静态资源,这里只讲用处,如果需要详细了解它们的工作原理,请百度。
再看最后这个配置文件web.xml
,这个是选完模板自带的,可以看出它的重要性了吧~
首先提一点,在web.xml
中我们可以配置拦截器,过滤器,监听器,taglib配置等,但是这里我不希望塞太多东西,所以只把最简单和最必要的拦截器配置放在里面了,其他类似监听器读取其余配置文件、过滤器解决乱码问题以及POST和DELETE方法无法使用等问题、自定义taglib配置这里不展开,感兴趣或者需要的朋友请自行百度。
回到我们的配置,可以分成两块,先看第一块:
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
最重要的Servlet配置就是它了,最关建的DispatcherServlet
也在这里,请不明就里的朋友自行百度Servlet是干嘛的。
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置springMVC的第一步。
感觉说的比较清楚了,就不解释了;而这里说的拦截匹配规则就是在这个属性中定义的:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
可以看到这里使用了我们的spring-mvc.xml
配置文件;classpath代表resource文件夹下文件的路径。<load-on-startup>
这个标签是定义优先级的,就是我们使用的Servlet的顺序,因为有可能不止使用一个DispatcherServlet
就完事了,可能有多个Servlet,这时候就可以使用这个标签排序了。
第二块:
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这块和第一块是有对应关系的,当你定义了一个<servlet>
时,就要对应一个<servlet-mapping>
,而且它们的<servlet-name>
是相同的。最后的标签<url-pattern>
是相应的url拦截规则,正如它的直译:url的模式;这里使用“/”代表了匹配所有规则,当然你可以有一些特定的匹配规则,但是现阶段你可能是用不到的,如果需要使用的时候,就到这里来找吧:点这里,不会怀孕
总结
到这里,我们就把这个简单的demo讲完了,我们回顾一下这个SpringMVC的工作流程。当我们在网址栏处填写相应的url时,请求被转发到Controller接口中,我们通过“/hello”找到对应的接口方法:
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String getHW(){
return "hello";
}
然后执行方法中的代码,这里返回了一个String
,”hello”,再通过InternalResourceViewResolver
视图解析器拼接前后缀,然后就可以在WEB-INF的jsp文件夹下找到对应的jsp页面/WEB-INF/jsp/hello.jsp
,最后通过SpringMVC的视图渲染返回给我们一个我们想要的页面。当然这些一系列动作都是在DispatcherServlet
的配置完成的情况下才完成的,所以说它的配置是第一步。