Java - SpringMVC 框架详解(一)

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 projectGroup Idcn.teduArtifact IdSpringMVC01Packaging选择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注解,不可以使用其它注解!

然后,在该控制器类中添加处理请求的方法,关于方法的声明原则:

  1. 应该使用public权限;

  2. 可以使用String类型作为返回值类型;

  3. 方法的名称可以自定义;

  4. 方法的参数列表可以为空。

所以,添加的方法可以是:

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 ...的字样,并没有以上输出语句,则错误的原因可能有:

  1. 控制器类根本不在组件扫描的包中;

  2. 控制器类之前没有添加注解,或者,添加的不是@Controller注解;

  3. 处理请求的方法之前没有正确的添加@RequestMapping注解;

  4. 请求的路径与@RequestMapping注解中配置的路径不一致;

  5. 尝试Clean项目,甚至Clean Tomcat,甚至更新Maven。

如果这篇文章有帮助到您,请简单给个赞吧,谢谢~

猜你喜欢

转载自blog.csdn.net/Kevinblant/article/details/120857887
今日推荐