仓酷云

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

[学习教程] JAVA网站制作之Servlet与Web服务

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:34:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。servlet|web|web服务Servlet在webservices中起到很年夜的感化,卖力剖析soap文件(动静和附件封套),利用wsdl来校验soap动静等。作为基础的编程是能够用servlet来剖析soap动静,特别是关于带附件的soap动静,如许做很通明,可是servlet不克不及作为Web服务,固然拓展的JAXM是能够做到的。如今那些撑持webservices的项目都是经由过程底层上完成了servlet的功效,来完成HTTP+SOAP的通讯,就不必要程序员思索基于HTTP的SOAP动静的通讯历程(不要有如许的曲解,在java平台上HTTP的通讯的服务程序是servlet/jsp,而如今你不必servlet和jsp来通讯,岂不是冲突?现实不冲突,记着是底层已完成了servlet功效,详细通讯有底曾本人办理),间接上升到营业逻辑的服务编程。固然偶然也能够编写剖析SOAP动静的servlet,那就仅仅只是SOAP通讯了(servlet没法作为服务来形貌)。上面依据设置文件,来讲明一些底层与webservices的干系:
回忆一下servlet的映照形式。我们晓得,servlet是从javax.servlet.http.HttpServlet承继的,在服务器端被载进JVM实行,然后向客户端输入html流。
servlet的web.xml文件(位于webapps/foo/WEB-INF目次):

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
</web-app>
invokerservlet实际上是:org.apache.catalina.servlets.InvokerServlet
按类名供应小服务程序。比方,假如您挪用foo/servlet/HelloServlet,
invokerservlet将装进该HelloServlet(假如它在其类路径中的话)并实行。
初看下面的web.xml,仿佛只给出了一个servlet映照,而没有界说invokerservlet。
实在,invokerservlet是在tomcat的conf目次中的web.xml中界说的::
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
以是,假如抛开Tomcat_HOME/conf/web.xml,我们如许界说一个web.xml,仿佛更能分明的申明成绩:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
<servlet-name>MyInvoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyInvoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
</web-app>
即一切/servlet/*形式的url,城市交给org.apache.catalina.servlets.InvokerServlet来处置。
大概说,一切/servlet/*形式的url,实在都是挪用InvokerServlet这个类,而InvokerServlet自己也是
一个servlet,它也是从HttpServlet承继而来的。
如许,我们本人的servlet就可以够经由过程特定的url实行,即/servlet/OurServlet。
固然,假如你乐意,能够界说任何的urlpattern,而纷歧定是/servlet/*,这一点,正如我们前面
看到的Axis处置Soap动静的办法。
进一步,假如不想让InvokerServlet在两头“捣乱”,我们固然能够间接界说本人的servlet:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
<servlet-name>MyInvoker2</servlet-name>
<servlet-class>
com.foo.MyServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyInvoker2</servlet-name>
<url-pattern>/AnyName/*</url-pattern>
</servlet-mapping>
</web-app>
JSP也是一样的事理,有了下面的剖析,
看看Tomcat_HOME/conf/web.xml中的以下语句就能够JSP的处置办法了,这里就不再空话了:
....
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
....
进进正题。
我们先来看部署WebService的web.xml:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN""http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>Axis</servlet-name>
<!--实践servlet程序,这里是AxisServlet-->
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>

<!--###界说servlet和url的对应干系-->

<servlet-mapping>
<servlet-name>Axis</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>

</web-app>


一切/services/*形式的url城市交给org.apache.axis.transport.http.AxisServlet处置,
AxisServlet固然也是从HttpServlet承继而来的。这就是为何我们部署的Web服务在挪用时都要在
服务称号前加上services/了。

能够说,AxisServlet是一切Web服务挪用的出口。
那末AxisServlet在接办Web服务挪用后都做了哪些事情呢?

客户端用call.invoke()挪用web服务用的是POST,以是出口是AxisServlet.doPost...
而不是AxisServlet.doGet...


先来看看AxisServlet的doPost函数,这里只给出了关头语句及正文:

/**
*ProcessaPOSTtotheservletbyhandingitofftotheAxisEngine.
*HereiswhereSOAPmessagesarereceived
*@paramreqpostedrequest
*@paramresrespose
*@throwsServletExceptiontrouble
*@throwsIOExceptiondifferenttrouble
*/
publicvoiddoPost(HttpServletRequestreq,HttpServletResponseres)
throwsServletException,IOException
{
msgContext=createMessageContext(engine,req,res);//猎取客户哀求信息

engine.invoke(msgContext);//挪用客户端哀求的服务

responseMsg=msgContext.getResponseMessage();//失掉挪用的前往了局

sendResponse(getProtocolVersion(req),contentType,res,responseMsg);//将了局送至客户端
}

如许一来,Web服务挪用的前因后果就大抵分明了。。。

