Spring MVC属于SpringFrameWork的产品,应用在web层(表现层),和struts2一样,都采用MVC架构。
环境搭建
需要导入的jar包
web.xml(WEB-INF下)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>ssm0523</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- springmvc前端控制器 -->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 在src目录下创建配置文件:springmvc.xml -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在tomcat启动的时候就加载这个servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- 配置Post请求乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
“classpath:springmvc.xml”用于配置spring mvc的配置文件的位置和名称,这里说明会新建一个springmvc.xml的配置文件。
springmvc.xml创建在src目录下。
servlet-mapping表示拦截的模式,这里拦截.action, .jpg, .png等。
最后配置一个filter用于解决post请求的乱码,采用utf-8编码。
Springmvc的核心控制器是DispatcherServlet。
springmvc.xml(src目录下)
<?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: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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.mq"></context:component-scan>
<!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value="/"></property>
<property name = "suffix" value = ".jsp"></property>
</bean>
</beans>
prefix的值是“/”,表示监听范围,这里表示监听WebContent下的所有文件。
suffix的值是“.jsp”,表示监听后缀名为.jsp的文件。
两个合起来,就是监听WebContent目录下的.jsp文件。
base-package表示要扫描的包结构。这里表示扫描com.mq包下的所有文件。
只要确定了文件名称,就可以访问该资源了。
创建控制器
@Controller
public class HelloWorld {
/**
* RequestMapping表示请求路径的匹配。当页面中访问helloworld时,该方法就会接收到请求。
* @return 返回资源名称,根据springmvc.xml中的配置,如果能找到对应的资源,则跳转到该资源,这里跳转到success.jsp页面
*/
@RequestMapping("/helloworld")
public String hello(){
//处理请求逻辑
System.out.println("hello world");
return "success";
}
}
@Controller表示该类是一个控制器。这个注解必须有。
@RequestMapping表示请求路径的匹配。当页面中访问helloworld时,对应的方法就会接收到请求进行处理。
如果访问http://localhost:8080/mySpringmvc1/helloworld.action,则会跳转到success.jsp。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
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>Insert title here</title>
</head>
<body>
<a href="helloworld.action">hello world</a><br>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
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>Insert title here</title>
</head>
<body>
<h4>Success Page</h4>
</body>
</html>
结果截图:
窄化映射
@Controller
@RequestMapping("/haha")
public class HelloWorld {
/**
* RequestMapping表示请求路径的匹配
* @return 返回资源名称,根据springmvc.xml中的配置,如果能找到对应的资源,则跳转到该资源,这里跳转到success.jsp页面
*/
@RequestMapping("/helloworld")
public String hello(){
//处理请求逻辑
System.out.println("hello world");
return "success";
}
}
访问路径为:
<a href="haha/helloworld.action">hello world</a><br>
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
访问静态资源
在WebContent目录下创建img子目录,然后放入一张图片。图片名称为xiazai.jpg.
控制器
@Controller
@RequestMapping("/haha")
public class HelloWorld {
/**
* RequestMapping表示请求路径的匹配
* @return 返回资源名称,根据springmvc.xml中的配置,如果能找到对应的资源,则跳转到该资源,这里跳转到success.jsp页面
*/
@RequestMapping("/helloworld")
public String hello(){
//处理请求逻辑
System.out.println("hello world");
return "success";
}
@RequestMapping("/picture")
public String picture(){
System.out.println("这是一张图片");
return "xiazai";
}
}
修改springmvc.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: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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.mq"></context:component-scan>
<!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
<!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value="/"></property>
<property name = "suffix" value = ".jsp"></property>
</bean> -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value="/img/"></property>
<property name = "suffix" value = ".jpg"></property>
</bean>
</beans>
访问路径
<a href="haha/picture.action">这是一幅图片</a><br>
访问后的截图
SpringMVC的一些概念
架构流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
组件说明
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。