目录
1. SpringMVC框架的作用
MVC = Model(数据模型) + View(视图) + Controller(控制器)
SpringMVC框架主要解决了V与C的交互问题,也就是控制器(Controller)如何接收客户端提交的请求,最终如何给予客户端响应!
在Java EE中,传统的控制器就是Servlet
组件!假设某个项目中有注册功能、登录功能、修改资料功能、修改密码功能……等等50个功能,应该需要使用50个Servlet
组件来处理对应的请求!则项目运行时,就有50个Servlet
对象是常驻内存的!在web.xml中还需要对每个Servlet
组件进行注册,而每个Servlet
组件至少需要8行代码来注册,则50个Servlet
组件至少需要400行代码来注册……所以,这种传统的使用方式存在消耗内存略大、管理难度大等问题,甚至,还有很多API使用也并不方便!
2. SpringMVC框架的核心组件
-DispatcherServlet
:前端控制器,用于接收所有请求,并组织分发;
-HandlerMapping
:记录请求路径与控制器的对应关系;
-Controller
:自定义的处理请求的控制器组件;
-ModelAndView
:控制器组件处理完请求之后得到的结果,包含数据与视图名称;
-ViewResolver
:视图解析器,可以根据视图名称,确定具体的视图组件。
3. SpringMVC Helloworld
3.1. 案例目标
在浏览器输入http://localhost:8080/项目名称/hello.do
能显示某个自定义的页面。
3.2. 创建项目
创建Maven Project,勾选Create a simple project,Group Id为cn.tedu
,Artifact Id为SpringMVC01
,Packaging选择war
。
注意:此处Packaing必须选择war
。
项目创建出来后,生成web.xml,从前序项目中复制所需的依赖,此次项目中必须添加的依赖只有spring-webmvc
,并且,添加Spring配置文件spring.xml文件到当前项目中。
3.3. 配置DispatcherServlet
由于项目的第1步就是由DispatcherServlet
接收所有请求,它是一个框架中自带的Servlet
组件,为了使得它能够接收所有请求,首先,需要在web.xml中进行配置:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 处理以 .do 结尾的路径的请求 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
SpringMVC框架是基于Spring框架的,所以,还需要加载Spring环境,即:读取Spring的配置文件,在DispatcherServlet
的父类FrameworkServlet
中,就定义了一个名为contextConfigLocation
的属性,该属性的值就应该是Spring配置文件的位置,只要为该属性配置了值,创建DispatcherServlet
对象的同时,就会加载Spring的配置文件!
所以,还需要在<servlet>
节点下补充配置:
<!-- 添加 DispatcherServlet 组件配置-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数 -->
<init-param>
<!-- contextConfigLocation: DispatcherServlet 的父类 springframework 中的一个属性 -->
<param-name>contextConfigLocation</param-name>
<!-- 配置读取的Spring配置文件的路径 -->
<param-value>classpath:spring.xml</param-value>
</init-param>
<!-- load-on-startup:如果值是1,tomcat 初始化时就会初始化这个类,否则要等到第一次请求才会初始化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
最后,在<servlet>
节点下补充配置初始化启动,即:当启动Tomcat时,就会创建DispatcherServlet
的对象,进而加载Spring的配置文件。
为了检验以上配置效果,可以先在spring.xml中添加配置:
<!-- 组件扫描 -->
<context:component-scan base-package="cn.tedu.spring" />
然后,在组件扫描的包下创建类,在类之前添加@Component
,并在构造方法中输出一句话:
@Component
public class User {
public User() {
System.out.println("创建User类的对象!");
}
}
最后,启动Tomcat,在控制台应该可以看到以上输出的内容!
3.4. 使用控制器接收客户端提交的请求
在组件扫描的cn.tedu.spring
包下创建HelloController
控制器类,并且在类之前添加@Controller
注解:
@Controller
public class HelloController {
}
注意:此处必须使用@Controller
注解,不可以使用其它注解!
然后,在该控制器类中添加处理请求的方法,关于方法的声明原则:
-
应该使用
public
权限; -
可以使用
String
类型作为返回值类型; -
方法的名称可以自定义;
-
方法的参数列表可以为空。
所以,添加的方法可以是:
public String showHello() {
}
然后,在方法之前添加@RequestMapping
注解,用于配置请求路径与该方法的对应关系,则后续DispatcherServlet
收到这个路径的请求时,就会调用该方法:
@RequestMapping("hello.do")
public String showHello() {
System.out.println("HelloController.showHello()");
return null;
}
完成后,重新部署该项目到Tomcat,打开浏览器,输入http://localhost:8080/SpringMVC01/hello.do
,浏览器应该无法显示页面,但是,在Eclipse的控制台,可以看到以上方法输出的内容!
如果在控制器提示No Mapping Found ...
的字样,并没有以上输出语句,则错误的原因可能有:
-
控制器类根本不在组件扫描的包中;
-
控制器类之前没有添加注解,或者,添加的不是
@Controller
注解; -
处理请求的方法之前没有正确的添加
@RequestMapping
注解; -
请求的路径与
@RequestMapping
注解中配置的路径不一致; -
尝试Clean项目,甚至Clean Tomcat,甚至更新Maven。
如果这篇文章有帮助到您,请简单给个赞吧,谢谢~