/*
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<jsp:useBean id="priceFetcher" class="com.java2s.StockPriceBean" />
<html>
<head><title>Price Fetch</title></head>
<body>
<c:choose>
<c:when test="${empty param.symbol}">
<h2>Please submit a valid stock symbol</h2>
<form method="POST" action ='<c:out value="${pageContext.request.contextPath}" />/priceFetch.jsp'>
<table border="0"><tr><td valign="top">
Stock symbol: </td> <td valign="top"><input type="text" name="symbol" size="10"></td></tr><tr><td valign="top"><input type="submit" value="Submit Info"></td></tr></table></form>
</c:when>
<c:otherwise>
<h2>Here is the latest value of <c:out value="${param.symbol}" /></h2>
<jsp:setProperty name="priceFetcher" property="symbol" value="<%= request.getParameter(\"symbol\") %>" />
<jsp:getProperty name="priceFetcher" property="latestPrice"/>
</c:otherwise>
</c:choose>
</body>
</html>
*/
package com.java2s;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.MalformedURLException;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.parser.ParserDelegator;
public class StockPriceBean {
/**
* The URL base for requesting a stock price; it looks like
* "http://finance.yahoo.com/q?d=t&s="
*/
private static final String urlBase = "http://finance.yahoo.com/q?d=t&s=";
/**
* The character stream of HTML that is parsed for the stock price
* returned by java.net.URL.openStream()
*
* see java.net.URL
* @see java.io.BufferedReader
*/
private BufferedReader webPageStream = null;
/**
* The java.net.URL object that represents the stock Web page
*
*/
private URL stockSite = null;
/**
* The ParserDelegator object for which ParserDelegator.parse() is
* called for the Web page
*
* @see javax.swing.text.html.parser.ParserDelegator
*/
private ParserDelegator htmlParser = null;
/**
* The MyParserCallback object (inner class); this object is an
* argument to the ParserDelegator.parse() method
*
* @see javax.swing.text.html.HTMLEditorKit.ParserCallback
*/
private MyParserCallback callback = null;
/**
* This String holds the HTML text as the Web page is parsed.
*
* @see MyParserCallback
*/
private String htmlText = "";
private String symbol = "";
private float stockVal = 0f;
//A JavaBean has to have a no-args constructor (we explicitly show this
//constructor as a reminder; the compiler would have generated a default
//constructor with no arguments automatically
public StockPriceBean() {}
//Setter or mutator method for the stock symbol
public void setSymbol(String symbol){
this.symbol = symbol;
}
class MyParserCallback extends ParserCallback {
//bread crumbs that lead us to the stock price
private boolean lastTradeFlag = false;
private boolean boldFlag = false;
public MyParserCallback(){
//Reset the enclosing class' instance variable
if (stockVal != 0)
stockVal = 0f;
}
public void handleStartTag(javax.swing.text.html.HTML.Tag t,
MutableAttributeSet a,int pos) {
if (lastTradeFlag && (t == javax.swing.text.html.HTML.Tag.B )){
boldFlag = true;
}
}//handleStartTag
public void handleText(char[] data,int pos){
htmlText = new String(data);
//System.out.println(htmlText);
if (htmlText.indexOf("No such ticker symbol.") != -1){
throw new IllegalStateException(
"Invalid ticker symbol in handleText() method.");
} else if (htmlText.equals("Last Trade:")){
lastTradeFlag = true;
} else if (boldFlag){
try{
stockVal = new Float(htmlText).floatValue();
} catch (NumberFormatException ne) {
try{
// tease out any commas in the number using
//NumberFormat
java.text.NumberFormat nf = java.text.NumberFormat.
getInstance();
Double f = (Double) nf.parse(htmlText);
stockVal = (float) f.doubleValue();
} catch (java.text.ParseException pe){
throw new IllegalStateException(
"The extracted text " + htmlText +
" cannot be parsed as a number!");
}//try
}//try
lastTradeFlag = false;
boldFlag = false;
}//if
} //handleText
}//MyParserCallback
public float getLatestPrice() throws IOException,MalformedURLException {
stockSite = new URL(urlBase + symbol);
webPageStream = new BufferedReader(new InputStreamReader(stockSite.
openStream()));
htmlParser = new ParserDelegator();
callback = new MyParserCallback();//ParserCallback
synchronized(htmlParser){
htmlParser.parse(webPageStream,callback,true);
}//synchronized
//reset symbol
symbol = "";
return stockVal;
}//getLatestPrice
}//StockPriceBean
|