当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » Java  » Web编程
分享到: 
收藏 +0
3
采用struts2,spring,hibernate,fastjson。使用请下载最新版本的jar包。还运用了javamail,timer
用的大刀,主要是为了练习下。
主要功能:输入价格,如京东商城价格低于此数值时,将发送邮件到您的邮箱。经验证已成功。
缺点:查询运行在内存中,服务器重启得重新添加,可解决。手机发送短信没接口(要收费),所以没做成。还有部分BUG没解决。

代码片段(6) [全屏查看所有代码]

1. [代码]jar包没上传,请自行上传     跳至 [1] [2] [3] [4] [全屏预览]

package cn.jie.action;

import java.util.Date;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import cn.jie.domain.Jd;
import cn.jie.exception.GetPriceException;
import cn.jie.exception.UrlException;
import cn.jie.service.JdService;
import cn.jie.util.GetPrice;
import cn.jie.util.ParseUrl;
import cn.jie.util.SendEmail;
import cn.jie.util.TimerUtil;

import com.opensymphony.xwork2.ActionSupport;
@Controller("price")
@Scope(value="prototype")
public class Price extends ActionSupport{
	
	@Resource(name="jdService")
	private JdService jdService;
	private static final long serialVersionUID = -2040796566271212218L;
	private Jd jd;
	private String message;
	
	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public Jd getJd() {
		return jd;
	}

	public void setJd(Jd jd) {
		this.jd = jd;
	}

	public String execute(){
		return "index";
	}
	
	public String find(){
		/**
		 * 保存在数据库中
		 */
		if(jd==null){
			return "input";
		}
		jd.setAddtime(new Date().toLocaleString());
		jdService.save(jd);
		try {
			/**
			 * 获得网页提交的URL,并解析商品ID
			 */
			String query = ParseUrl.parseURL(jd.getUrl());
			/**
			 * 获得JSON返回来的价格
			 */
			Integer jsonPrice = GetPrice.getPrice(query);
			
			/**
			 * 比较价格
			 */
			if(jsonPrice<=jd.getPrice()){
				/**
				 * 发送邮件
				 */
				System.out.println("input price:"+jd.getPrice());
				System.out.println("json price:"+jsonPrice);
				SendEmail sendEmail = new SendEmail(jd.getEmail(), jd.getUrl(), jd.getPrice());
				sendEmail.run();
			}else{
				/**
				 * 启动定时器,通过网页上的time来定时获得价格
				 */
				TimerUtil timer = new TimerUtil(jd.getEmail(),jd.getUrl(),jd.getPrice(),jd.getTime());
				timer.start();
			}
			
		} catch (UrlException e) {
			message = "您输入的URL有误!格式为:http://item.jd.com/981821.html";
			return "input";
		}catch(GetPriceException e){
			e.printStackTrace();
			message = "本站从京东商城获得数据失败,请联系QQ:454207171";
			return "input";
		}
		
		return "success";
	}
}

2. [代码]解析URL     跳至 [1] [2] [3] [4] [全屏预览]

package cn.jie.util;

import java.util.regex.Pattern;

import cn.jie.exception.UrlException;

/**
 * 解析网页提交的URL
 * @param desUrl
 * @throws Exception 
 */
public class ParseUrl {

	public static String parseURL(String desUrl) throws UrlException{
		boolean ismatch = Pattern.matches("^http://item.jd.com/\\d{6,12}.html",new StringBuilder(desUrl) );
		if(ismatch){
			/**
			 * 通过com/和.html获得提交的商品ID数字。
			 */
			return desUrl.substring(desUrl.indexOf("com/")+4, desUrl.indexOf(".html"));
		}else{
			throw new UrlException("输入网址不正确");
		}
	}
}

3. [代码]通过接口获得价格     跳至 [1] [2] [3] [4] [全屏预览]

package cn.jie.util;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import cn.jie.domain.JdJson;
import cn.jie.exception.GetPriceException;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
/**
 * 通过接口获得价格
 * @return
 * @throws IOException 
 */
