赞
踩
SpringMVC是Spring框架的一个模块,SpringMVC和Spring无需通过中间整合层进行整合。SpringMVC是一个基于MVC的web框架,即Spring Web MVC。Spring Web MVC和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:
首先来一下MVC,MVC是一种开发模式,在大量的软件开发过程中所积累出来的经验,然后根据经验抽象出来的一种开发模式。下面来看一下MVC设计模式B/S架构的系统下的应用:
从上图中看到MVC的基本框架后,那么下面学习SpringMVC框架就有了一个大体的思路。因为SpringMVC就是MVC模型的一种框架。所以学习SpringMVC框架主要就是来看SpringMVC中的C(控制层)、M(模型层)、V(视图层)的各种技术实现即可。如下图所示:
以商品订单管理为例进行测试开发,涉及表用户表、订单表、订单明细、商品明细表。
第一步:配置SpringMVC的前端控制器
SpringMVC的前端控制器是个Servlet,所以在web应用的web.xml文件中来配置该前端控制器,如下图所示:
servlet配置完成后,需要对该servlet类来配置相应的servlet-mapping如下图所示:
url-pattern的配置有两种方式:
第一种: * .action;访问以.action结尾的任何请求都由DispatcherServlet进行解析。
第二种:/,所有访问的地址(jsp除外)都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用此种方式可以实现RESTful风格的url。
第三种: /* , 所有的地址都解析.
第二步:配置处理器适配器
在classpath下的springmvc.xml文件中配置处理器映射器。SpringMVC框架是Spring的一个内部模块,所以springmvc.xml文件肯定需要同spring的配置文件兼容,即保持相同的头信息。如下所示:
配置完成适配器,适配器的作用就是来执行相应的Handler处理器,那么怎么编写代码才算是一个Handler处理器,通过SimpleControllerHandlerAdapter的原码查看,此类中包含如下一个方法supports,如下所示:
通过此方法可以得知,只有实现了Controller接口的类,才能够被Handler适配器当成是Handler处理器来进行调用。所以进入下一步,编写Handler。
第三步:编写Handler
第四步:配置处理器映射器
在springmvc.xml文件中配置处理器映射器,如下所示:
上图中的queryItemList.action就是应用中访问的url路径。
第五步:配置视图解析器
在springmvc.xml文件中配置是解析器,如下所示:
prefix属性:执行访问路径中固定的前缀路径。
suffix属性:执行访问路径中固定的后缀路径。
使用此种方式:第三步中的代码可修改如下:
XXX.setViewName(“item_list”);
处理器映射器:
通过上面的入门程序中,对于处理器映射器BeanNameUrlHandlerMapping就是一个非注解的处理器映射器,只不过这个映射器稍微有点缺陷。缺陷就是不能对bean的url映射进行集中管理。
SpringMVC还提供了另外一个非注解的处理器映射器SimpleUrlHandlerMapping,这个映射器可以实现对bean
的url的集中管理,首先配置一个handler Bean通过bean ID与property元素中的prop子元素关联,key属性配置的是访问的业务的url,prop元素内容为bean ID,表示当访问到/queryItem1.action业务时,SpringMVC通过映射器查询到itemListhandler,然后将它交由Handler适配器去执行。如下所示:
注意:对于SpringMVC来说,可以让多个处理器映射器共存,由前端控制器判断用户请求的url能让哪些映射器来处理,就让哪个正确的的映射器处理。
适配器:
在上面的入门程序中,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter就是一个非注解的适配器。此适配器要求所有的Handler处理器必须实现Controller接口。使用方式参考入门程序。
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter是SpringMVC提供的另外一种非注解的处理器适配器,配置如下图所示:
查看该类的原码如下:
此适配器要求Handler处理器必须实现HttpRequestHandler接口,测试类如下所示:
通过上面测试类的编写,大家会发现这种编程非常类似JSP、Servlet中Servlet的代码编写。大家可能会认为这种方式不如上面实现Controller接口的handler更加直观。但是这种方式却比较灵活,因为实现Controller接口的handler返回值就是一个ModelAndView对象,如果需要服务器端响应后,返回json格式的数据,返回image对象数据,它就不能实现。而使用第二种方式,可以通过修改response对象,设置响应格式,所以在开发时可根据需要实现不同类型的handler。
总结:在SpringMVC中多个处理器映射器、适配器是可以共存的。通过用户访问的url路径映射到一个具体的handler对象后,SpringMVC来确定此handler的类型来决定此Handler应该交由哪种适配器去调用执行。
注意:如果在springmvc.xml文件即使不配置处理器映射器、处理器适配器,程序仍然可以正常执行,原因如下:在前端控制器DispatcherServlet所在的包org.springframework.web.servlet下包含一个DispatcherServlet.properites属性文件,在该文件中配置了大量的处理器映射器、处理器适配器、视图解析器等组件,如果在springmvc.xml配置文件中没有配置映射器、适配器,那么SpringMVC就使用该属性文件中默认配置的组件。
如下图所示:(截取属性文件部分内容 )
在上面的配置文件中同样存在使用注解的配置,AnnotationMethodHandlerAdapter、DefaultAnnotationhadnerMapping,只不过这种注解是比较原始的使用方式,在SpringMVC3.1之前使用,在SpringMVC3.1之后使用另一种注解处理器、适配器。
5.5.1 配置注解的映射器、适配器
在3.1之后的注解的处理器映射器、适配器添加了很多的优化以及参数设置,所以在开发时,推荐使用3.1之后的版本。
在SpringMVC中提供了一个mvc:annotation-driven元素,用于简化映射器、适配器在springmvc.xml文件中的配置。不仅可以替代上面两行的配置,而且mvc:annotation-driven的驱动类还默认加载了多个参数绑定的方法,比如json转换解析器就默认加载。所以开发时推荐使用该方式。如下所示:
5.5.2 开发注解的处理器Handler
加载该Handler可以使用Spring的批量加载扫描的方式,如下所示:
小结:
处理器映射器:
非注解的处理器映射器(了解)
注解的处理器映射器(掌握)
对标记@Controller注解的类,Spring容器自动加载该Bean并管理,对于该Bean中的使用@RequestMapping注解进行修饰的方法进行映射。在@RequestMapping里边定义映射的url路径。使用注解的映射器不需要在xml中配置url和Handler之间的映射关系。
处理器适配器:
非注解的处理器适配(了解)
注解的处理器适配器(掌握)
注解的适配器与注解的映射器是配对使用,也就是说注解的适配器不能使用非注解映射进行映射。
通过SpringMVC入门程序的学习,以及对非注解、注解处理器映射器、处理器适配器的了解,大体知道了SpringMVC的基本的开发流程,下面就以商品查询功能模块为示例,来学习Spring框架、SpringMVC框架、MyBatis框架的整合开发。
1、引入JAR包
首先将应用所需要的JAR包引入到项目中,包括log4j、mysql、dbcp、commons-io、spring、mybatis等Jar文件。
2、配置资源文件
配置相关的资源文件,比如log4j、数据库链接配置等,如下图所示:
3、mybatis的sqlMapConfig.xml
编写mybatis框架的配置文件sqlMapConfig.xml,在使用Spring框架进行整合开发时会加入不同框架的配置文件,为了能够方便管理,所以在开发时需要遵循一定的规范,即不同框架的配置文件,放在同的文件夹下单独管理。例如,mybatis的配置文件存储路径为:config/mybatis/sqlMapConfig.xml,如下图所示:
4、Spring与MyBatis整合
将Spring与mybatis进行整合,配置文件为applicationContext-dao.xml,如下图所示:
5、配置应用的Service层
使用Spring框架的配置文件,applicationContext-service.xml文件来配置管理应用的所有Service层。
6、配置事务管理
事务管理器:对mybatis数据库操作进行事务控制,spring使用jdbc的事务控制类实行事务管理,如下所示:
7、配置SpringMVC控制层
SpringMVC的配置文件,主要配置视图解析器,处理器映射器、处理器适配器,在配置文件中使用mvc:annotation-dirven驱动来加载映射器与适配器。如下图所示:
8、配置Spring容器(重要)
以上所有配置文件配置完成后,在web.xml文件中通过配置SpringMVC的前端控制器,则可以完成将springmvc.xml配置文件加载到应用的容器中去,如下所示:
此操作仅仅是完成了SpringMVC模块的加载,但是Spring容器还没有加载到Web应用中来,所以下一步需要将Spring容器加载到Web应用的容器中,通过Spring框架提供的org.springframework.web.context.
ContextLoaderListener监听器来完成,此监听器在启动时会自动加载web.xml配置文件中的context-param元素中指定contextConfigLocation的value值,如下所示:
到此SpringMVC+Spring+Mybatis的整合全部结束!
5.7 商品查询调试
整合工作完成后,下面来开发商品管理功能模块来进行测试。
在上面的示例中仅仅是完成最简单的操作,如果需要完成稍微复杂一点的开发,比如限制请求方式、往后台传入参数等,这就需要利用SpringMVC框架提供的注解@RequestMapping,以及处理器Controller层中方法的返回值以及传入参数来完成。本节示例—商品信息修改将利用这几点技术来完成,首先来看一下个技术点的内容。
请求方法限定:
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported
例如:
@RequestMapping(value="/editItem",method=RequestMethod.GET)
限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported
GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
3、实现请求转发
请求转发与Servlet中的请求转发一致,服务器的多次处理在一个请求范围内,所以数据模型model可以实现共享。如下所示:
在上例中加入商品修改完成后,转入详细页面,则代码如下:
在上面方法updateItem中返回的字符串为:forward:query_item_detail.action路径,也可以直接写成要访问的JSP页面,但是这样要考虑路径的问题,所以简单来做可以返回一个映射后的url,如query_item_detail.action。
注意:重定向和请求转发,在进行处理时,后面要跟的url是一个handler的url而不能是一个逻辑视图:即不能是一个普通的jsp的路径!
返回void
所谓的返回void实际上是利用了Controller方法的形参,request和response进行开发,变为原始的servlet开发方式了。
1、使用request进行请求转发
request.getRequestDispatcher(“url”).forwart(request,response);
2、使用response进行重定向
response.sendRedirect(“url”);
3、也可以通过response指定响应结果,例如响应json数据
response.setContentType(“application/json”);
response.getWriter().write(“json串”);
在上一节的内容中,我们看到Controller方法默认支持的形参中包括了request对象,可以通过request对象来获取客户端请求的key/value对的数据,把key/value对绑定到request对象中的这步操作是由SpringMVC框架中的参数绑定组件来帮我们完成的,这步操作就称为参数绑定。
配置一个Spring的Filter过滤器即可,如下所示:
本节讲解SpringMVC框架的高级使用部分
B/S结构的系统对http请求的数据的校验多数在客户端进行,这也是出于简单以及用户体验上考虑,但是在一些安全性要求高的系统,服务端的校验也是不可缺少的。另外目前大部分系统除了客户端是浏览器之外,还有手机客户端、WebService接口调用等。
SpringMVC提供了一种Bean Validation的校验机制,采用了Hibernate Vaildator的校验,但是与Hibernate持久层框架没有任何关系。
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个统一的异常处理逻辑。
如果在开发时需要实现文件上传,则form表单的enctype属性需要指定为multipart/form-data类型,如果使用SpringMVC框架,那么就需要SpringMVC框架来实现对该种数据类型的解析。
在目前B/S架构的WEB应用开发中,JSON格式的数据类型交互是一种比较常见的应用技术。这是因为JSON格式的数据在接口调用中,html页面中都比较常见。而且JSON格式比较简单,解析还比较方便,所以使用广泛。比如:webService接口、ajax传输json数据等。
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。Representational State Transfer的含义就是“表现层的状态转化”。
使用RESTful这种架构理念就需要对http请求进行一系列的规范:
1、对url规范,写成RESTful的格式的url
非REST的url:http://…/queryitem.action?id=001&itemType=01
REST风格的url:http://…/queryitem/001/01
特点:url简洁,将参数通过url传到服务端
2、http的方法规范
不管是删除、添加、更新、使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加
后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。
3、对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。
6.5.1 REST的示例
1、controller层代码如下:
2、REST方式的前端控制器配置
3、静态资源的解析
当请求的地址是js或img下的资源时,全部映射到应用中的js或img下的所有资源。
SpringMVC的拦截器类似于JSP/Servlet中的Filter过滤器,用于对处理器进行预处理和后处理。
2、针对所有mapping映射的拦截配置(推荐)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。