ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:26.37KB ,
资源ID:12148243      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12148243.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring 25新特性第二部分Spring MVC中的新特性.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Spring 25新特性第二部分Spring MVC中的新特性.docx

1、Spring 25新特性第二部分Spring MVC中的新特性Spring 2.5新特性-第二部分-Spring MVC中的新特性Spring 框架从创建伊始就致力于为复杂问题提供强大的、非侵入性的解决方案。Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop、context、jee、jms、 lang、tx和util命名空间)、Spring Portfolio项目(例如Spring Security)和非Spring项目中(例如CXF)。 Spring 2.5推出了一整套注解,作为基于XML的配置的替换方案。注解可用于Sprin

2、g管理对象的自动发现、依赖注入、生命周期方法、Web层配置和单元/集成测试。 探索Spring 2.5中引入的注解技术系列文章由三部分组成,本文是其中的第二篇,它主要讲述了Web层中的注解支持。最后一篇文章将着重介绍可用于集成和测试的其它特性。 这个系列文章的第一部分论述了Java注解(annotation)是如何代替XML来配置Spring管理对象和依赖注入的。我们再用一个例子回顾一下: Java代码 1. Controller2. publicclassClinicController 3. 4. privatefinalClinicclinic; 5. 6. Autowired7. pu

3、blicClinicController(Clinicclinic) 8. this.clinic=clinic; 9. 10. .Controller public class ClinicController private final Clinic clinic; Autowired public ClinicController(Clinic clinic) this.clinic = clinic; .Controller表明ClinicController是Web层组件,Autowired请求一个被依赖注入的Clinic实例。这个例子只需要少量的XML语句就能使容器识别两个注解,并

4、限定组件的扫描范围: Java代码 1. 这对Web层可谓是个福音,因为在这层Spring的XML配置文件已日益臃肿,甚至可能还不如层下的配置来得有用。控制器掌握着许多属性,例如视图名称、表单对象名称和验证器类型,这些多是关乎配置的,甚少关于依赖注入的。通过bean定义继承,或者避免配置变化不是很频繁的属性,也可以有效的管理类似的配置。不过以我的经验,很多开发人员都不会这样做,结果就是XML文件总比实际需要的要庞大。不过 Controller和Autowired对Web层的配置会产生积极的作用。 在系列文章的第二部分我们将继续讨论这个问题,并浏览Spring 2.5在Web层的注解技术。这些注

5、解被非正式的称为MVC,它涉及到了Spring MVC和Spring Porlet MVC,实际上本文讨论的大部分功能都可以应用在这两个框架上。 从Controller到Controller 与第一部分讨论的注解相比,MVC已不只是作为配置的一种替换方案这样简单了,考虑下面这个著名的Spring MVC控制器签名: Java代码 1. publicinterfaceController 2. ModelAndViewhandleRequest(HttpServletRequestrequest,HttpServletResponse 3. response)throwsException; 4

6、. public interface Controller ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; 所有的Spring MVC控制器要么直接实现Controller接口,要么就得扩展类似AbstractController、 SimpleFormController、 MultiActionController或AbstractWizardFormController这样的基类实现。正是Controller接口允许Spring M

7、VC的DispatcherServlet把所有上述对象都看作是“处理器(handlers)”,并在一个名为 SimpleControllerHandlerAdapter的适配器的帮助下调用它们。 MVC从三个重要的方面改变了这个程序设计模型: 1. 不需要任何接口或者基类。 2. 允许有任意数量的请求处理方法。 3. 在方法签名上具有高度的灵活性。 考虑到以上三个要点,就可以说很公平的说MVC不仅仅是个替换方案了,它将会是Spring MVC的控制器技术演变过程中下一个重要步骤。 DispatcherServlet在名为AnnotationMethodHandlerAdapter的适配器帮助下

8、调用被注解的控制器。正是这个适配器做了大量工作支持我们此后将会讨论的注解,同时也是它有效的取代了对于控制器基类的需求。 RequestMapping简介 我们还是从一个类似于传统的Spring MVC Controller控制器开始: Java代码 1. Controller2. publicclassAccountsController 3. 4. privateAccountRepositoryaccountRepository; 5. 6. Autowired7. publicAccountsController(AccountRepositoryaccountRepository) 8

