|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......erp|server|servlet 本文形貌了经由过程利用servlet和JavaServerPages来集成瘦客户机与MQSeries。这类集成必要用户具体填写HTML表单,并从该表单中搜集用户数据然后经由过程一个动静行列将数据发送到后端使用程序。接上去后端使用程序将处置该表双数据并经由过程该动静行列发还一个应对。该应对必要在扫瞄器中显现。
本文会商了瘦客户机、servlet及动静行列间的交互,并演示了怎样在该办理计划中利用IBM供应的分歧产物。读者应当懂得Java言语并熟习WebSphere和MQSeries。
系统布局概述下图给出了所倡议的办理计划系统布局。它触及三层办法。
处置流程
用户填写HTML表单。将表单发送给servlet。servlet将该HTTP哀求转换成一个MQSeries动静,并将其放进一个行列。后端使用程序处置该动静,然后经由过程动静行列发还一个应对。servlet从行列中检索动静,并将其寄存在一个JavaBean中。然后servlet挪用编译过的JavaServerPage并静态天生了局HTML页面。JSP从JavaBean检索该页面的动静内容,将其兼并到HTML,然后将了局页面回显在扫瞄器上。
该办理计划使用了以下手艺:
HTML/HTTP、Java-servlet、JavaBeans和JavaServerPage、Web服务器、动静行列
该办理计划集成了以下产物:
Netscape4.0/InternetExplorer3.0或更高版本、IBMHTTPServer3.0、WebSphere2.02、JDK版本1.1.7、MQSeries版本5.0
毗连至MQSeries
我们选择servlet模子是由于该模子相对CGI有很多长处。servlet是扩大了Web服务器的功效的尺度服务器端Java使用程序。servlet完整运转在WebServer上,不会将任何工具下载到扫瞄器。在装进时代或初始哀求时代会将servlet装进服务器的地点空间。在初始哀求以后,servlet十分敏捷地作出呼应。servlet的init办法为servlet的运转做好了筹办。每一个servlet装进只挪用一次init办法。在init办法中,按以下创建到MQSeries行列办理器的毗连:
publicvoidinit(ServletConfigconfig)
throwsServletException{
super.init(config);
try{
//Createaconnectiontothequeuemanager
qMgr=newMQQueueManager("NC.QManager");
}
catch(MQExceptionex)
{
System.out.println
("AnMQerroroccurredininit():Completioncode"
+ex.completionCode+
"Reasoncode"+ex.reasonCode);
try
{
if(qMgr!=null)
//Disconnectfromthequeuemanager
qMgr.disconnect();
}
catch(MQExceptione)
{
System.out.println("AnMQerroroccurred"
+"ininit()whiledisconnecting:"+"Completioncode"+
e.completionCode+"Reasoncode"+e.reasonCode);
}
}
}
因为只须创建一次到MQSeries的行列办理器的毗连,而且创建毗连必要很长工夫,因而init办法是实行这一历程的幻想地位。然后对该servlet的后继挪用会实行得更快。WebSphere也同意用户经由过程利用办理GUI事后装进servlet,因而跟着行列办理器毗连的创建,servlet做好了筹办,接上去就等着传送任何动静。
假如在init办法中捕捉到MQException,则上述代码会与行列办理器断开毗连。了局是,为了创建与行列办理器的毗连,用户将不能不从头装进servlet。
为了使servlet与MQSeries对话,必需利用MQSeriesBindingsforJava。MQSeriesBindingsforJava使您可以用Java言语编写MQSeries使用程序。这些使用程序间接与MQSeries行列办理器通讯以供应高临盆率、高功能开辟选项。它们利用Java本机办法间接挪用到现有的行列办理器API而不是经由过程MQSeries服务器毗连通道举行通讯;这为JavaMQSeries使用程序供应了更佳功能。在代码中我们必需导进“com.ibm.mqbind.*”包。MQSeries的java类也应当位于WebSphere的类路径中;这将同意WebSphere使用程序服务器定位MQSeriesBindingsforJava包。
创立MQ动静
因为BillingAddressServlet次要用于处置来自AddressInputForm的HTTP哀求,我们对HttpServlet天生子类。GenericServlet的这个笼统子类完成了用于处置哀求的缺省service()办法。掩盖的最多见办法包含doGet()和doPost()。上面的示例将掩盖doPost()办法。AddressInputForm经由过程上面的挪用来挪用这个doPost()办法:
<FORMMETHOD=POSTACTION="/servlet/BillingAddressServlet">
POST哀求发送一个HTTP动静主体,该动静主体含有发给servlet的一切数据。然后doPost()办法从输出中创立以下动静字符串:
StringtempAddress="Inputinformationis";
res.setContentType("text/plain");
..............
if("application/x-www-form-urlencoded".equals(req.getContentType()))
{
System.out.println("IndoPost()");
Enumerationenum=req.getParameterNames();
while(enum.hasMoreElements())
{
Stringname=(String)enum.nextElement();
Stringvalues=req.getParameter(name);
if(values!=null){
tempAddress=tempAddress+";"+name+":"+values;
}
}
发送动静
然后经由过程利用以下代码挪用putOrder()办法,doPost()办法将动静字符串放进动静行列:
publicvoid
putOrder(StringtempAddress){
try{
intopenOptions=MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT;
//Specifythequeuethatwewishtoopen,andtheopenoptions.
MQQueuencOrderDataQ=qMgr.accessQueue("NC.OrderCreateQ",
openOptions,
qManager,
null,//nodynamicqname
null);//noalternateuserid
//DefineaMQmessage
MQMessagecustomerAddress=newMQMessage();
customerAddress.writeUTF(tempAddress);
//specifythemessageoptions
MQPutMessageOptionspmo=newMQPutMessageOptions();
//putthemessageonthequeue
ncOrderDataQ.put(customerAddress,pmo);
//Closethequeue
ncOrderDataQ.close();
}
catch.........
检索动静
要检索由后端使用程序前往的动静,doPost()办法挪用orderUpdateStatus()办法。orderUpdateStatus()办法利用以下代码检索行列中的动静:
publicStringorderUpdateStatus(){
StringmsgText=null;
try{
intopenOptions=MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT;
//Specifythequeuethatwewishtoopen,andtheopenoptions.
MQQueuencOrderUpdateQ=qMgr.accessQueue("NC.UpdateQ",
openOptions,
qManager,
null,//nodynamicqname
null);//noalternateuserid
//createanewgetthemessage
MQMessageretrievedMessage=newMQMessage();
retrievedMessage.messageId=MQC.MQMI_NONE;
//setthegetmessageoptions
MQGetMessageOptionsgmo=newMQGetMessageOptions();
//getthemessageoffthequeue
ncOrderUpdateQ.get(retrievedMessage,gmo);
//Displaythemessage
msgText=
retrievedMessage.readString(retrievedMessage.getMessageLength());//forNC.UpdateQ
//Closethequeue
ncOrderUpdateQ.close();
}
catch.........
挪用JSP
最初,putOrder()办法挪用performTask()办法,以将动静存储在BillingAddressBean中。然后servlet挪用AddressOutputPageJSP,并将BillingAddressBean的句柄传给它。JSP抽掏出静态内容(即,来自JavaBean的动静)并将它们兼并进显现在扫瞄器上的HTML页面中。
publicvoidperformTask(javax.servlet.http.HttpServletRequestrequest,
javax.servlet.http.HttpServletResponseresponse,
java.lang.StringreturnMessage){
try
{
//instantiatethebean
BillingAddressBeanmyBillingAddressBean=newBillingAddressBean();
//setthereturnmessageinthebean
myBillingAddressBean.setMQReturnMessage(returnMessage);
//storethebeanintherequestsoitcanbeaccessedby
pageswhichareaccessedwithcallPage()
((com.sun.server.http.HttpServiceRequest)request).setAttribute
("BillingAddressBean",myBillingAddressBean);
//Calltheoutputpage
((com.sun.server.http.HttpServiceResponse)response).callPage
("/AddressOutputPage.jsp",request);
}
catch.........
停止语
在这一办理计划里,servlet和JSP的分离同意将功效逻辑与显现分别。servlet充任把持器,而JSP充任了局视图。一样,利用JSP和JavaBean明晰分别了内容显现和内容自己。经由过程利用servletinit办法为servlet运转做好筹办,比方,创立到行列办理器的毗连,改善了功能。WebSphere同意用户事后装进servlet以便可以在用户利用servlet之前在初始化时代就完成如创建毗连等耗时的义务。经由过程利用动静和行列,MQSeries使分歧的使用程序可以互相集成。
进而能拉拢大多数程序员用windows产品。并且从ASP.NETAJAX可以跨平台这一点上,间接证明了我们的推断,至少证明了微软做过这方面的研究。所以如果哪一天突然听说了.net可以跨平台了,那么请不要吃惊,如果这一天真的到来,java就到了真正和.net决战的时刻。因为不到万不得以的时候微软是不会推出跨平台的.net的,如果跨平台的.net还不足以对抗java的话,那么微软还剩的手段就是开源了,呵呵。 |
|