概述
首先对于常见的SSM框架(Spring+SpringMVC+MyBatis),三大部分承担了三个层次的工作。
- SpringMVC——>web层;
- Spring——>service层;
- MyBatis——>dao层;
由此可见,SpringMVC是基于Controller的框架。
SpringMVC主要组件
- DispatcherServlet:本质就是一个Servlet,作为Spring应用程序和其客户端之间的前台控制器。 调度器servlet拦截到应用程序的所有请求,并查询要调用哪个控制器来处理请求的Handler Mapping。 作为Spring应用程序和其客户端之间的前台控制器。 调度器servlet拦截到应用程序的所有请求,并查询要调用哪个控制器来处理请求的Handler Mapping。
- HandlerMapping:负责找到处理特定请求的适当控制器。 请求URL和控制器类之间的映射是通过XML配置或注释完成的。
- HandlerAdapter:本质就是Controller,负责通过调用其他业务/服务类来处理请求。 输出可以附加到将发送到视图的模型对象。 要知道将呈现哪个视图,控制器将查看View Resolver。
- ViewResolver:从逻辑名称中查找物理视图文件。
- View:JSP,HTML,XML,Velocity模板等的物理视图文件。
SpringMVC入门案列
首先创建一个web工程,导入jar包。
结构如下:
按照框架逻辑,我们先配置SpringMVC的前端控制器DispatcherServlet。
- 配置SpringMVC前端控制器;
- 配置Servlet映射关系——servlet-mapping;
需要在web.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>SSMDemo</display-name>
<!-- 配置SpringMVC前端控制器 -->
<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:/springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<!-- Servlet映射关系配置 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>WEB-INF/first.jsp</welcome-file>
</welcome-file-list>
</web-app>
我们在web.xml中指定SpringMVC的入口程序DispatcherServlet时,实际上蕴含了一个对核心配置文件的指定过程([servlet-name]-servlet.xml)。
因此,我们还需要一个SpringMVC的核心配置文件:XXX-servlet.xml。其中关于Bean,SpringMVC等相关信息都在这个配置文件中进行配置。
- 配置HandlerMapping;
- 配置视图解析器ViewResolver;
如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
">
<!-- 处理器映射器HandlerMapping 将请求交给相应的处理器-->
<bean name="/first.action"
class="com.tedu.controller.FirstController"></bean>
<!-- 视图解析器ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
配置完成后我们就可以实现Controller和View了。
编写一个类实现Controller接口,如下:
package com.tedu.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
*
*@ClassName:FirstController
*
*@Description:TODO
*
*@author Chen
*
*@date:2019年5月9日 下午6:57:44
*/
public class FirstController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("msg1", "Hello1111");
mav.addObject("msg2", "Hello22222");
mav.setViewName("first");
return mav;
}
}
View编写一个jsp页面:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
这是First页面
<br>
${msg1}
<br>
${msg2 }
<br>
<%=new Date().toLocaleString() %>
</body>
</html>
SpringMVC的一个简单案列就完成了。
访问http://localhost:8080/SSMDemo/first.action
通过注解配置实现SpringMVC
修改SpringMVC配置文件springmvc-servlet.xml如下:
- 开启包扫描和注解模式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
">
<!-- 开启包扫描 -->
<context:component-scan base-package="com.tedu.controller"></context:component-scan>
<!-- 开启SpringMVC注解 -->
<mvc:annotation-driven/>
<!-- 视图解析器ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
在此就无需手动配置HandlerMapping,配置注解后SpringMVC将通过程序中的注解自动解析对于请求的处理器。
编写Controller:
- 注解@Controller、@RequestMapping
package com.tedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class AnnoController {
@RequestMapping("/first.action")
public ModelAndView first() {
ModelAndView mav = new ModelAndView();
mav.addObject("msg1", "Hello First~");
mav.addObject("msg2", "Hello SpringMVC");
return mav;
}
@RequestMapping("/second.action")
public String second(Model model) {
model.addAttribute("msg1","Hello Second!");
model.addAttribute("msg2","Hello SpringMVC Annotation~");
return "second";
}
}
Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。