9、. this.accountRepository=accountRepository; 9. 10. 11. RequestMapping(/accounts/show) 12. publicModelAndViewshow(HttpServletRequestrequest, 13. HttpServletResponseresponse)throwsException 14. Stringnumber=ServletRequestUtils.getStringParameter(request,number); 15. ModelAndViewmav=newModelAndView(/WE

10、B-INF/views/accounts/show.jsp); 16. mav.addObject(account,accountRepository.findAccount(number); 17. returnmav; 18. Controller public class AccountsController private AccountRepository accountRepository; Autowired public AccountsController(AccountRepository accountRepository) this.accountRepository

11、= accountRepository; RequestMapping(/accounts/show) public ModelAndView show(HttpServletRequest request, HttpServletResponse response) throws Exception String number = ServletRequestUtils.getStringParameter(request, number); ModelAndView mav = new ModelAndView(/WEB-INF/views/accounts/show.jsp); mav.

12、addObject(account, accountRepository.findAccount(number); return mav; 此处与以往的不同在于,这个控制器并没有扩展Controller接口,并且它用RequestMapping注解指明show()是映射到 URI路径 “/accounts/show”的请求处理方法。除此以外,其余代码都是一个典型的Spring MVC控制器应有的内容。 在将上述的方法完全转化到MVC后,我们会再回过头来看RequestMapping,但是在此之前还有一点需要提请注意,上面的请求映射URI也可匹配带有任意扩展名的URI路径,例如: Java代码

13、1. /accounts/show.htm 2. /accounts/show.xls 3. /accounts/show.pdf 4. ./accounts/show.htm /accounts/show.xls /accounts/show.pdf .灵活的请求处理方法签名 我们曾经承诺过要提供灵活的方法签名,现在来看一下成果。输入的参数中移除了响应对象,增加了一个代表模型的Map;返回的不再是ModelAndView,而是一个字符串,指明呈现响应时要用的视图名字: Java代码 1. RequestMapping(/accounts/show) 2. publicStringshow(H

14、ttpServletRequestrequest,Mapmodel) 3. throwsException 4. Stringnumber=ServletRequestUtils.getStringParameter(request,number); 5. model.put(account,accountRepository.findAccount(number); 6. return/WEB-INF/views/accounts/show.jsp; 7. RequestMapping(/accounts/show) public String show(HttpServletRequest

15、 request, Map model) throws Exception String number = ServletRequestUtils.getStringParameter(request, number); model.put(account, accountRepository.findAccount(number); return /WEB-INF/views/accounts/show.jsp; Map输入参数是一个“隐式的”模型,对于我们来说在调用方法前创建它很方便,其中添加的键值对数据便于在视图中解析应用。本例视图为show.jsp页面。 MVC可以接受多种类型的输入参

16、数,例如 HttpServletRequest/HttpServletResponse、HttpSession、Locale、InputStream、 OutputStream、File等等,它们的顺序不受任何限制;同样它也允许多种返回类型,例如ModelAndView、Map、 String,或者什么都不返回。你可以查看RequestMapping的JavaDoc以了解它支持的所有输入和返回参数类型。 有种令人感兴趣的情形是当方法没有指定视图时(例如返回类型为void)会有什么事情发生,按照惯例DispatcherServlet要再使用请求URI的路径信息,不过要移去前面的斜杠和扩展名。让我

17、们把返回类型改为void: Java代码 1. RequestMapping(/accounts/show) 2. publicvoidshow(HttpServletRequestrequest,Mapmodel)throwsException 3. Stringnumber=ServletRequestUtils.getStringParameter(request,number); 4. model.put(account,accountRepository.findAccount(number); 5. RequestMapping(/accounts/show) public voi

18、d show(HttpServletRequest request, Map model) throws Exception String number = ServletRequestUtils.getStringParameter(request, number); model.put(account, accountRepository.findAccount(number); 对于给定的请求处理方法和“/accounts/show”的请求映射,我们可以期望DispatcherServlet能够获得“accounts/show”的默认视图名称,当它与如下适当的视图解析器结合共同作用时,会

19、产生与前面指明返回视图名同样的结果: Java代码 1. 2. 3. 4. 强烈推荐视图名称依赖惯例的方式,因为这样可以从控制器代码中消除硬编码的视图名称。如果你想定制 DispatcherServlet获取默认视图名的方式,就在servlet上下文环境中配置一个你自己的 RequestToViewNameTranslator实现,并为其bean id赋名为“viewNameTranslator”。 用RequestParam提取和解析参数 MVC另外一个特性是其提取和解析请求参数的能力。让我们继续重构上面的方法,并在其中添加RequestParam注解: Java代码 1. RequestM

20、apping(/accounts/show) 2. publicvoidshow(RequestParam(number)Stringnumber,Mapmodel) 3. model.put(account,accountRepository.findAccount(number); 4. RequestMapping(/accounts/show) public void show(RequestParam(number) String number, Map model) model.put(account, accountRepository.findAccount(number);

21、这里RequestParam注解可以用来提取名为“number”的String类型的参数,并将之作为输入参数传入。 RequestParam支持类型转换,还有必需和可选参数。类型转换目前支持所有的基本Java类型,你可通过定制的PropertyEditors 来扩展它的范围。下面是一些例子,其中包括了必需和可选参数: Java代码 1. RequestParam(value=number,required=false)Stringnumber 2. RequestParam(id)Longid 3. RequestParam(balance)doublebalance 4. RequestPa

22、ramdoubleamountRequestParam(value=number, required=false) String number RequestParam(id) Long id RequestParam(balance) double balance RequestParam double amount注意,最后一个例子没有提供清晰的参数名。当且仅当代码带调试符号编译时,结果会提取名为“amount ”的参数,否则,将抛出IllegalStateException异常,因为当前的信息不足以从请求中提取参数。由于这个原因,在编码时最好显式的指定参数名。 继续RequestMapp

23、ing的讨论 把RequestMapping放在类级别上是合法的,这可令它与方法级别上的RequestMapping注解协同工作,取得缩小选择范围的效果,下面是一些例子。 类级别: Java代码 1. RequestMapping(/accounts/*) 2. 3. 方法级别: 4. RequestMapping(value=delete,method=RequestMethod.POST) 5. RequestMapping(value=index,method=RequestMethod.GET,params=type=checking) 6. RequestMappingRequest

24、Mapping(/accounts/*)方法级别:RequestMapping(value=delete, method=RequestMethod.POST)RequestMapping(value=index, method=RequestMethod.GET, params=type=checking)RequestMapping第一个方法级的请求映射和类级别的映射结合,当HTTP方法是POST时与路径“/accounts/delete”匹配;第二个添加了一个要求,就是名为“type”的请求参数和其值“checking”都需要在请求中出现;第三个根本就没有指定路径,这个方法匹配所有的 H

25、TTP方法,如果有必要的话可以用它的方法名。下面改写我们的方法,使它可以依靠方法名进行匹配,程序如下: Java代码 1. Controller2. RequestMapping(/accounts/*) 3. publicclassAccountsController 4. 5. RequestMapping(method=RequestMethod.GET) 6. publicvoidshow(RequestParam(number)Stringnumber,Mapmodel) 7. 8. model.put(account,accountRepository.findAccount(nu

26、mber); 9. 10. .Controller RequestMapping(/accounts/*) public class AccountsController RequestMapping(method=RequestMethod.GET) public void show(RequestParam(number) String number, Map model) model.put(account, accountRepository.findAccount(number); .方法匹配的请求是“/accounts/show”,依据的是类级别的RequestMapping指定的匹配路径“/accounts/*”和方法名“show”。 消除类级别的请求映射 Web层注解频遭诟病是有事实依据的,那就是嵌入源代码的URI路径。这个问题很好矫正,URI路径和控制器类之间的匹配关系用XML配置文件去管理,只在方法级的映射中使用RequestMapping注解。 我们将配置一个ControllerClassNameHandlerMapping,它使用依赖控制器类名字的惯例,将URI映射到控制器: Java代码 1. bean class=org.springframework.web.servlet.mv

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1