股票案例
我们要做的是股票的案例,它能够无刷新地更新股票的数据。当鼠标移动到具体的股票中,它会显示具体的信息。
我们首先来看一下要做出来的效果:
服务器端分析
首先,从效果图我们可以看见很多股票基本信息:昨天收盘价、今天开盘价、最高价、最低价、当前价格、涨幅。这些信息我们用一个类来描述出来。
我们发现数据是定时刷新的,于是我们需要一个定时器.。
服务器端的数据和客户端交互,我们使用JSON吧
服务器端代码
Stock股票类的代码
- 股票基本信息:
privateStringid;
privateStringname;
privatedoubleyesterday;
privatedoubletoday;
privatedoublehighest;
privatedoublelowest;
privatedoublecurrent;
privateStringrange;
//各种setter和getter
- Stock的构造函数:
/**
* id,name,yesterday这三个参数都是固定的,其他的属性都是可变的。
* 因此我们构造函数就传入这三个值
* */
publicStock(Stringid,Stringname,doubleyesterday){
this.id=id;
this.name=name;
this.yesterday=yesterday;
//把开盘价设定为-1,后面在定时器计算出来的随机数,如果发现开盘价是-1,就设置第一次的随机数为开盘价
this.today=-1;
//把最高、最低、当前的价格都暂且设置成昨天的开盘价,后面我们可以变化的
this.highest=yesterday;
this.current=yesterday;
this.lowest=yesterday;
}
- setCurrent()方法代码:
/**
* 每次设置当前价钱的时候,最高、最低、涨幅都应该随着当前价钱而变化的
*/
publicvoidsetCurrent(doublecurrent){
//计算出涨幅或跌幅
doublerange=(current-this.yesterday)/this.yesterday;
//设置涨幅和跌幅不能超过10%,当前的价格只能是昨天开盘价的1.1倍或0.9倍
//当前价格应该是两位小数
DecimalFormatformatPrice=newDecimalFormat("#.00");
if(range>0.1){
current=Double.parseDouble(formatPrice.format(this.yesterday*1.1));
}
if(range<-0.1){
current=Double.parseDouble(formatPrice.format(this.yesterday*0.9));
}
this.current=current;
//如果今天开盘价没设定,那么就将第一次的当前价作为今天的开盘价
if(this.today==-1){
this.today=this.current;
}
//比较最大值和最小值
if(this.current>this.highest){
this.highest=this.current;
}
if(this.current<this.lowest){
this.lowest=this.current;
}
//格式化涨幅的字符串,整数两位,小数两位
DecimalFormatformatRange=newDecimalFormat("##.##%");
this.range=formatRange.format(range);
}
Servlet的代码
- init()初始化代码:
/**
* 重写init()方法,加入一些配置内容
*/
@Override
publicvoidinit(ServletConfigconfig)throwsServletException{
map=newHashMap<>();
//新建几只固定的股票
finalStockzhong=newStock("1","百度",1110.1);
finalStockfu=newStock("2","阿里",222.2);
finalStockcheng=newStock("3","腾讯",333.3);
finalStockou=newStock("4","谷歌",1133.5);
//添加到容器中
map.put("1",zhong);
map.put("2",fu);
map.put("3",cheng);
map.put("4",ou);
//生成随机数
finalRandomrandom=newRandom();
//格式化生成的随机数
finalDecimalFormatformat=newDecimalFormat("#.00");
//Servlet被启动后1秒开始,每两秒扫描一次
timer=newTimer();
timer.schedule(newTimerTask(){
@Override
publicvoidrun(){
doublebaidu=random.nextDouble()*1.1;
doubleali=random.nextDouble()*2;
doubletengxun=random.nextDouble()*0.3;
doublegeogle=random.nextDouble()*4;
//概率大致都是50%,我们用来做正负
if(random.nextBoolean()){
baidu=0-baidu;
}
if(random.nextBoolean()){
ali=0-ali;
}
if(random.nextBoolean()){
tengxun=0-tengxun;
}
if(random.nextBoolean()){
geogle=0-geogle;
}
//设置它们的当前价格
zhong.setCurrent(Double.parseDouble(format.format(zhong.getCurrent()+baidu)));
fu.setCurrent(Double.parseDouble(format.format(fu.getCurrent()+ali)));
cheng.setCurrent(Double.parseDouble(format.format(cheng.getCurrent()+tengxun)));
ou.setCurrent(Double.parseDouble(format.format(ou.getCurrent()+geogle)));
}
},1000,2000);
}
- 服务器一启动就应该初始化Servlet
<servlet>
<servlet-name>Refresh</servlet-name>
<servlet-class>Refresh</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Refresh</servlet-name>
<url-pattern>/Refresh</url-pattern>
</servlet-mapping>