Ajax - 基础教程第八章例子学习四

来源:互联网 发布:安知玉如意男主 编辑:程序博客网 时间:2024/06/05 17:31

股票行情版块 

作者是从 http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx 这里获取服务的,像天气预报版块,我们要用WSDL2Java这个工具从http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx?WSDL这里获得服务的Java类.

在eclipse中,点击项目-》右击-》运行方式-》运行-》弹出运行对话框

在对话框中,1.在左边的框中 点击java应用程序-》新建

                        2.在右边的框中 如果新建成功,主要-》main类是空的,先选中下面的“搜身main类是包括库”

                        点击搜索WSDL2Java

                        或者直接填 org.apache.axis.wsdl.WSDL2Java

                       3. 在右边的框中,点击(x=)自变量-》程序自变量 里面填下面的内容:

                        -o ./WEB-INF/src

                       -Nurn:StockQuotes  ajaxdashboard.ws.stockquote
                       http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx?WSDL

                        这里说明下 -o 输出文件所在目录(“. ” -代表当前目录

                  -Nurn:命名空间 包名(这个我试了没用) wsdl

其实上面的过程就是java org.apache.axis.wsdl.WSDL2Java  -o ./WEB-INF/src  -Nurn:StockQuotes  ajaxdashboard.ws.stockquote  http://www.swanandmokashi.com/HomePage/WebServices/StockQuotes.asmx?WSDL

查下你的WEB-INF/src是不是有个com.swanandmokashi包,包里面有8个java类,注意是8个哦

ArrayOfQuote.java
GetQuotes.java
GetQuotesResponse.java
Quote.java
StockQuotes.java
StockQuotesLocator.java
StockQuotesSoap.java
StockQuotesSoapStub.java

把包名改成ajaxdashboard.ws.stockquote就行了。

一。stockQuote.jsp页面

代码清单8-12 stockQuote.jsp

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 

<div id="stockQuoteRoot" style="left:100px; top:200px;">
    
<div id="stockQuoteHandle">
        
<table width="100%" border="0" class="textbox">
            
<tr>
                
<td align="left" class="controls">
                    Stock Ticker
                
</td>
                
<td align="right">
                    
<class="controls" href="javascript:minimize('stockQuoteContent');">
                        -
                    
</a>
                    
&nbsp;
                    
<class="controls" href="javascript:maximize('stockQuoteContent');">
                        +
                    
</a>
                
</td>
            
</tr>
        
</table>
    
</div>
    
    
<div class="normalText">
        Stock Tickers to Track: 
            
<input type="text" name="stockTickers" id="stockTickers" 
                          onkeyup
="handleStockTickersChange();" class="normalText"
                          value
="<%=ajaxdashboard.Constants.DEFAULT_STOCK_TICKERS%>"
                          style
="text-transform:uppercase;"/> 
            
&nbsp;&nbsp;
            
<input type="checkbox" name="trackFlag" id="trackFlag" value="on"
                       onclick
="handleTrackFlagClick();"
                       checked
="checked"/>
            Auto Refresh
    
</div>
     
    
<div id="stockQuoteContent" class="stockQuoteContent"> 
            
<%@include file="stockQuoteDetail.jsp"%>
        
<%--
        
<span id="stockQuoteDetail">
            
<%@include file="stockQuoteDetail.jsp"%>
        
</span>
        --%>
    
</div>

</div>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
此tag是 jstl1.1的核心tag

<div id="stockQuoteRoot" style="left:100px; top:200px;">
    
<div id="stockQuoteHandle">

这个页面中,最外层的是id为stockQuoteRoot的DIV,stockQuoteRoot里面有鼠标拖动id为stockQuoteHandle的DIV,一个包含输入框跟选择框的DIV,最下面是显示股票行情的DIV。

ajaxDashboard.js中实现鼠标拖动的函数是

//stock quotes
initDomDrag("stockQuoteHandle", "stockQuoteRoot");

启动ajax服务的是

updateStockQuote();
startUpdateStockQuoteInterval();//这个是设置循环定时器

 <div class="normalText">
        Stock Tickers to Track: 
            
<input type="text" name="stockTickers" id="stockTickers" 
                          onkeyup
="handleStockTickersChange();" class="normalText"
                          value
="<%=ajaxdashboard.Constants.DEFAULT_STOCK_TICKERS%>"
                          style
="text-transform:uppercase;"/> 
            
&nbsp;&nbsp;
            
<input type="checkbox" name="trackFlag" id="trackFlag" value="on"
                       onclick
="handleTrackFlagClick();"
                       checked
="checked"/>
            Auto Refresh
    
</div>
这里面输入框的默认值是<%=ajaxdashboard.Constants.DEFAULT_STOCK_TICKERS%>,由于DEFAULT_STOCK_TICKERS是一个static的变量,所以可以直接引用,源代码中的默认值中的3个股票就剩一个还有资料而已了,所以我把默认值改为了" MSFT YHOO GE ",这也是官方推荐用的默认值。、

整个页面:

stockQuoteRootDIV{

          stockQuoteHandleDIV{

                 table{

                      tr{Stock Ticker                                        -+} 

                }

         }

         DIV{

                    Stock Tickers to Track: 输入框                              check box

        }

        stockQuoteContentDIV{
                   股票行情内容

        }

二。 在股票行情主页面中,include了一个页面,这是个显示具体股票行情的页面,看下它的代码清单吧

代码清单8-13 stockQuoteDetail.jsp

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 

<c:forEach var="quote" items="${quotesArray}">
    
    
<table>
        
<tbody>
            
<tr>
                
<td colspan="2" style="font-weight:bold;">
                    ${quote.companyName} (${quote.stockTicker})
                
</td>
            
</tr>
            
<tr>
                
<td>Current Price:</td>
                
<td>${quote.stockQuote}</td>
            
</tr>
            
<tr>
                
<td>Change:</td>
                
<td>${quote.change}</td>
            
</tr>
            
<tr>
                
<td>Last Updated:</td>
                
<td>${quote.lastUpdated}</td>
            
</tr>
        
</tbody>
    
</table>

</c:forEach>    

通过前面的3篇,应该都这个不陌生了吧,其中${quotesArray}是在UpdateStockQuoteServlet.java中request.setAttribute("quotesArray", quotesArray);传进来的,quotesArray是一个类Quote.java对象数组。

三。整个版块的工作过程

1. 加载页面时,ajaxDashboard.js运行函数updateStockQuote();(这个是我自己添加的),这个函数是在stockQuote.js中定义的,

function updateStockQuote() {
    var ajaxRequest = new AjaxRequest("UpdateStockQuote");
    ajaxRequest.addFormElementsById("stockTickers");
    ajaxRequest.sendRequest();
}

启动一个ajax请求,使用的servlet是UpdateStockQuote,传递的参数的是stockTickers(输入框的id)。

然后ajaxDashboard.js运行函数startUpdateStockQuoteInterval();,这个函数是在stockQuote.js中定义的,

var stockTickerUpdateIntervalID = 0;

function startUpdateStockQuoteInterval() {
    stockTickerUpdateIntervalID = window.setInterval("updateStockQuote()", 90000);
}

作用是启动一个90秒的循环定时器,每90秒运行updateStockQuote方法。

2. UpdateStockQuoteServlet.java

    在web.xml中添加

    <servlet>
        
<servlet-name>UpdateStockQuoteServlet</servlet-name>
        
<servlet-class>ajaxdashboard.servlet.UpdateStockQuoteServlet</servlet-class>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>UpdateStockQuoteServlet</servlet-name>
        
<url-pattern>/UpdateStockQuote</url-pattern>
    
</servlet-mapping>

代码清单9-14 UpdateStockQuoteServlet.java

 package ajaxdashboard.servlet;

import ajaxdashboard.service.StockQuoteService;
import ajaxdashboard.ws.stockquote.GetQuotesResponse;
import ajaxdashboard.ws.stockquote.Quote;
import java.io.*;
import java.util.Date;

import javax.servlet.*;
import javax.servlet.http.*;

public class UpdateStockQuoteServlet extends HttpServlet {
    
    
protected void processRequest(HttpServletRequest request
                                            , HttpServletResponse response)
                                            
throws ServletException, IOException {
        
        String stockTickers 
= request.getParameter("stockTickers").toUpperCase();
        
        GetQuotesResponse quotesResponse 
= 
                       
new StockQuoteService().getStockQuotesFor(stockTickers);
        
        Quote[] quotesArray 
= quotesResponse.getGetQuotesResult().getQuote();
        
        request.setAttribute(
"quotesArray", quotesArray);
        
        System.out.println(
" **** Stock quotes updated at: " 
                                                        
+ new Date().toString());
        
        request.getRequestDispatcher(
"/stockQuote/stockQuoteAjax.jsp")
                                                .forward(request, response);

    }
    

    
protected void doGet(HttpServletRequest request, HttpServletResponse response)
    
throws ServletException, IOException {
        processRequest(request, response);
    }

    
protected void doPost(HttpServletRequest request, HttpServletResponse response)
    
throws ServletException, IOException {
        processRequest(request, response);
    }
   
}

代码清单8-15 StockQuoteService.java

package ajaxdashboard.service;

import ajaxdashboard.ws.stockquote.GetQuotes;
import ajaxdashboard.ws.stockquote.GetQuotesResponse;
import ajaxdashboard.ws.stockquote.Quote;
import ajaxdashboard.ws.stockquote.StockQuotesLocator;
import ajaxdashboard.ws.stockquote.StockQuotesSoap;
import javax.xml.rpc.ServiceException;

public class StockQuoteService {

    
public GetQuotesResponse getStockQuotesFor(String ticker) {
        GetQuotes quotes 
= new GetQuotes(ticker);
        GetQuotesResponse quotesResponse 
= null;
        
try {
            quotesResponse 
= getStockQuotesSoap().getStockQuotes(quotes);
        } 
catch(java.rmi.RemoteException ex) {
            
// TODO handle remote exception
        }
        
        Quote[] quotesArray 
= quotesResponse.getGetQuotesResult().getQuote();
        Quote quote 
= null;
        
for(int i = 0; i < quotesArray.length; i++) {
            quote 
= quotesArray[i];
//            System.out.println("Quote for: " + quote.getCompanyName()
//                + " (" + quote.getStockTicker()+ ")"
//                + " Quote:" + quote.getStockQuote()
//                + " LastUpdate:" + quote.getLastUpdated()
//                + " Change:" + quote.getChange());
        }

        
return quotesResponse;
    }

    
private StockQuotesSoap getStockQuotesSoap() {
        StockQuotesSoap stockQuotesSoap 
= null;
        
try {
            stockQuotesSoap 
= new StockQuotesLocator().getStockQuotesSoap();
        } 
catch (ServiceException ex) {
            ex.printStackTrace();
        }
        
return stockQuotesSoap;
    }
}

首先在StockQuoteService中,GetQuotes.java,GetQuotesReponse.java,在天气预报那个WSDL中,生成的类只有6个,但在这个版块中,生成的类有8个,其他的基本一样,但多了上面这两个类,通过GetQuotes取得股票对象,在通过StockQuotesSoap的方法取得GetQuotesReponse对象,在GetQuotesReponse对象中,保存了Quote对象的数组集了,而这个数组集包括了我们想要得到的数据了。

3. 再来看看使用了taconite框架的页面

代码清单8-16 stockQuoteAjax.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ taglib uri="http://taconite.sf.net/tags" prefix="tac" %>

<tac:taconiteRoot>
    
    
<tac:replaceChildren contextNodeID="stockQuoteContent" parseOnServer="true">
        
       
<%@include file="stockQuoteDetail.jsp"%>  
       
    
</tac:replaceChildren>
    
</tac:taconiteRoot>

contextNodeID=" stockQuoteContent" 这个id为stockQuoteContent的DIV在stockQuote.jsp页面的最下面。

替换的内容是stockQuoteDetail.jsp,这是显示股票行情的具体内容的页面。

下一部分新闻搜索版块的说明

http://blog.csdn.net/lin49940/archive/2007/09/11/1780994.aspx

原创粉丝点击