仓酷云 发表于 2015-1-18 11:33:48

JAVA网页编程之Spring 2.5:Spring MVC中的新特征仓酷云

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"/>这对Web层可谓是个福音,由于在这层Spring的XML设置文件已日趋痴肥,乃至大概还不如层下的设置来得有效。把持器把握着很多属性,比方视图称号、表单对象称号和考证器范例,这些多是关乎设置的,甚少关于依附注进的。经由过程bean界说承继,大概制止设置变更不是很频仍的属性,也能够无效的办理相似的设置。不外以我的履历,良多开辟职员都不会如许做,了局就是XML文件总比实践必要的要复杂。不外@Controller和@Autowired对Web层的设置会发生主动的感化。
在系列文章的第二部分我们将持续会商这个成绩,并扫瞄Spring2.5在Web层的注解手艺。这些注解被非正式的称为@MVC,它触及到了SpringMVC和SpringPorletMVC,实践上本文会商的年夜部分功效都能够使用在这两个框架上。
从Controller到@Controller

与第一部分会商的注解比拟,@MVC已不但是作为设置的一种交换计划如许复杂了,思索上面这个出名的SpringMVC把持器署名:
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一样也可放在办法级的地位上,获得的效果稍有分歧:
0此处setupModelAttribute()不是一个哀求处置办法,而是任何哀求处置办法被挪用之前,用来筹办表单项模子对象的一个办法。对那些熟习SpringMVC的老用户来讲,这和SimpleFormController的formBackingObject()办法长短常类似的。
最后的GET办法中我们失掉一次表单模子对象,在随后的POST办法中当我们依托数据绑定机制用用户所做的改动掩盖已有的Account对象时,我们会第二次失掉它,在这类表单处置场景中把@ModelAttribute放在办法上是很有效的。固然,作为一种两次取得对象的交换计划,我们也能够在两次哀求过程当中将它保留进HTTP的会话(session),这就是我们上面将要剖析的情形。
用@SessionAttributes存储属性

@SessionAttributes注解能够用来指定哀求过程当中要放进session中的表单模子对象的称号或范例,上面是一些例子:
1依据下面的注解,AccountFormController会在初始的GET办法和随后的POST办法之间,把名为“account”的表单模子对象(大概象第二个例子中的那样,把一切Account范例的表单模子对象)存进HTTP会话(session)中。不外,当有改动一连产生的时分,就应该把属性对象从会话中移除。我们能够借助SessionStatus实例来做这件事,假如把它增加进onSubmit的办法署名中,@MVC会完成这个义务:
2定制数据绑定

偶然数据绑定必要定制,比方我们大概必要指定必须填写的域,大概必要为日期、泉币金额等相似事变注册定制的PropertyEditors。用@MVC完成这些功效长短常简单的:
3@InitBinder注解的办法能够会见@MVC用来绑定哀求参数的DataBinder实例,它同意我们为每一个把持器定制必需项。
数据绑定了局和考证

数据绑定大概会招致相似于范例转换或域缺掉的毛病。不论产生甚么毛病,我们都但愿能前往到编纂的表单,让用户自行改正。要想完成这个目标,我们可间接在办法署名的表单模子对象前面追加一个BindingResult对象,例程以下:
4产生毛病时我们前往到呈现成绩的视图,并把从BindingResult失掉的属性增添到模子上,如许特定域的毛病就可以够反应给用户。要注重的是,我们并没有指定一个显式的视图名,而是同意DispatcherServlet依托与出口URI路径信息婚配的默许视图名。
挪用Validator对象并把BindingResult传给它,仅这一行代码便可完成考证操纵。这同意我们在一个中央搜集绑定和考证毛病:
5如今是时分停止我们的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,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。

兰色精灵 发表于 2015-1-21 10:09:13

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

海妖 发表于 2015-1-23 23:40:54

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

乐观 发表于 2015-1-25 14:13:40

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

飘飘悠悠 发表于 2015-2-2 22:20:29

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

灵魂腐蚀 发表于 2015-2-6 11:03:57

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

莫相离 发表于 2015-2-16 00:38:23

是一种为 Internet发展的计算机语言

飘灵儿 发表于 2015-3-5 14:48:59

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

小女巫 发表于 2015-3-8 11:51:54

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

只想知道 发表于 2015-3-10 12:36:57

是一种使网页(Web Page)产生生动活泼画面的语言

山那边是海 发表于 2015-3-17 06:47:01

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

愤怒的大鸟 发表于 2015-3-20 11:26:47

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

精灵巫婆 发表于 2015-4-3 12:52:24

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

仓酷云 发表于 2015-4-7 20:39:00

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

小魔女 发表于 2015-4-16 05:31:39

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

若天明 发表于 2015-4-16 09:12:45

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

若相依 发表于 2015-4-24 12:45:11

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

再现理想 发表于 2015-5-9 08:11:06

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

透明 发表于 2015-6-12 03:53:55

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

小妖女 发表于 2015-6-28 06:09:26

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
页: [1]
查看完整版本: JAVA网页编程之Spring 2.5:Spring MVC中的新特征仓酷云