1. SpringMVC框架的作用
MVC = M odel(数据模型) + V iew(视图) + C ontroller(控制器),MVC思想是建议每个项目中至少有这3种核心的角色,用于处理不同的问题,其中,Model表示的数据处理,例如数据的增删改查等,View表示软件的界面,Controller表示控制器,用于接收客户端提交到服务器端的请求,并在处理完请求后给予客户端响应结果。
在不同的技术领域,这种思想可能也不同,例如在一些客户端软件的开发中,会使用MVP、MVVP等思想。
SpringMVC框架是基于Spring框架的,所以,在SpringMVC中,会使用到Spring框架的作用,例如通过Spring框架来创建对象、管理对象,也会使用到Spring框架中的一些注解。
SpringMVC框架主要解决了V-C交互的问题 ,即:客户端将请求提交到服务器后,肯定是由服务器端的控制器接收请求,SpringMVC就解决了如何接收请求(包含请求中的参数等)的问题,当服务器端处理完请求之后,应该给予客户端响应结果,SpringMVC也解决了如何响应的问题!事实上,SpringMVC框架与“M”完全没有任何关系,所以,在SpringMVC的学习过程中,完全不考虑数据的增删改查相关数据库技术。
2. 为什么要使用SpringMVC框架
……
3. SpringMVC HelloWorld
【案例目标】
写完项目后,运行项目,打开浏览器,输入http://localhost:8080/项目名称/hello.do
即可看到预期显示的内容。
【准备工作】
在Eclipse中找到Servers 面板,如果当前没有配置Tomcat,则点击该面板中的链接即可开始添加Tomcat!
如果Eclipse中没有显示Servers 面板,则点击Window菜单的ShowView的Other选项,并在弹出的对话框输入Servers
进行筛选,即可打开该面板!
在添加Tomcat的对话框中,结合本机中已有的Tomcat版本进行选择,然后,在对话框的第2个界面中浏览到本机的Tomcat文件夹,即可完全配置。
配置完成后,在Servers 面板中就会出现刚才配置的Tomcat,同时,在项目列表中还会出现名为Servers 的项目,该项目表示Tomcat的配置,在使用Tomcat的过程中,该项目必须是打开的,如果关闭了,Tomcat将无法启动!
【创建项目】
创建新的Maven Project ,在创建过程中勾选Create a simple project ,Group Id 填为cn.tedu
,Artifact Id 填为springmvc01
,Packaging 必须选择war
。
如果创建的项目是客户端项目,是通过某个类的main()
方法启动的项目,应该选择jar
;如果创建的项目是服务器端项目,是需要运行在Tomcat上的,就要选择war
。
在Eclipse中,创建的war
项目默认会报错,因为在项目中缺少web.xml 文件,但是,war
项目并不一定需要该文件!可以在pom.xml 中添加以下配置:
< properties>
< failOnMissingWebXml> false</ failOnMissingWebXml>
</ properties>
当然,以上配置也可以结合关于开发、编译版本的配置为:
< properties>
< failOnMissingWebXml> false</ failOnMissingWebXml>
< maven.compiler.source> 1.8</ maven.compiler.source>
< maven.compiler.target> 1.8</ maven.compiler.target>
</ properties>
并且,继续在pom.xml 中添加spring-webmvc
的依赖:
< dependencies>
< dependency>
< groupId> org.springframework</ groupId>
< artifactId> spring-webmvc</ artifactId>
< version> 5.2.5.RELEASE</ version>
</ dependency>
</ dependencies>
最后,对项目点右键,选择Properties ,并在弹出的项目属性对话框中,左侧选择Targeted Runtimes ,在右侧勾选Tomcat。
【使用SpringMVC框架处理请求】
首先,在项目中创建cn.tedu.spring
包,用于存放相关文件;
然后,自定义某个类(类名可以自定义),继承自AbstractAnnotationConfigDispatcherServletInitializer
类:
package cn. tedu. spring ;
import org. springframework. web. servlet. support. AbstractAnnotationConfigDispatcherServletInitializer ;
public class SpringMvcInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class < ? > [ ] getRootConfigClasses ( ) {
// TODO Auto-generated method stub
return null ;
}
@Override
protected Class < ? > [ ] getServletConfigClasses ( ) {
// TODO Auto-generated method stub
return null ;
}
@Override
protected String [ ] getServletMappings ( ) {
// TODO Auto-generated method stub
return null ;
}
}
由于AbstractAnnotationConfigDispatcherServletInitializer
是抽象类,所以,继承之后,需要重写其中的3个抽象方法:
getRootConfigClasses()
:获取Spring的配置类,在简单的SpringMVC项目中,也许并不需要编写任何Spring环境的配置,则该方法返回null
即可,后续,如果整合MyBatis框架或其它框架时,可能需要编写相关配置;getServletConfigClasses()
:获取SpringMVC的配置类,SpringMVC的配置类可以自定义,且必须实现WebMvcConfigurer
接口;getServletMappings()
:获取框架所处理的请求的路径,假设所有以.do
为后缀的请求都需要被SpringMVC框架处理,则可以配置为*.do
。
例如,可以将以上方法重写为:
package cn. tedu. spring ;
import org. springframework. web. servlet. support. AbstractAnnotationConfigDispatcherServletInitializer ;
public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class < ? > [ ] getRootConfigClasses ( ) {
return null ;
}
@Override
protected Class < ? > [ ] getServletConfigClasses ( ) {
return new Class [ ] { SpringMvcConfigurer . class } ;
}
@Override
protected String [ ] getServletMappings ( ) {
return new String [ ] { "*.do" } ;
}
}
以上SpringMvcInitializer
类的作用就类似于web.xml 的作用!例如,后续,当项目中需要使用到Filter
组件时,也可以在这个类中添加配置!
接下来,在SpringMVC的配置类SpringMvcConfigurer
的声明之前配置组件扫描:
package cn. tedu. spring ;
import org. springframework. context. annotation. ComponentScan ;
import org. springframework. web. servlet. config. annotation. WebMvcConfigurer ;
@ComponentScan ( "cn.tedu.spring" )
public class SpringMvcConfigurer implements WebMvcConfigurer {
}
注意:在SpringMVC项目中,组件扫描必须配置在SpringMVC的配置类之前,不可以只配置在Spring的配置类之前!
在原生的Java EE技术中,控制器类就是一个个自定义的Servlet
类,需要继承自HttpServlet
的!而在SpringMVC项目中,控制器类不需要继承自某个特定的类,也不需要实现任何接口,仅有的要求是:
必须放在组件扫描的包中; 必须添加@Controller
注解。
如果需要SpringMVC框架处理某个路径的请求,需要在控制器类中自定义方法,然后在方法内部编写代码进行处理,关于方法的声明:
在方法的声明之前添加@RequestMapping
注解,用于配置处理哪个路径的请求; 应该使用public
权限; 返回值类型暂时使用String
类型; 方法的名称可以自定义; 方法的参数列表暂时为空。
例如,可以设计为:
package cn. tedu. spring ;
import org. springframework. stereotype. Controller ;
import org. springframework. web. bind. annotation. RequestMapping ;
@Controller
public class HelloController {
// http://localhost:8080/springmvc01/hello.do
@RequestMapping ( "hello.do" )
public String hello ( ) {
System . out. println ( "HelloController.hello()" ) ;
return "" ;
}
}
完成到以上步骤时,就可以将项目部署到Tomcat中,启动Tomcat,在浏览器中输入测试网址http://localhost:8080/springmvc01/hello.do
后,在浏览器应该会提示404错误,但是,在Eclipse的控制台中,应该可以看到以上hello()
方法中的输出语句!
最后,如果希望访问后,能够在浏览器输出自定义的内容,可以在方法的声明之前添加@ResponseBody
注解,并将期望返回的内容写在hello()
方法返回的字符串中即可!例如:
package cn. tedu. spring ;
import org. springframework. stereotype. Controller ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. ResponseBody ;
@Controller
public class HelloController {
@RequestMapping ( "hello.do" )
@ResponseBody
public String hello ( ) {
System . out. println ( "HelloController.hello()" ) ;
return "<font color=red>Hello</font>, <font color=blue>SpringMVC</font>!!!" ;
}
}