为了高分明后面我们的三个url
http://192.168.0.1/test/services
http://192.168.0.1/test/services/sayHelloService?wsdl
http://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&aname=everybody
是如何取得输入了局的,再来看看AxisServlet的doGet函数,这里只给出了流程框架及正文:

**
*ProcessGETrequests.BecauseAxisdoesnotsupporttheGET-style
*pseudoexecutionofSOAPmethods,thishandlerdealswithqueries
*ofvariouskinds,notrealSOAPactions.
*
*@todoforsecureinstallations,dontstacktraceonfaults
*@paramrequestrequestin
*@paramresponserequestout
*@throwsServletException
*@throwsIOException
*/
publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)
throwsServletException,IOException
{

//假如路径为空,好比:http://localhost/wstk/services或http://localhost/wstk/services/*
if((pathInfo==null||pathInfo.equals(""))&&!realpath.endsWith(".jws"))

{
//从server-config.wsdd文件中读取一切部署的服务信息,向向客户端列出一切部署的服务,
//包含每一个服务可挪用的办法。

}else
//假如路径不为空,好比:http://localhost/wstk/services/sayHelloService
if(realpath!=null)
{
//假如哀求wsdl,好比:http://localhost/wstk/services/sayHelloService?wsdl
if(wsdlRequested)
{
//创立sayHelloService的WSDL文件并传送至客户端
}else
//这里是使用url挪用Web服务的出口,好比http://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&aname=everybody
if(req.getParameterNames().hasMoreElements())
{
//假如客户端挪用的办法准确,则Axis会挪用响应的JavaBean,并把JavaBean的前往了局
//封装为Soap动静流前往给客户端。
}
}
}


而Axis如何找到我们所哀求的JavaBean呢?谜底是server-config.wsdd文件。

server-config.wsdd

<?xmlversion="1.0"encoding="UTF-8"?>
<deploymentxmlns:java="http://xml.apache.org/axis/wsdd/providers/java"xmlns="http://xml.apache.org/axis/wsdd/">

<servicename="sayHelloService"provider="java:RPC">
<parametername="className"value="sayHello"/>
<parametername="allowedMethods"value="sayHelloTo"/>
</service>

<handlertype="java:org.apache.axis.handlers.http.URLMapper"name="URLMapper"/>

<transportname="http">
<requestFlow>
<handlertype="URLMapper"/>
</requestFlow>
</transport>

</deployment>

WSDD是webservicedeploymentdescriptor的缩写。

最表面的<deployment>元素唆使这是WSDD,并界说了java的名字空间。

接着的<service>元素界说了service。一个service是一个方针链,包含哀求request、内容供应者provider、呼应response。
在这个例子中,我们指出service名字是sayHelloService,provider是"java:RPC",它是axis的标志,唆使这是一个java的RPCservice,
而处置它的真实的class是org.apache.axis.providers.java.RPCProvider。

接着我们要在<parameter>中告知RPCProvider,它怎样实例化并挪用准确的class(如:com.foo.MyService)。
<parameter>元素的className唆使class名,allowedMethods告知引擎那些共用的办法要经由过程soap来挪用。
"*"暗示一切的大众办法,我们也列出办法名字列表,能够空格或逗号支解它们。

大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-21 10:33:25 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
柔情似水 该用户已被删除
板凳
发表于 2015-1-24 21:03:21 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
飘灵儿 该用户已被删除
地板
发表于 2015-1-28 23:17:06 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
山那边是海 该用户已被删除
5#
发表于 2015-2-1 16:46:31 | 只看该作者
是一种突破用户端机器环境和CPU
因胸联盟 该用户已被删除
6#
发表于 2015-2-2 17:48:27 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
第二个灵魂 该用户已被删除
7#
发表于 2015-2-5 15:25:05 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
活着的死人 该用户已被删除
8#
发表于 2015-2-12 12:45:13 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
再见西城 该用户已被删除
9#
发表于 2015-2-13 10:40:18 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
兰色精灵 该用户已被删除
10#
发表于 2015-2-22 20:31:12 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
爱飞 该用户已被删除
11#
发表于 2015-2-26 17:48:34 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
再现理想 该用户已被删除
12#
发表于 2015-3-8 16:26:07 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
13#
发表于 2015-3-11 04:07:03 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
灵魂腐蚀 该用户已被删除
14#
发表于 2015-3-15 11:52:24 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
冷月葬花魂 该用户已被删除
15#
 楼主| 发表于 2015-3-27 00:11:05 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
若相依 该用户已被删除
16#
发表于 2015-3-27 00:50:55 | 只看该作者
是一种突破用户端机器环境和CPU
莫相离 该用户已被删除
17#
发表于 2015-4-4 23:49:54 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
小女巫 该用户已被删除
18#
发表于 2015-4-6 04:09:42 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
飘飘悠悠 该用户已被删除
19#
发表于 2015-4-15 00:09:31 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
小魔女 该用户已被删除
20#
发表于 2015-4-20 01:52:41 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 11:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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