|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C#是不行的,比如说美国的航天飞船里就有java开发的程序以上是我的愚见,其实不管那种语言,你学好了,都能找到好的工作,前文回忆:《Spring2.5的新特征:第一部分》
Spring框架从创立伊始就努力于为庞大成绩供应壮大的、非侵进性的办理计划。Spring2.0傍边为缩减XML设置文件数目引进定制定名空间功效,今后它便深深植根于中心Spring框架(aop、context、jee、jms、lang、tx和util定名空间)、SpringPortfolio项目(比方SpringSecurity)和非Spring项目中(比方CXF)。
Spring2.5推出了一整套注解,作为基于XML的设置的交换计划。注解可用于Spring办理对象的主动发明、依附注进、性命周期办法、Web层设置和单位/集成测试。
探究Spring2.5中引进的注解手艺系列文章由三部分构成,本文是个中的第二篇,它次要报告了Web层中的注解撑持。最初一篇文章将侧重先容可用于集成和测试的别的特征。
这个系列文章的第一部分叙述了Java注解(annotation)是怎样取代XML来设置Spring办理对象和依附注进的。我们再用一个例子回忆一下:- @ControllerpublicclassClinicController{privatefinalClinicclinic;@AutowiredpublicClinicController(Clinicclinic){this.clinic=clinic;}...
复制代码 @Controller标明ClinicController是Web层组件,@Autowired哀求一个被依附注进的Clinic实例。这个例子只必要大批的XML语句就可以使容器辨认两个注解,并限制组件的扫描局限:
- <context:component-scanbase-package="org.springframework.samples.petclinic"/>
复制代码- [/code]这对Web层可谓是个福音,由于在这层Spring的XML设置文件已日趋痴肥,乃至大概还不如层下的设置来得有效。把持器把握着很多属性,比方视图称号、表单对象称号和考证器范例,这些多是关乎设置的,甚少关于依附注进的。经由过程bean界说承继,大概制止设置变更不是很频仍的属性,也能够无效的办理相似的设置。不外以我的履历,良多开辟职员都不会如许做,了局就是XML文件总比实践必要的要复杂。不外@Controller和@Autowired对Web层的设置会发生主动的感化。
- 在系列文章的第二部分我们将持续会商这个成绩,并扫瞄Spring2.5在Web层的注解手艺。这些注解被非正式的称为@MVC,它触及到了SpringMVC和SpringPorletMVC,实践上本文会商的年夜部分功效都能够使用在这两个框架上。
- [size=5]从Controller到@Controller[/size]
- 与第一部分会商的注解比拟,@MVC已不但是作为设置的一种交换计划如许复杂了,思索上面这个出名的SpringMVC把持器署名:
- [code]publicinterfaceController{ModelAndViewhandleRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsException;}
复制代码 一切的SpringMVC把持器要末间接完成Controller接口,要末就得扩大相似AbstractController、SimpleFormController、MultiActionController或AbstractWizardFormController如许的基类完成。恰是Controller接口同意SpringMVC的DispatcherServlet把一切上述对象都看做是“处置器(handlers)”,并在一个名为SimpleControllerHandlerAdapter的适配器的匡助下挪用它们。
@MVC从三个主要的方面改动了这个程序计划模子:
- 不必要任何接口大概基类。
- 同意有恣意数目的哀求处置办法。
- 在办法署名上具有高度的天真性。
思索到以上三个要点,就能够说很公允的说@MVC不单单是个交换计划了,它将会是SpringMVC的把持器手艺演化过程当中下一个主要步骤。
DispatcherServlet在名为AnnotationMethodHandlerAdapter的适配器匡助下挪用被注解的把持器。恰是这个适配器做了大批事情撑持我们今后将会会商的注解,同时也是它无效的代替了关于把持器基类的需求。
@RequestMapping简介
我们仍是从一个相似于传统的SpringMVCController把持器入手下手:- @ControllerpublicclassAccountsController{privateAccountRepositoryaccountRepository;@AutowiredpublicAccountsController(AccountRepositoryaccountRepository){this.accountRepository=accountRepository;}@RequestMapping("/accounts/show")publicModelAndViewshow(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{Stringnumber=ServletRequestUtils.getStringParameter(request,"number");ModelAndViewmav=newModelAndView("/WEB-INF/views/accounts/show.jsp");mav.addObject("account",accountRepository.findAccount(number));returnmav;}}
复制代码 此处与以往的分歧在于,这个把持器并没有扩大Controller接口,而且它用@RequestMapping注解指明show()是映照到URI路径“/accounts/show”的哀求处置办法。除此之外,其他代码都是一个典范的SpringMVC把持器应有的内容。
在将上述的办法完整转化到@MVC后,我们会再回过火来看@RequestMapping,可是在此之前另有一点必要提请注重,下面的哀求映照URI也可婚配带有恣意扩大名的URI路径,比方:- /accounts/show.htm/accounts/show.xls/accounts/show.pdf...
复制代码 天真的哀求处置办法署名
我们已经答应过要供应天真的办法署名,如今来看一下功效。输出的参数中移除呼应对象,增添了一个代表模子的Map;前往的不再是ModelAndView,而是一个字符串,指明出现呼应时要用的视图名字:- @RequestMapping("/accounts/show")publicStringshow(HttpServletRequestrequest,Map<String,Object>model)throwsException{Stringnumber=ServletRequestUtils.getStringParameter(request,"number");model.put("account",accountRepository.findAccount(number));return"/WEB-INF/views/accounts/show.jsp";}
复制代码 Map输出参数是一个“隐式的”模子,关于我们来讲在挪用办法前创立它很便利,个中增加的键—值对数据便于在视图中剖析使用。本例视图为show.jsp页面。
@MVC能够承受多品种型的输出参数,比方HttpServletRequest/HttpServletResponse、HttpSession、Locale、InputStream、OutputStream、File[]等等,它们的按次不受任何限定;一样它也同意多种前往范例,比方ModelAndView、Map、String,大概甚么都不前往。你能够检察@RequestMapping的JavaDoc以懂得它撑持的一切输出和前往参数范例。
有种使人感乐趣的情况是当办法没有指定视图时(比方前往范例为void)会有甚么事变产生,依照常规DispatcherServlet要再利用哀求URI的路径信息,不外要移往后面的斜杠和扩大名。让我们把前往范例改成void:- @RequestMapping("/accounts/show")publicvoidshow(HttpServletRequestrequest,Map<String,Object>model)throwsException{Stringnumber=ServletRequestUtils.getStringParameter(request,"number");model.put("account",accountRepository.findAccount(number));}
复制代码 关于给定的哀求处置办法和“/accounts/show”的哀求映照,我们能够希冀DispatcherServlet可以取得“accounts/show”的默许视图称号,当它与以下得当的视图剖析器分离配合感化时,会发生与后面指明前往视图名一样的了局:- <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/views/"/><propertyname="suffix"value=".jsp"/></bean>
复制代码 激烈保举视图称号依附常规的体例,由于如许能够从把持器代码中打消硬编码的视图称号。假如你想定制DispatcherServlet猎取默许视图名的体例,就在servlet高低文情况中设置一个你本人的RequestToViewNameTranslator完成,并为其beanid赋名为“viewNameTranslator”。
用@RequestParam提取息争析参数
@MVC别的一个特征是其提取息争析哀求参数的才能。让我们持续重构下面的办法,并在个中增加@RequestParam注解:- @RequestMapping("/accounts/show")publicvoidshow(@RequestParam("number")Stringnumber,Map<String,Object>model){model.put("account",accountRepository.findAccount(number));}
复制代码 这里@RequestParam注解能够用来提取名为“number”的String范例的参数,并将之作为输出参数传进。@RequestParam撑持范例转换,另有必须和可选参数。范例转换今朝撑持一切的基础Java范例,你可经由过程定制的PropertyEditors来扩大它的局限。上面是一些例子,个中包含了必须和可选参数:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>0
复制代码 注重,最初一个例子没有供应明晰的参数名。当且仅今世码带调试标记编译时,了局会提取名为“amount”的参数,不然,将抛出IllegalStateException非常,由于以后的信息不敷以从哀求中提取参数。因为这个缘故原由,在编码时最好显式的指定参数名。
持续@RequestMapping的会商
把@RequestMapping放在类级别上是正当的,这可令它与办法级别上的@RequestMapping注解协同事情,获得减少选择局限的效果,上面是一些例子。
类级别:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>1
复制代码 办法级别:
@RequestMapping(value="delete",method=RequestMethod.POST)
@RequestMapping(value="index",method=RequestMethod.GET,params="type=checking")
@RequestMapping
第一个办法级的哀求映照和类级其余映照分离,当HTTP办法是POST时与路径“/accounts/delete”婚配;第二个增加了一个请求,就是名为“type”的哀求参数和其值“checking”都必要在哀求中呈现;第三个基本就没有指定路径,这个办法婚配一切的HTTP办法,假如有需要的话能够用它的办法名。上面改写我们的办法,使它能够依托办法名举行婚配,程序以下:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>2
复制代码 办法婚配的哀求是“/accounts/show”,根据的是类级其余@RequestMapping指定的婚配路径“/accounts/*”和办法名“show”。
打消类级其余哀求映照
Web层注解频遭诟病是有现实根据的,那就是嵌进源代码的URI路径。这个成绩很好改正,URI路径和把持器类之间的婚配干系用XML设置文件往办理,只在办法级的映照中利用@RequestMapping注解。
我们将设置一个ControllerClassNameHandlerMapping,它利用依附把持器类名字的常规,将URI映照到把持器:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>3
复制代码- <context:component-scanbase-package="org.springframework.samples.petclinic"/>4
复制代码 如今“/accounts/*”如许的哀求都被婚配到AccountsController上,它与办法级别上的@RequestMapping注解合作的很好,只需增加上办法名就可以够完成上述映照。别的,既然我们的办法其实不会前往视图称号,我们如今就能够根据常规婚配类名、办法名、URI路径和视图名。
当@Controller被完整转换为@MVC后,程序的写法以下:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>5
复制代码 对应的XML设置文件以下:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>6
复制代码 你能够看出这是一个最精减的XML。程序里注解中没有嵌进URI路径,也没有显式指定视图名,哀求处置办法也只要很复杂的一行,办法署名与我们的需求精准婚配,别的的哀求处置办法也很简单增加。不必要基类,也不必要XML(最少也是没有间接设置把持器),我们就可以取得上述一切上风。
大概接上去你就能够看到,这类程序计划模子是何等无效了。
@MVC表单处置
一个典范的表单处置场景包含:取得可编纂对象,在编纂形式下显现它持有的数据、同意用户提交并终极举行考证和保留变更数据。SpringMVC供应以下几个特征帮助举行上述一切举动:数据绑定机制,完整用从哀求参数中取得的数据添补一个对象;撑持毛病处置和考证;JSP表单标志库;基类把持器。利用@MVC,除因为@ModelAttribute、@InitBinder和@SessionAttributes这些注解的存在而不再必要基类把持器外,别的统统都不必要改动。
@ModelAttribute注解
看一下这些哀求处置办法署名:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>7
复制代码 它们长短常无效的哀求处置办法署名。第一个办法处置初始的HTTPGET哀求,筹办被编纂的数据,前往一个Account对象供SpringMVC表单标签利用。第二个办法在用户提交变动时处置随后的HTTPPOST哀求,并吸收一个Account对象作为输出参数,它是SpringMVC的数据绑定机制用哀求中的参数主动添补的。这是一个十分复杂的程序模子。
Account对象中含有要被编纂的数据。在SpringMVC的术语傍边,Account被称作是表单模子对象。这个对象必需经由过程某个称号让表单标签(另有数据绑定机制)晓得它的存在。上面是从JSP页面中截取的部分代码,援用了一个名为“account”的表单模子对象:
<form:formmodelAttribute="account"method="post">
- <context:component-scanbase-package="org.springframework.samples.petclinic"/>8
复制代码 即便我们没有在任何中央指定“account”的称号,这段JSP程序也会和下面所讲的办法署名合作的很好。这是由于@MVC用前往对象的范例称号作为默许值,因而一个Account范例的对象默许的就对应一个名为“account”的表单模子对象。假如默许的分歧适,我们就能够用@ModelAttribute来改动它的称号,以下所示:- <context:component-scanbase-package="org.springframework.samples.petclinic"/>9
复制代码 @ModelAttribute一样也可放在办法级的地位上,获得的效果稍有分歧:此处setupModelAttribute()不是一个哀求处置办法,而是任何哀求处置办法被挪用之前,用来筹办表单项模子对象的一个办法。对那些熟习SpringMVC的老用户来讲,这和SimpleFormController的formBackingObject()办法长短常类似的。
最后的GET办法中我们失掉一次表单模子对象,在随后的POST办法中当我们依托数据绑定机制用用户所做的改动掩盖已有的Account对象时,我们会第二次失掉它,在这类表单处置场景中把@ModelAttribute放在办法上是很有效的。固然,作为一种两次取得对象的交换计划,我们也能够在两次哀求过程当中将它保留进HTTP的会话(session),这就是我们上面将要剖析的情形。
用@SessionAttributes存储属性
@SessionAttributes注解能够用来指定哀求过程当中要放进session中的表单模子对象的称号或范例,上面是一些例子:依据下面的注解,AccountFormController会在初始的GET办法和随后的POST办法之间,把名为“account”的表单模子对象(大概象第二个例子中的那样,把一切Account范例的表单模子对象)存进HTTP会话(session)中。不外,当有改动一连产生的时分,就应该把属性对象从会话中移除。我们能够借助SessionStatus实例来做这件事,假如把它增加进onSubmit的办法署名中,@MVC会完成这个义务:定制数据绑定
偶然数据绑定必要定制,比方我们大概必要指定必须填写的域,大概必要为日期、泉币金额等相似事变注册定制的PropertyEditors。用@MVC完成这些功效长短常简单的:@InitBinder注解的办法能够会见@MVC用来绑定哀求参数的DataBinder实例,它同意我们为每一个把持器定制必需项。
数据绑定了局和考证
数据绑定大概会招致相似于范例转换或域缺掉的毛病。不论产生甚么毛病,我们都但愿能前往到编纂的表单,让用户自行改正。要想完成这个目标,我们可间接在办法署名的表单模子对象前面追加一个BindingResult对象,例程以下:产生毛病时我们前往到呈现成绩的视图,并把从BindingResult失掉的属性增添到模子上,如许特定域的毛病就可以够反应给用户。要注重的是,我们并没有指定一个显式的视图名,而是同意DispatcherServlet依托与出口URI路径信息婚配的默许视图名。
挪用Validator对象并把BindingResult传给它,仅这一行代码便可完成考证操纵。这同意我们在一个中央搜集绑定和考证毛病:如今是时分停止我们的Spring2.5Web层注解(非正式称法为@MVC)之旅了。
总结
Web层的注解已证实是相称有效的,不但是由于它可以年夜年夜削减XML设置文件的数目,并且还在于它能成绩一个可自在会见SpringMVC把持器手艺的精巧、天真和简便的程序计划模子。我们激烈保举利用“常规优先准绳(convention-over-configuration)”特征,和以处置器映照为中央的战略给把持器派发哀求,制止在源码中嵌进URI路径或是界说显式的视图名援用。
最初是本文没有会商,但值得存眷的一些十分主要的SpringMVC扩大。最新公布的SpringWebFlow版本2增加了一些特征,比方基于JSF视图的SpringMVC、Spring的JavaScript库,另有撑持更先辈编纂场景的初级形态和导航办理。
检察英文原文:Spring2.5:NewFeaturesinSpringMVC
来自:http://www.infoq.com/cn/articles/spring-2.5-ii-spring-mvc
延长浏览:
PratikPatel谈企业JPA、FetchGroups及Spring2.5
春季不冷——谈spring的依附注进
最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。 |
|