1.Spring MVC框架
1.1Spring MVC介绍
SpringMVC和Struts2都属于表现层的框架,它是Spring框架的一个模块,提供web层解决方案,我们可以从Spring的整体结构中看得出来:
1.2MVC在b/s系统的应用
mvc是一个设计模式,在b/s系统的应用如图:
解释如下:
- 1.用户发起request请求至控制器(Controller),控制接收用户请求的数据,委托给模型进行处理。
- 2.控制器通过模型(Model)处理数据并得到处理结果,模型通常是指业务逻辑(jsp、dao、service)。
- 3.模型处理结果返回给控制器。
- 4.控制器将模型数据在视图(View)中展示,web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。
- 5.控制器将视图response响应给用户,通过视图展示给用户要的数据或处理结果。
1.3Spring mvc架构
1.3.1架构图
1.3.2架构流程
- 1.用户发送请求至前端控制器DispatcherServlet
- 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- 4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 5.执行处理器(Controller,也叫后端控制器)。
- 6.Controller执行完成返回ModelAndView
- 7.HandlerAdapter将controller执行结果ModelAndView返回
- 8.DispatcherServlet
DispatcherServlet将ModelAndView传给ViewReslover视图解析器 - 9.ViewReslover解析后返回具体View
- 10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- 11.DispatcherServlet响应用户
1.3.3架构中涉及的组件说明
- 1.DispatcherServlet:前端控制器。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。由框架实现
- 2.HandlerMapping:处理器映射器。HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。由框架实现
- 3.Handler:处理器。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
- 4.HandlAdapter:处理器适配器。通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。
- 5.ViewResolver:视图解析器。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
2.入门程序
2.1需求
实现商品列表的查询并在页面中显示。这里由于Spring mvc不涉及对数据库的操作,所以我们在程序中的数据就用静态数据生成。
工程结构为下:
2.2需要的jar包
这里我使用的是spring3.x(带spring webmvc的模块)。
2.3第一步:前端控制器的配置
在WEB-INF/web.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--配置文件的地址
如果不配置contextConfigLocation,默认查找的配置文件名称是classpath下的:servlet名称+"-servlet.xml"
即springmvc-servlet.xml-->
<param-value>springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--可以配置/:此工程所有的请求全部由springmvc解析,此种方式可以实现RESTful方式,需要特殊处理对静态文件的解析不能由springmvc解析
可以配置*.do或者*.action,所有请求的url扩展名为.do或.action由springmvc解析,此中方法常用
不可以配置/*,如果配置/*,返回jsp也由springmvc解析,这是不对的-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
2.4第二步:Spring MVC配置文件
在web目录下创建Spring MVC的配置文件springmvc.xml,以后需要在里面配置Spring MVC架构三大组件(处理器映射器、适配器、视图解析器),里面根标签的内容同Spring的配置文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-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/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
</beans>
2.5第三步:配置处理器映射器
因为对于用户发起的request请求,前端控制器首先会请求HandlerMapping处理器映射器来查找Handler,所以我们首先配置它,在springmvc.xml中加入如下内容:1
2
3
4
5<!--配置处理器映射器
springmvc框架根据HandlerMapping接口判断是否是处理器映射器-->
<!--根据bean的name进行查找Handler,将action的url配置在bean的name中-->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
BeanNameUrlHandlerMapping
:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name为请求的url,且必须以.action结尾。
2.6第四步:配置处理器适配器
处理器映射器将查找到的Handler返回给DispatcherServlet后,DispatcherServlet会调用适配器执行Handler,通过适配器去扩展对不同Handler的执行。所以我们再配置它,在springmvc.xml中添加如下内容:1
2
3<!--配置处理器适配器
springmvc框架根据HandlerAdapter接口判断是否是处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
SimpleControllerHandlerAdapter
:即简单控制器处理适配器,所有实现了org.springframework.web.servlet.mvc.Controller
接口的Bean作为Springmvc的后端控制器。
2.7第五步:后端控制器的编写
DispatcherServlet通过处理器适配器找到后端控制器Handler,所以我们需要进行Handler的编写,在src包下新建ItemController.java,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import po.Items;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Created by codingBoy on 16/11/13.
*/
public class ItemController1 implements Controller
{
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
//使用静态的数据将商品信息显示在jsp页面
List<Items> itemsList = new ArrayList<>();
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setCreatetime(new Date());
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("itemsList",itemsList);
modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");//指定用户访问的jsp页面地址
return modelAndView;
}
}
数据我们采用静态数据的输入,当然我们还需要创建Items.java这个pojo对象,就是上一篇文章中我们用到的.java文件。
2.8第六步:后端控制器的配置
在springmvc.xml中配置Handler由spring来管理Handler,在springmvc.xml文件中添加如下内容:1
2
3
4
<!--配置Handler
由于使用了BeanNameUrlHandlerMapping处理映射器,所以name要配置为url-->
<bean name="/itemList.action" class="controller.ItemController1"></bean>
name="/itemsList.action"
:前边配置的处理器映射器为BeanNameUrlHandlerMapping
,如果请求的URL为“上下文/itemsList.action”将会成功映射到ItemController1控制器。
2.9配置视图解析器
Handler执行完成后给处理器适配器返回一个ModelAndView对象,它是Spring MVC的一个对象,用于对Model和View进行封装。然后处理器适配器又将这个对象返回给DispatcherServlet,DispatcherServlet调用视图解析器进行视图解析,所以这里我们要配置视图解析器,在springmvc.xml中添加如下内容:1
2
3
4<!--配置视图解析器
要求将jstl的包加到classpath-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>
然后部署服务器,在浏览器中输入http://localhost:8080/SpringMvc/itemList.action
后便可以看到如下页面:
通过上面的讲解我们便完成了对Spring MVC开发框架的入门,更多的处理器映射器和处理器适配器的介绍见我的spring mvc第二篇文章Spring MVC之注解与非注解映射器和适配器。
扩展:对于前端控制器DispatcherServlet,我有必要多说几句,在spring-webmvc.jar包中有一个DispatcherServlet.properties文件,内容如下:
里面包含一些默认的组件例如处理器映射器、处理器适配器等,当程序启动时,DispatcherServlet会自动加载DispatcherServlet.properties配置文件,从而默认加载各个组件,所以如果我们在springmvc.xml中配置了处理器映射器和处理器适配器,那程序就以springmvc.xml中的配置信息为主。
2018.3.19更
欢迎加入我的Java交流1群:659957958。
2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。
3.联系
If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.