仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 434|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA教程之分享关于Servlet2.5 的新特性

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:13:16 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。servlet  2005年9月26日,Sun公司和JSR154的专家组公布ServletAPI的一个新的版本。在一样平常情形下,一个JSR的新版本仅仅包含对之前多数名存实亡的标准举行往除更新。但此次,新版本中增添新的特性和变更,他们对Servlets的发生主要影响,使得Servlet的版本升到了2.5。

  在这篇文章里,我次要谈谈Servlet2.5版本中的新特性。形貌每个变更,论述那些需要变更发生的背景,并展现怎样在基于Servlet的项目中使用这些变更。 

  现实上,这是我为JavaWorld供应的第六篇关于ServletAPI更新材料的文章。这篇文章意在两个目标:从长远来看,向你先容Servlet的新特性。从久远来看,是展示Servlet变更的汗青提要,如许当你基于老的ServletAPI版本举行编码的时分,你能够准确地决意哪些特性和功效你可使用,而哪些特性和功效你不该该利用。你能够参考我先前写的关于Servlet的文章。

  注重:当你想理论这些Servlet的新特性和功效时,你要晓得的是:并非一切的Servlet容器和Java企业级使用服务器都能当即合用于最新版的ServletAPI,写这篇文章时(2006年1月2日),Jetty6server和Sun公司的GlassFishserver是公认最好的撑持Servlet2.5的容器,而ApacheTomcat5.5和Jboss4.0今朝只撑持Servlet2.4。
Servlet2.5一些变更的先容:

1)基于最新的J2SE5.0开辟的。
2)撑持正文。
3)web.xml中的几处设置加倍便利。
4)往除多数的限定。
5)优化了一些实例

J2SE5.0的产品:
  从一入手下手,Servlet2.5标准就列出J2SE5.0(JDK1.5)作为它最小的平台请求。它使得Servlet2.5只能合用基于J2SE5.0开辟的平台,这个变化意味着一切J2SE5.0的新特征能够包管对Servlet2.5程序员有效。
传统意义上,Servlet和JEE版本一向与JDK的版本坚持同步开展,可是此次,Servlet的版本跳过1.4版本。专家组以为版本的减速增加是合法的,由于J2SE5.0提出一个有目共睹的,Servlet和JEE标准都要使用的特性??正文。

正文:
  正文是作为JSR175的一部分提出的(一种为Java言语计划供应便当的Metadata)一种新的言语特征。它是使用Metadata为Java编码布局(类,办法,域等等)粉饰的一种机制。它不克不及像代码那样实行,可是能够用于标志代码,这个历程是基于Metadata信息的代码处置机,经由过程更新他们的事务举动来完成的。

  我们能够依附分歧的技能来正文类和办法,比方一连地标志接口大概是@deprecatedJavadoc批评。这类旧式的Metadata能够便当地供应了一种尺度的机制来完成正文功效,和经由过程库来创立用户本人的正文范例的变量。

上面是一个复杂的Webservice正文例子:
importjavax.jws.WebService;
importjavax.jws.WebMethod;
@WebService
publicclassHelloWorldService{
@WebMethod
publicStringhelloWorld(){
return"HelloWorld!";
}
}
@WebService和@WebMethod这两个正文范例,在JSR181(为Java平台供应的WebServicesMetadata)有具体申明,能够像类一样的援用,标志这个类作为一个Webservice而且标志它的helloWorld()办法做为一个Webservice办法。关于他们自己来讲,正文只是写在那边并没有甚么感化,仿佛在岗亭上做纪录一样,可是,一个容器一旦加载这个类并对那些正文举行二进制编码,就能够把这个类连到Webservice上。
正文能够承受属性/值这些参数。它保留着参数的信息而且能够使用这些参数来变动被哀求的事务举动。比方上面更初级的正文例子:
@WebService(
name="PingService",
targetNamespace=http://acme.com/ping
)
@SOAPBinding(
style=SOAPBinding.Style.RPC,
use=SOAPBinding.Use.LITERAL
)
publicclassPing{
@WebMethod(operationName="Foo")
publicvoidfoo(){}
}
  一旦加载了这个类,一个准确设置的容器就会辨认出正文及其参数,并将这个做为一个PingService经由过程使用remote-procedure-call/literal的编码体例与一个Foooperation相连。实践上,正文便指了然类和类的容器之间的接洽。

  Java自己的标准(JSR175)仅唯一大批的正文范例变量。而这些风趣的正文范例变量次要来自于其他的JSRs:
•JSR250:Java平台的大众正文
•JSR220:企业级JavaBeans3.0
•JSR224:基于XML的JavaAPIWebServices(JAX-WS)2.0
•JSR181:Java平台的WebServicesMetadata
Servlet2.5中的正文:
  回到Servlet2.5下去,一种新的标准形貌了几种正文在Servlet情况中是怎样事情的。功效弱的Servlet容器疏忽了这些标准,但是JEE容器中的Servlet却严厉恪守这些标准。

  有的正文供应了在XML注册的可选择性,不然就要注册在设置文件web.xml中。有的作为容器的哀求来实行其义务,不然就由Servlet亲身来实行。另有的正文二者都具有。

  正文正确的界说不是完整流动的,由于Servlet自己并没有界说正文。它仅仅注释了它们怎样影响Servlet情况,上面是正文的一个扼要的概述,你能够看到在JEE5中它们的用处:

•@Resourceand@Resources:@Resource位于类或变量中以对Servlet容器举行“资本注进”。当容器辨认出这个正文时,它会在取得服务位置之前,用得当的值完成带正文的变量的从头注进。经由过程利用这类正文,你不用使用JNDI来查找命令和在设置文件web.xml中手动声明资本。服务器经由过程Servlet的自我调剂来实行它的义务。变量的称号和范例由映像机制主动断定,只管你能够使用正文的参数来超出这一限定。一个注进的资本能够是数据源,Java信息服务目标文件大概是情况设置的标量。上面是一个例子:
@Resourcejavax.sql.DataSourcecatalog;
publicgetData(){
Connectioncon=catalog.getConnection();
}
如今,在这段Servlet代码酿成服务之前,容器会定位JNDI变量,并关于目次变量举行手动分派。
为了效力,仅仅某些类撑持资本注进,这些类有:Servlets,Servlet过滤器,Servlet事务监听器,JSP标签操纵器,JSP库事务监听器,用于处置beans的JSF,和一些与Serlvets有关的类。
•@Resources正文与@Resource类似,可是它用于一组@Resource正文。它们都来自JSR250,是Java平台的大众正文。
•@PostConstructand@PreDestroy:可使办法成为带有性命周期的办法。@PostConstruct办法用于资本注进初始化以后。@PreDestroy办法用于Servlet离开服务并开释注进的资本的时分。接纳的办法必需是现实的办法,前往void而且不成以抛出任何非常。这些正文实质上使得任何办法都成为init()和destroy()的子办法,这些特性也来自与JSR250。
•@EJB:相似于@Resource,计划用于注进企业级的JavaBeans。比起@Resource,它略有分歧,在于@EJB的参数特定计划用来定位EJB的参数。这个正文来自EJB3.0的标准。
•@WebServiceRef:与@Resource和@EJB类似,计划用于注进Webservice参数。来自于JAX-WS2.0标准。
•@PersistenceContext,@PersistenceContexts,@PersistenceUnit,and@PersistenceUnits:这些正文来自EJB3.0标准来撑持Java对象的耐久化。
•@DeclareRoles:界说使用程序中平安脚色的利用。当界说一个Servlet类时,在设置文件web.xml中<security-role>标签中对它举行设置,来自JSR250。
•@RunAs:用于声明哪一个类应当实行。当界说一个Servlet类时,在设置文件web.xml中<run-as>标签中对它举行设置。来自于JSR250。
正文的实行:
  不管你利用正文与否??特别在你不利用时??它关于了解服务器上程序的实行有侧重要意义。为了让服务器辨认类中的正文,它必需加载这些类,这就意味着服务器必需是启动着的,服务器经由过程WEB-INF/classes目次下和WEB-INF/lib目次下的一切类文件来查找正文。(每一个标准下,服务器不用查找这两个目次之外的目次。)你能够经由过程上面的办法指明<web-app>根的属性而不用利用怎样举行正文:
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
version="2.5"full="true">
</web-app>
web.xml的便当:
Servlet2.5关于web.xml引进几个小的变化,使得它加倍便利。
Servlet称号的通配符化:
起首,当你写<filter-mapping>,你如今能够在<Servlet-name>标签中利用*号来代表一切的Servlets。而之前,你必需一次把一个Servlet绑定到过滤器上,像如许:

<filter-mapping>
<filter-name>ImageFilter</filter-name>
<Servlet-name>ImageServlet</Servlet-name>
</filter-mapping>

如今,你能够一次绑定一切的Servlets:

<filter-mapping>
<filter-name>ImageFilter</filter-name>
<Servlet-name>*</Servlet-name><!?新特性-->
</filter-mapping>

这有着很年夜用处,比方:

<filter-mapping>
<filter-name>DispatchFilter</filter-name>
<Servlet-name>*</Servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

映照的复合形式:
其次,当我们写<Servlet-mapping>大概<filter-mapping>时,你如今能够在统一的标签中接纳复合婚配的尺度。之前一个<Servlet-mapping>只撑持一个<url-pattern>元素,如今它不但撑持一个,比方:
<Servlet-mapping>
<Servlet-name>color</Servlet-name>
<url-pattern>/color/*</url-pattern>
<url-pattern>/colour/*</url-pattern>
</Servlet-mapping>

一样地,之前<filter-mapping>也是只撑持一个<url-pattern>大概一个<Servlet-name>。如今它关于每一个元素都能够撑持恣意多个:

<filter-mapping>
<filter-name>MultipeMappingsFilter</filter-name>
<url-pattern>/foo/*</url-pattern>
<Servlet-name>Servlet1</Servlet-name>
<Servlet-name>Servlet2</Servlet-name>
<url-pattern>/bar/*</url-pattern>
</filter-mapping>

HTTP办法名:

  比来,你能够将正当的HTTP/1.1办法名放进<http-method>元素中。当你利用这些办法时,<http-method>将指明<security-constraint>标志里的办法应当被使用。从之前来看,它仅限于HTTP/1.1的7个尺度办法:GET,POST,PUT,DELETE,HEAD,OPTIONS和TRACE。可是,HTTP/1.1同意对办法举行扩大,WebDAV是用于这类扩大的广泛手艺。在Servlet2.5中,你能够平安地束缚任何大概的HTTP办法名,尺度及扩大,包含WebDAV办法,比方:LOCK,UNLOCK,COPY及MOVE。
假如你写一个WebDAV的Servlet,你不用利用doLock()和doCopy()办法。你必需写本人的service()办法及分拨request.getMethod()办法。正因为这类变更,你不用办理体系的平安性。
往除限定:

  Servlet2.5往除关于毛病处置和回话跟踪的一些限定。关于毛病处置,Servlet2.5之前,设置在<error-page>中的毛病处置页面不克不及经由过程挪用setStatus()办法来修正触发他们的毛病代码,而Servlet2.5削弱了这一标准。如许的标准的发生于如许的概念,就是毛病页面的事情是指出每一个毛病而不是修正毛病。可是,实践利用中,毛病页面不但是用于指堕落误,而是还能做更多的事变,也许能够取代在线匡助来匡助用户办理成绩。这个标准将不再限定毛病页面所发生的反应信息。

  关于会话跟踪,Servlet2.5之前,挪用RequestDispatcher.include()的Servlet不克不及设置呼应的题目头,而Servlet2.5削弱了这一标准。原标准的目标是使外部的Servlets限定在本人的页面空间中,不成以影响内部的页面。如今这个标准已削弱,同意在外部的Servlet中利用request.getSession()命令,这个命令能够悄然地创立一个会话跟踪cookie的题目头。逻辑上请求限定外部的资本,但逻辑上也请求这些限定不该该作废其启动session的这一功效。这个变化关于Portlet标准来讲显得特别主要。感化是:假如呼应已无效,则getSession()命令就会抛出一个IllegalStateException(非常),而在此之前,就没有这个功效。

优化:
  比来,新的标准优化了一些实例,使得Servlets加倍便利并且包管了更好地按请求事情。

停止呼应:
  第一处优化微小又深邃,但做为标准中的一个例子另有蛮风趣的。Servlet2.4标准划定呼应在这几种情形下应当是无效的,包含:在呼应的setContentLength办法中内容已明白申明,和内容已写进了呼应中。这类情形只要你的代码像上面如许才可使呼应从头定向:

response.setHeader("Host","localhost");
response.setHeader("Pragma","no-cache");
response.setHeader("Content-Length","0");
response.setHeader("Location","http://www.apache.org");

  Servlet手艺疏忽特定地区的题目头,由于内容满意0字节长度,呼应就会当即失效。而在它入手下手之前,呼应就已生效了!Servlet容器一般回绝实行这类举动,而Servlet2.5版本增添了“长度必需年夜于0”这个准绳。
实例编码:

  Servlet2.4标准划定必需在挪用request.getReader()办法之前挪用request.setCharacterEncoding()办法。可是,假如你疏忽这个准绳而在其以后往挪用request.setCharacterEncoding()办法,那末会发生甚么成果,这个成绩标准里并没有说。为了烦琐,如今打消这类情形!
Cross-contextsessions(分歧高低文目次间的会话):
  比来,关于Cross-context会话处置的划定规矩已明白申明。当Servlets指派从一个高低文到其他高低文的哀求时,这个划定规矩就发扬了感化??在方针挪用过程当中,包含哪些会话。这个版本的呈现使得一个高低文目次的主页里的portlets能够经由过程几种外部的命令来对其余高低文目次里的portlets起感化。Servlet2.5明白指出一个高低文目次里的资本能够会见其他高低文目次的session(会话),而不必思索这个哀求从那里入手下手的。这意味着portlets能够离开主页的局限而在本人的局限里运转,并且这个标准还会使用在不兼容的Serlvet容器中。
等候:

  因为Servlet2.5版本要坚持一些旧的性子,几个年夜的观点不能不延后到下一个阶段。它们包含:
•新的输出/输入(NIO)撑持:使NIO通道更有益于Servlets举行客户端通讯成为大概。
•过滤器wrap-under或wrap-over语义:偶然用过滤器包装哀求,和/大概呼应对象往修正办法举动大概启用新的办法。当把这类包装和服务器对哀求和呼应的包装分离起来时,又应当怎样包装在一同?
•用于接待的Servlets文件:做为索引应当充任接待感化的文件吗?在此之前,这个回覆是一定的。可是标准没有明白申明怎样利用这个功效,特别在没有索引的情形下。
•用于接待的文件的分拨划定规矩:怎样分拨接待文件,这个细节并没有完整申明,而是遗留了一些开放的缺口来应对不兼容成绩。
•上岸后选择默许页面:假如用户经由过程他们的书签会见Servlet的上岸页面,那末在乐成上岸后页面应当转向那里呢?这个成绩至今还没有明白申明。
•用户的主题日记:在经由过程网站准确地注册以后,欠亨过传统地上岸体例没有举措使Servlet信托用户。
停止语:
假如抛开正文来看Servlet2.5的变更,可见在设置文件web.xml中往除一些限定,是有益的,同时又优化了实例举动使其更合适更便于开辟Web体系(网页)。
Servlet2.5中正文的感化加倍戏剧化。Servlets自己不克不及声明正文范例的变量,乃至功能弱的Servlet容器都不撑持正文。但是在JEE5情况下的Servlets编写者能够看到,经由过程大众的正文及EJB3.0和JAX-WS2.0标准而引进的正文范例会对代码发生很年夜变更,而且这也将对Servlet怎样办理内部资本,对象的耐久化及EJB的组成发生严重影响。

令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。
小魔女 该用户已被删除
10#
发表于 2015-3-25 09:35:12 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
活着的死人 该用户已被删除
9#
发表于 2015-3-18 02:25:53 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
小女巫 该用户已被删除
8#
发表于 2015-3-11 09:15:57 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
谁可相欹 该用户已被删除
7#
发表于 2015-3-8 13:14:25 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
柔情似水 该用户已被删除
6#
发表于 2015-3-8 10:25:59 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
愤怒的大鸟 该用户已被删除
5#
发表于 2015-3-1 13:01:32 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
海妖 该用户已被删除
地板
发表于 2015-2-10 17:14:37 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
因胸联盟 该用户已被删除
板凳
发表于 2015-1-30 20:42:55 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
小妖女 该用户已被删除
沙发
发表于 2015-1-29 13:24:09 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
变相怪杰 该用户已被删除
楼主
发表于 2015-1-20 17:27:11 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-29 12:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表