public class GetPrice {

	public static int getPrice(String query) throws GetPriceException{
		JdJson jdJson;
		try{
			/**
			 * 构建queryURL,通过京东的接口查询价格
			 */
			String queryURL = "http://p.3.cn/prices/mgets?skuIds=J_"+query+"&type=1";
			
			/**
			 * 通过URL,获得返回来的JSON
			 */
			URL url =  new URL(queryURL);
			URLConnection conn = url.openConnection();
			InputStream ins = conn.getInputStream();
			StringBuilder json = new StringBuilder();
			int temp =0;
			while((temp=ins.read())!=-1 ){
				json.append((char)temp);
			}
			
			/**
			 * 解析出价格,返回是数组,所以用JSONArray来解析,得到0就是
			 */
			JSONArray array = JSON.parseArray(json.toString());
			jdJson = JSON.parseObject(array.get(0).toString(),JdJson.class);
		}catch(Exception e){
			throw new GetPriceException("本站从京东商城获得数据失败,请联系QQ:454207171");
		}
		return (int) jdJson.getP();
	}
}

4. [代码]邮件定时发送工具     跳至 [1] [2] [3] [4] [全屏预览]

package cn.jie.util;

import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import cn.jie.exception.GetPriceException;
import cn.jie.exception.UrlException;

/**
 * 邮件定时发送工具
 * @author Administrator
 *
 */
public class TimerUtil {
	private String url;
	private int time;
	private int price;
	private String email;
	private SendEmail sendEmail;
	private String query;
	
	/**
	 * 初始化
	 * @param email
	 * @param url
	 * @param price
	 * @param time
	 * @param jsonPrice 
	 */
	public TimerUtil(String email, String url, int price, int time) {
		this.email=email;
		this.url=url;
		this.price=price;
		this.time=time;
	}

	public void start() throws GetPriceException, UrlException{
		/**
		 * 获得要查询的6-11位数商品编码
		 */
		query = ParseUrl.parseURL(url);
		/**
		 * 得到毫秒值
		 */
		Long milTime = Long.parseLong(Integer.toString(time))*1000;	//timer执行的是毫秒,所以要转换
		
		/**
		 * 创建定时器,schedule(TimerTask task, long delay, long period) 
          			安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
		 */
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			
			@Override
			public void run() {
				int jsonPrice = 0;
					try {
						jsonPrice = GetPrice.getPrice(query);
					} catch (GetPriceException e) {
						try {
							throw new GetPriceException();
						} catch (GetPriceException e1) {
							e1.printStackTrace();
						}
					}
					/**
					 * 如果达到条件,发送邮件
					 */
					System.out.println("input price:"+price);
					System.out.println("json price:"+jsonPrice);
				if(jsonPrice<=price){
					sendEmail=new SendEmail(email, url, price);
					sendEmail.run();
					/**
					 * 取消任务,否则会一直发送邮件!
					 */
					this.cancel();
				}
			}
		}, 0L ,milTime);
	}
}

5. [图片] QQ图片20140319130553.jpg    

6. [文件] jd.zip ~ 144KB     下载(416)     [全屏预览]



