|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。js|servlet行将面世的J2EE1.4供应用Java开辟Web使用程序的新的Servlet2.4和JavaServerPages(JSP)2.0手艺。本文展现了这两种手艺的新特征,并在得当的中央供应每一个特征的示例代码。本文假定读者熟习之前的Servlet2.3和JSP1.2版本。给出的例子已用Tomcat5(包括在JavaWebServicesDeveloperPack1.2中)举行了测试。
Servlet和JSP毫无疑问是两种使用最广的J2EE手艺。Servlet手艺是用Java举行Web使用编程的基本,也是JSP的基本。可是,servlet编程大概会十分贫苦。出格是当你不能不发送一个没几代码的长HTML页面时更是云云。每一个HTML标志必需嵌进到字符串中,用PrintWriter对象的显现体例发送。是一种事情单调有趣而烦人的事情。利用servlet的另外一个弱点是每处改动都必要servlet程序员参与。
Sun公司懂得到这一成绩以后便开辟了JSP作为办理计划。在JSP中,程序员和页面计划员的合作变得简单多了,而且当JSP页面变动时会主动举行编译。不外请注重,JSP是servlet手艺的一个扩大,而不是放弃servlet。在实践使用傍边,servlet和JSP页面一同利用。
Servlet2.4的新特征
Servlet2.4供应了几个新类,且不撑持javax.servlet.SingleThreadModel接口。这一版本只撑持HTTP1.1,以是Servlet2.4使用程序不合用于HTTP1.0客户程序。2.4版增添了哀求监听器和哀求属性监听器,并能在一个使用程序中将servlet用作接待页面。别的,Servlet2.4还供应了更好的ServletRequest和RequestDispatcher对象,并更好地撑持国际化。别的,如今是依据形式而不是文档范例界说(document-typedefinition,DTD)文件来考证部署形貌符是不是无效。这就意味着撑持部署形貌符的可扩大性。
上面详细申明Servlet2.4的新特征。哀求监听器和哀求属性监听器。Servlet2.3增添了servlet高低文相干监听器和会话相干监听器。Servlet2.4增添了新的javax.servlet.ServletRequestListener和javax.servlet.ServletRequestAttributeListener两种接口,它们会关照你与Request对象有关的事务。假如你对每一个Request对象的初始化和取消感乐趣,你能够实行ServletRequestListener接口。这个接口有两个办法:requestInitialized()和requestDestroyed()。当必要一个Request对象时,servlet容器便挪用requestInitialized办法。当不再必要Request对象时,servlet容器便挪用requestDestroyed办法。
这两个办法都从servlet容器吸收一个javax.servlet.ServletRequestEvent对象。能够从ServletRequestEvent实例取得servlet高低文和servlet哀求。
第二个监听器接口ServletRequestAttributeListener处置Request对象属性的增加、变动和删除。该接口有以下办法:
<LIclass=bodycopy>attributeAdded。向Request对象增加新属性时由servlet容器挪用。
<LIclass=bodycopy>attributeRemoved。从Request对象中删除属性时由servlet容器挪用。
- attributeReplaced。Request对象中现有属性值被交换时由servlet容器挪用。
这三个办法从servlet容器取得javax.servlet.ServletRequestAttributeEvent类的一个实例。ServletRequestAttributeEvent类扩大了ServletRequestEvent类,并增加了两个新办法:getName和getValue。getName办法前往触发事务的属性的称号,getValue前往属性的值。
代码清单1给出这两个新的监听器的示例类。当servlet容器挪用办法时两者都显现办法名。监听器经由编译后,它们的类文件必需被部署到WEB-INF/classes目次下。ServletRequest中的新办法。在Servlet2.4中,javax.servlet.ServletRequest接口增添了4个新办法:
<LIclass=bodycopy>getRemotePort。前往发送哀求的客户机或最初一个代办署理服务器的InternetProtocol(IP)源端口。
<LIclass=bodycopy>getLocalName。前往从中吸收哀求的IP接口的主机名。
<LIclass=bodycopy>getLocalAddr。前往从中吸收哀求的接口的IP地点。
- getLocalPort。前往从中吸收哀求的接口的IP端标语。
请注重,在Servlet2.3中,getServerName和getServerPort办法前往的值就是如今getLocalName和getLocalPort前往的值。在2.4版中,getServerName和getServerPort已从头界说。欲懂得更多的信息,请检察API文档。
将一个JSP页面中的代码示比方下--
- out.println("<br>RemotePort:"+request.getRemotePort());out.println("<br>LocalName:"+request.getLocalName());out.println("<br>LocalAddr:"+request.getLocalAddr());out.println("<br>LocalPort:"+request.getLocalPort());
复制代码 --该代码天生如许的内容:
- RemotePort:3303LocalName:localhostLocalAddr:127.0.0.1LocalPort:8080
复制代码 哀求调剂程序的新特征。利用哀求调剂程序可将以后哀求传送给一个新的资本,或从以后页面引进另外一个资本。Servlet2.4增添了一些属性,它们将被增加到传送给另外一个资本的一个Request对象上:
- javax.servlet.forward.request_urijavax.servlet.forward.context_pathjavax.servlet.forward.servlet_pathjavax.servlet.forward.path_infojavax.servlet.forward.query_string
复制代码 假如一个Request对象未被传送,则这些属性的值为null。另外一方面,在所传送来对象的资本中这些属性将具有非null值。当某一个资本必需只能经由过程另外一个资本挪用而不克不及间接挪用时,这些属性值很有效。
举个例子,在一个叫做myApp的Context(高低文)中有一个名为ModernServlet的servlet,ModernServlet被传送给TargetServlet。在TargetServlet中,显现代码清单2中的代码。
myApp的部署形貌符包括以下和元素:
- <servlet><servlet-name>Modern</servlet-name><servlet-class>ModernServlet</servlet-class></servlet><servlet-mapping><servlet-name>Modern</servlet-name><url-pattern>/Modern</url-pattern></servlet-mapping><servlet><servlet-name>Target</servlet-name><servlet-class>TargetServlet</servlet-class></servlet><servlet-mapping><servlet-name>Target</servlet-name><url-pattern>/Target</url-pattern></servlet-mapping>
复制代码 上面是挪用ModernServlet时把持台显现的了局:
- javax.servlet.forward.request_uri:/myApp/Modernjavax.servlet.forward.context_path:/myAppjavax.servlet.forward.servlet_path:/Modernjavax.servlet.forward.path_info:nulljavax.servlet.forward.query_string:null
复制代码 将过滤器用于哀求调剂程序。Servlet2.4在部署形貌符中增加了一个新的元素,以便servlet程序员决意是不是将过滤器(filters)使用于哀求调剂程序。元素的值能够是REQUEST(默许值)、FORWARD、INCLUDE和ERROR:
- REQUEST。假如哀求间接来自客户机则利用过滤器。
- FORWARD。假如哀求正由哀求调剂程序举行处置,暗示与或相婚配的Web组件利用传送挪用,则利用过滤器。
- INCLUDE。只要在哀求正由哀求调剂程序举行处置,暗示与或相婚配的Web组件利用包括(include)挪用时,才利用过滤器。
- ERROR。只要在哀求正由毛病页面机制处置为一个与元素相婚配的毛病资本时才利用过滤器。
Servlet2.4只撑持HTTP1.1客户机。Servlet2.3既撑持HTTP1.0,又撑持HTTP1.1,而Servlet2.4与Servlet2.3分歧,它只撑持HTTP1.1客户机。作为过渡,HTTP/1.0形态码302(临时倡议)仍旧存在,并且仍旧由javax.servlet.http.HttpServletResponse接口中的SC_MOVED_TEMPORARILY暗示。HTTP1.1具有Found的形态码302,它由HttpServletResponse接口中的静态SC_FOUND暗示。
Servlet用作接待页面。在Servlet2.3中,你能够在部署形貌符中利用元素列出接待文件--当收到一个不完全的URL时将显现的文件。可是,在Servlet2.3中,在元素中只能利用HTML文件或JSP文件。在Servlet2.4中,现在能够将一个servlet用作接待页面。下例为一个叫做Modern的servlet,它的类为ModernServlet.class,并已被映照到path/Modern。
- <servlet><servlet-name>Modern</servlet-name><servlet-class>ModernServlet</servlet-class></servlet><servlet-mapping><servlet-name>Modern</servlet-name><url-pattern>/Modern</url-pattern></servlet-mapping><welcome-file-list><welcome-file>Modern</welcome-file></welcome-file-list>
复制代码 此时,若用户键进诸如http://domain/context/(不带资本文件)的URL时,就会挪用ModernServlet。
对国际化的新撑持。在Servlet2.3中,没有举措间接告知客户扫瞄器应该利用甚么字符编码。要完成这一目标,你必需把一个java.util.Locale对象传送给javax.servlet.ServletResponse接口的setLocale办法,以下所示:
- response.setLocale(locale);
复制代码 这意味着你必需起首创立一个Locale对象。
别的一种举措是,在Servlet2.3中,你可使用setContentType办法来传送内容范例和字符集,如:
- setContentType(text/html;charset=UTF-8);
复制代码 在Servlet2.4中,javax.servlet.ServletResponse接口中有两个撑持国际化的新办法。第一个办法是setCharacterEncoding,它的用法以下:
- publicvoidsetCharacterEncoding(Stringcharset)
复制代码 利用setCharacterEncoding,你能够只将字符编码指定为一个字符串,而不用先创立Locale对象。不外,请注重,要让这类办法起感化,必需在挪用getWriter办法之前和呼应提交之前挪用它。
第二个新办法是getContextType,作为在ServletResponse对象中挪用setContentType、setLocale或setCharacterEncoding办法的了局,它前往在ServletResponse对象中利用的内容范例。
除javax.servlet.ServletResponse中的这两个办法以外,你还能够使用Servlet2.4在部署形貌符中界说一个新元素:它使servlet程序员不用在他/她的servlet中指定locale-to-charset映照。怎样利用这一新元素的例子以下:
- <locale-encoding-mapping-list><locale-encoding-mapping><locale>ja</locale><encoding>ISO-2022-JP</encoding></locale-encoding-mapping></locale-encoding-mapping-list>
复制代码 部署形貌符的可扩大性。在Servlet2.3使用程序中,依据DTD文件对部署形貌符举行考证。如今Servlet2.4撑持依据形式对部署形貌符举行考证。利用形式比利用DTD有以下几点优点:
- 经由过程形式能够承继另外一个形式(可扩大的)的语法。
- 形式比DTD更准确。
- 经由过程形式能够指定每一个元素的内容的实践数据范例。
- 形式能够用于多个名字空间。
- 经由过程形式能够指定一个元素呈现的最多和起码次数。
可是,为了向后兼容,请求Servlet2.4容器撑持Servlet2.3和Servlet2.2DTD。
不撑持javax.servlet.SingleThreadModel接口。SingleThreadModel接口没无方法,它用于向servlet容器指明,它必需包管不会有两个线程同时实行实行该接口的servlet的服务办法。从servlet手艺入手下手呈现到如今,人们广泛曲解了这个接口。如今人人都否决用它,由于它会形成凌乱,而且在思索线程平安时在平安性方面给servlet程序员一个错觉。在任何新的开辟事情中决不该再利用这个接口。
JSP2.0中的新特征
JSP2.0(最后称为JSP1.3)比JSP1.2有了主要改善。固然,增添的最主要内容是JSP2.0容器中到场了对表达式言语(EL)的撑持。
EL最后是由JSP尺度标志库(JSTL)1.0标准界说的,它可帮忙从JSP页面中删除Java代码。javax.servlet.jsp.el包中所形貌的API展现EL的语义。EL表达式的语义与Java表达式的语义相似;表达式的值盘算出来后被拔出到以后的输入中。EL可用于尺度的或定制的操纵的属性值和模板文本中。上面是EL表达式的布局(个中expr为表达式):
关于包括字符序列"${"的笔墨值,JSP2.0供应了一种办法,经由过程利用序列"${${"举行换码。比方,上面的字符序列被转换为笔墨值${expr}:
别的,因为JSP2.0之前的版本不撑持EL,以是JSP使用程序将疏忽任何Web使用程序中的EL,这些使用程序的web.xml依据Servlet2.2或Servlet2.3DTD举行考证。为了测试此处讲到的JSP页面中的表达式,你只需从使用程序中删除web.xml文件。
实践上,EL是一种复杂的言语,它匡助页面创作者会见JSP隐含对象,举行重复操纵和不包括Java代码的前提操纵--这些在JSP1.2中是没法完成的。
为了会见隐含对象,JSP容器撑持上面的称号-对象映照:
- pageContext。PageContext对象
- pageScope。将页面局限的属性名映照到它们的值
- requestScope。将哀求局限的属性名映照到它们的值
- sessionScope。将会话局限的属性名映照到它们的值
- applicationScope。将使用程序局限的属性名映照到它们的值
- param。将参数名映照到一个单一串参数值
- paramValues。将参数名映照到该参数一切值的一个字符串数组
- header。将标头名映照到一个单一串标头值
- headerValues。将标头名映照到该标头一切值的一个字符串数组
- cookie。将cookie名映照到一个单一cookie对象
- initParam。将高低文初始化参数名映照到其字符串参数值
比方,上面的表达式暗示参数userName的值:
上面的表达式前往Session对象的productId属性的值:
- ${sessionScope.productId}
复制代码 更复杂的SimpleTag接口操纵历程。JSP2.0供应了一个新的接口javax.servlet.jsp.tagext.SimpleTag,它是编写标志处置器(taghandler)的一种更复杂的办法。在JSP1.2中,标志处置器必需间接或直接地实行avax.servlet.jsp.tagext包中的以下接口之一:Tag、IterationTag或BodyTag。关于实行Tag接口的标志处置器来讲,最基础的情形是,JSP容器每次碰到JSP页面中的一个标志时就挪用doStartTag和doEndTag两个办法。使用JSP2.0,JSP程序员能够经由过程实行新的SimpleTag接口来选择实行历程更复杂的标志处置器。JSP容器其实不挪用实行Tag接口的标志处置器的两个办法,而只必要挪用SimpleTag接口中的一个办法:doTag。一切标志逻辑、重复操纵和主体评价等都用这一个办法来实行。以是,SimpleTag与javax.servlet.jsp.tagext.BodyTag功效一样壮大,但操纵历程更复杂。
为了撑持必要实行SimpleTag接口的标志处置器的编写,javax.servlet.jsp.tagext包供应了一个名为SimpleTagSupport的撑持类。假如你要扩大这个类,则你只需供应一个实行办法:doTag。
代码清单3给出了一个扩大SimpleTagSupport的标志处置器的例子。
利用标志文件更轻松地开辟标志库。尽人皆知,JSP1.2中的自界说标志库必要花良多工夫来开辟。开辟事情触及标志处置器和标志库形貌符(TLD)文件的开辟,和标志库在web.xml文件中的注册。JSP2.0经由过程供应一种新的编写自界说标志库的办法办理了这个成绩。利用标志文件,标志扩大可相似于JSP文件。无需编译,无需编纂web.xml文件,并且不再必要TLD。要做的是你必需把标志文件复制到WEB-INF/tags目次中,而这一点很简单做到。剩下的事都交给JSP容器往做,它会把WEB-INF/tags目次中找到的每一个标志文件转换为标志处置器。程序员完整挣脱了构建标志处置器的庞大事情。
上面举个例子。这是标志库最复杂的情势,个中标志文件只是复杂地把一个字符串写到隐含对象中。
- <%―example1.tagfile,mustresideinWEB-INF/tags―%><%out.println("Hellofromtagfile.");%>
复制代码 利用JSP页面中的标志库再复杂不外了。战争常一样,你只需taglib指令,经由过程前缀属性在全部页面中辨认标志库。如今你有一个tagdir属性,而不是uri属性。tagdir属性援用WEB-INF/tags目次或WEB-INF/tags下的任何子目次。
上面是一个利用example1.tag文件的JSP页面的例子。
- <%@taglibprefix="easyTag"tagdir="/WEB-INF/tags"%><easyTag:example1></easyTag:example1>
复制代码 挪用该JSP页面扫瞄器上就会显现上面的字符串:
分离下面讲到的表达式言语,你就能够真正疾速构建无剧本的JSP页面。再举一个例子,上面的标志文件(叫做example2.tag)经由过程挪用JSP页面吸收一个属性,并将它转换为年夜写字母。
- <%―example2.tagfile,mustresideinWEB-INF/tags―%><%@attributename="x"%><%x=x.toUpperCase();out.println(x);%>
复制代码 上面是利用该标志文件的JSP页面:
- <%@taglibprefix="easyTag"tagdir="/WEB-INF/tags"%><easyTag:example2x="hello"></easyTag:example2>
复制代码 上面是另外一个例子,个中没有Java代码:
- <%―example3.tagfile,mustresideinWEB-INF/tags―%><%@variablename-given="x"scope="AT_BEGIN"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><c:setvar="x"value="3"/>After:${x}<jsp:doBody/>
复制代码 该标志文件用于上面的JSP页面:
- <%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@taglibprefix="easyTag"tagdir="/WEB-INF/tags"%><c:setvar="x"value="1"/>Before:${x}<br><easyTag:example3/>
复制代码 请注重,要运转本示例,在WEB-INF/lib目次下要有JSTL库。 最初一个标志文件示例还标明,不熟习Java编程言语的页面创作者仍能使用标志扩大的壮大功效。即使是Java程序员,利用标志文件也比编写实行javax.servlet.jsp.tagext包中的某个接口的Java类要便利。
结论
本文扼要论述了Servlet2.4和JSP2.0标准中的新特征,它们将包括期近将面世的J2EE1.4中。Servlet2.4和JSP2.0无疑将会加速Web使用程序的开辟。
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。 |
|