开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(39)

  • 1楼:meansoft 发表于 2014-03-19 14:00 回复此评论
    小巧,挺实用的东西~~
  • 2楼:云想衣裳花想容 发表于 2014-03-19 14:12 回复此评论

    这种东西还是用vb的mswinsck.ocx 控件来做比较稳定速度快...用那么多框架干什么..

  • 3楼:杰仪 发表于 2014-03-19 14:36 回复此评论

    引用来自“Edsondi”的评论

    这种东西还是用vb的mswinsck.ocx 控件来做比较稳定速度快...用那么多框架干什么..

    练习用的。。。。
  • 4楼:云想衣裳花想容 发表于 2014-03-19 14:43 回复此评论

    引用来自“陈杰的人”的评论

    引用来自“Edsondi”的评论

    这种东西还是用vb的mswinsck.ocx 控件来做比较稳定速度快...用那么多框架干什么..

    练习用的。。。。
    语言不是问题,关键是实用,想从事数据挖掘的工作还是多看书法,看看vc,vb 写成dll在用java做web服务调用,速度和美感都出来了。
  • 5楼:杰仪 发表于 2014-03-19 14:46 回复此评论

    引用来自“Edsondi”的评论

    引用来自“陈杰的人”的评论

    引用来自“Edsondi”的评论

    这种东西还是用vb的mswinsck.ocx 控件来做比较稳定速度快...用那么多框架干什么..

    练习用的。。。。
    语言不是问题,关键是实用,想从事数据挖掘的工作还是多看书法,看看vc,vb 写成dll在用java做web服务调用,速度和美感都出来了。
    对头
  • 6楼:梅开源 发表于 2014-03-19 16:13 回复此评论
    你不早做出来,联想平板电脑抢完了都。
  • 7楼:杰仪 发表于 2014-03-20 09:34 回复此评论

    引用来自“梅开源”的评论

    你不早做出来,联想平板电脑抢完了都。
    多早就做出来了,昨天才放出来
  • 8楼:一条大河波浪宽 发表于 2014-03-20 09:46 回复此评论

    引用来自“Edsondi”的评论

    引用来自“陈杰的人”的评论

    引用来自“Edsondi”的评论

    这种东西还是用vb的mswinsck.ocx 控件来做比较稳定速度快...用那么多框架干什么..

    练习用的。。。。
    语言不是问题,关键是实用,想从事数据挖掘的工作还是多看书法,看看vc,vb 写成dll在用java做web服务调用,速度和美感都出来了。
    额,还得写VC或者VB啊??搞数据挖掘都需要这样吗?
  • 9楼:Super_hello 发表于 2014-03-20 15:30 回复此评论
    死活是没运行出来
  • 10楼:杰仪 发表于 2014-03-20 22:24 回复此评论

    引用来自“lizhiwei5”的评论

    死活是没运行出来
    可以的。要下载最新的jar包
  • 11楼:Super_hello 发表于 2014-03-21 08:39 回复此评论
    我用的就是ssh综合jar去单独下载然后综合使用?
  • 12楼:杰仪 发表于 2014-03-21 11:18 回复此评论

    引用来自“lizhiwei5”的评论

    我用的就是ssh综合jar去单独下载然后综合使用?
    恩。运行中看还差什么jar包不
  • 13楼:Super_hello 发表于 2014-03-21 12:46 回复此评论

    引用来自“陈杰的人”的评论

    引用来自“lizhiwei5”的评论

    我用的就是ssh综合jar去单独下载然后综合使用?
    恩。运行中看还差什么jar包不
    好吧 我试试
  • 14楼:shine_su_we 发表于 2014-03-21 14:32 回复此评论
    http://p.3.cn/prices/mgets?skuIds=J_"+query+"&type=1 这个接口是谁提供的 京东?
  • 15楼:杰仪 发表于 2014-03-21 17:42 回复此评论

    引用来自“shine_su_we”的评论

    http://p.3.cn/prices/mgets?skuIds=J_"+query+"&type=1 这个接口是谁提供的 京东?
    对。京东的。
  • 16楼:温作以 发表于 2014-03-21 18:07 回复此评论

    引用来自“shine_su_we”的评论

    http://p.3.cn/prices/mgets?skuIds=J_"+query+"&type=1 这个接口是谁提供的 京东?
    我也想问这个问题 哈哈
  • 17楼:Contac 发表于 2014-03-21 20:20 回复此评论
    3.cn 好牛逼的域名
  • 18楼:西西爱OS 发表于 2014-03-23 14:35 回复此评论
    嘛呀这个域名好几百万啊 逍遥网
  • 19楼:废柴大叔 发表于 2014-03-24 09:18 回复此评论
    此接口已被 bejson.com 收藏,感谢撸主
  • 20楼:江南红衣 发表于 2014-03-24 09:57 回复此评论
    能不能取到商品标题