Java课程设计报告--日常信息查询系统2.docx
目录1第1章课题概述21.1课题的目的21.2课题的要求21.2.1输入输出的要求21. 2.2程序实现的功能要求21.3设备与环境2第2章概要设计32.1整个程序的模块结构及流程32.2各个功能的描述32.2.1天气预报功能32.2.2域名ICP备案查询功能42.2.3快递状态查询功能52.3输入数据合法性的检测及初步处理5第3章程序功能的实现63.1主窗口的实现63.2主要功能模块的实现63.2.1天气预报功能的实现63.2.2域名ICP备案查询的实现103.2.3快递状况查询的实现13第4章调试及发现问题的解决16第5章程序测试及分析17第6章总结19参考文献20第1章课题概述本次JAVA课程设计的题目是设计并实现日常信息查询系统2(天气预报查询、域名ICP备案查询、快递状态查询)。1.1课题的目的天气预报查询、域名ICP备案查询、快递状态查询等是目前日常生活中人们普遍需要查询的内容。通过解析XML或JSON接口文件并将结果显示在图形用户界面上,以便用户获得信息,同时还能加强对java以及各种jar包的学习与使用。1. 2课题的要求1.1.1 输入输出的要求(1)程序运行时会弹出一个对话框,并将可查询内容显示在该对话框的标题栏。(2)查询内容相关信息(如城市名、域名等)通过对话框的文本区输入。(3)获得的结果显示在弹出的新窗口中。1.1.2 程序实现的功能要求(1)用户能够自由输入想要查询的内容。(2)能正确获得XML或JSON接口文件并且正确解析获得相关信息,并将结果显示在图形用户界面中。(3) api接口返还的XML或JSON文件的格式要求以及遍历文件、解析文件的方法。1. 3设备与环境硬件:多媒体计算机。软件:java集成开发环境、操作系统。第2章概要设计1.1 整个程序的模块结构及流程根据课题要求,整个程序按功能可划分为天气预报查询、域名ICP备案查询、快递状况查询。除上述主要功能模块之外,为更好地提供程序的人机交互能力,程序还应提供用户自由输入查询内容的功能。整个程序的模块图2-1所示。图2-1整个程序流程2. 2各个功能的描述2. 2.1天气预报功能用户手动输入想要查询的城市,城市和对应的城市编码在HaShMaP中进行保存。通过yahoo天气的api接口将城市代码输入到url网址中,获得该城市实时天气的XML文档,并将结果保存在DOCUment类中。然后根据XML文档的标签来遍历所有子节点后获得需要的数据,分别将数据保存在NOde类中。将结果按照格式输出在图形用户界面中。图2-2天气预报流程示意图2. 2.2域名ICP备案查询功能用户手动输入想要通过何种方式查询域名ICP,再将相对应的内容输入。url获得网址,将api接口返回的JSON文件作为输入保存在StringBuffer类中解析而不是通过下载。最后通过数组,String类的substring方法将结果输出在图形用户界面中。图2-3域名ICP备案查询流程图2. 2.3快递状态查询功能用户手动输入想要查询的快递公司以及快递单号。Url获得网址,将api接口返回的JSON文件作为输入保存在StringBuffer类中解析而不是通过下载。最后通过数组,String类的substring方法将结果输出在图形用户界面中。图2-41快递状态查询流程图2. 3输入数据合法性的检测及初步处理将用户输入的结构保存在input中,通过input.equals()方法来检测用户输入的数据是否合法,是否包含在可查询范围内。如果不存在或不合法,提醒用户重新输入数据。在每个对话框中,还会提醒用户可输入的内容以及需注意的地方。第3章程序功能的实现2.1 主窗口的实现在主程序all中调用JOPtionPane方法,提示用户输入想要查询的内容。再通过用户输入的内容调用对应的程序的main方法。importjava×.swing.DOptionPane;publicclassallpublicstaticvoidmain(Stringargs)Stringinput=null;input=JOptionPane.s/?ow7“putDia(og("请输入想要查询的内容(天气预报、域名ICP备案查询、快递状况查询)");if(input.equals("天气预报”)WeatherForecast.nin(null);elseif(input.equals(”域名ICP备案查询”)ICP.mn(null);)elseif(input.equals("快递状况查询”)EXPreSSSearCh勿null);elseinput=JOptionPanes/?ow7“putDia(og("请重新输入想要查询的内容(天气预报、域名ICP备案查询、快递状况查询)");3. 2主要功能模块的实现3. 2.1天气预报功能的实现天气预报功能首先通过提示框获取用户输入的城市名,定义dictionarystrings将天气情况存入,再定义HashMap类将城市与对应的城市编码以键值对的形式存在HaShMaP中。通过城市名获得对应编码,将编码及api接口网址输入到Url中,并返回一个URLConnection对象,将获得的XML文件通过URLConnection的getlnputStream方法保存在DOCUment中。建立DocumentBuIiderFactory来解析获得的XML文件。定义一个NodeList通过标签名channel来遍历获得的XML文件,运用NamedNOdeMaP来通过名称访问节点的集合,获得日期、最高温、最低温、天气情况等。将结果显示在图形用户界面中。天气预报功能实现的代码如下:importjava.io.IOException;importjava.io.InputStream;.URL;.URLConnection;importjava.util.HashMap;importjava.util.Map;importjavax.swing.JFrame;importjavax.swingJOptionPane;importjavax.swingJTextArea;importjava×.xml.parsers.DocumentBuiIder;importjavax.xml.parsers.DocumentBuiIderFactory;importorg.w3c.dom.Document;importorg.w3c.dom.NamedNodeMap;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;classGetWeatherInfoprivatefinalStringdictionarystrings=“龙卷风,”热带风暴,”飓风”,”强雷阵雨”,”雷阵雨“,”小雨加雪,”雨加冰雹,“雪加冰雹",“冰雨,“毛毛雨”/冻雨”,”阵雨,“阵雨”,”小雪,"零星小雪,”高吹雪“,“雪“冰雹“,“雨夹雪“,“尘”,“雾,“薄雾”多烟的“,”大风,”有风”,“寒冷”/阴天,”夜间阴天,”白天阴天,”夜间多云,”白天多云“J夜间清亮”,“晴朗,”转晴,“转晴”,“雨夹冰雹,“热,“雷阵雨”,“雷阵雨,“雷阵雨,“雷阵雨”J大雪”,”阵雪,“大雪”,哆云'7'雷,"阵雪,“雷雨”);publicGetWeatherInfoOCitys();)/*初始化城市代号*/publicstaticMap<String,String>CityCode=newHashMap<StringzString>();staticvoidCitys()cityCode.put(""z"0008");CityCode.put("天津","0133");CityCode.put(,武汉,"0138");CityCOde.put(“杭州“,“0044”);CityCOde.put(“合肥“,“0448”);cityCode.put("±S,"0116");CityeOde.put("福州,“0031”);CityCOde.put(“重庆","0017");cityCode.put("ffi"z"0097");cityCode.put(")","0049");cityCode.put("Fj"z',0064");cityCode.put("11"z"0512");CityCode.put("郑州,”0165");CityCOde.put(“呼和浩特”,“0249");CityCode.put(呜鲁木齐”,“0135");CityCode.put(“长沙,”0013");CityCode.put(“银川,“0259”);cityCode.put("M'',"0037");cityCode.put("½"z',0080");CityCOde.put(“海口,“0502");cityCode.put(""z"0100");CityCode.put("成都,“0016”);CityCode.put(“石家庄,”0122");cityCode.put(,0","0039");CityCode.put(“太原,”0129。;CityCode.put("昆明,“0076”);cityCode.put("JtH"z"0119");cityCode.put('三","0141");CityCOde.put("长春","0010");CityCode.put("兰州,“0079”);CityCOde.put(“西宁”,”0236");)privateDocumentgetWeatherXML(StringcityCode)throwsIOExceptionURLurl=newURL("+cityCode+"&u=c");URLConnectionconnection=url.openConnection();DocumentDoc=stringToElement(connection.getlnputStream();returnDoc;)*获取天气信息*/publicStringgetWeather(Stringcity)Stringresult=null;try(Documentdoc=getWeatherXML(GetWeatherlnfo.cityCode.get(city);NodeListnodeList=doc.getElementsByTagName("channel");for(inti=0;i<nodeList.getLength();i+)Nodenode=nodeList.item(i);NodeListnodeListl=node.getChildNodes();for(intj=0;j<nodeListl.getLength();j+)Nodenodel=nodeListl.item(j);if(nodel.getNodeName().equalslgnoreCase("item")NodeListnodeList2=nodel.getChildNodes();for(intk=0;k<nodeList2.getLength();k+)Nodenode2=nodeList2.item(k);if(node2.getNodeName().equalslgnoreCase("yweather:forecast")NamedNodeMapnodeMap=node2.getAttributes();NodeIowNode=nodeMap.getNamedltem("low");NodehighNode=nodeMap.getNamedltem("high");NodeCodeNode=nodeMap.getNamedltem("code");NodedateNode=nodeMap.getNamedltem("date");Stringday=dateNode.getNodeValue();if(result=null)result=",'elseday=dateNode.getNodeValue();)result=result+day+IlIl+dictionaryStringslnteger.parselnt(codeNode.getNodeValue()+"t最低温度:”+IowNode.getNodeValue()+“t最高温度:"+highNode.getNodeValue()+"n")catch(Exceptione)e.printStackTrace();)returnresult;)publicDocumentstringToElement(lnputStreaminput)try(DocumentBuiIderdb=DocumentBuilderFactorymewInstanceO.newDocumentBuilder();Documentdoc=db.parse(input);returndoc;catch(Exceptione)returnnull;)publicclassWeatherForecastpublicstaticvoidmain(Stringarg)JFramejf=newJFrame(“天气预报”);jf.addWindowListener(newjava.awt.event.WindowAdapter()publicvoidWindowCIosingfjava.awt.event.WindowEventevt)System.e×it(O););Stringinput;input=JOptionPane.showlnputDialog("请输入城市”);GetWeatherInfoinfo=newGetWeatherInfoO;Stringweather=info.getWeather(input);JTextAreajta=newJTextArea();jta.setText(weather);jf.add(jta);jf.pack();jf.setVisible(true);)3.2.2域名ICP备案查询的实现域名ICP备案查询功能首先通过用户输入的查询类型(域名、网站首页等)以及信息后建立URL连接,并将网页返回的JSON数据经过直接解析后保存(将字节解码为字符)。将解析后的数据进行处理后输出在图形用户界面中。域名ICP备案查询功能的代码实现如下:importjava.io.InputStreamReader;.HttpURLConnection;.URL;importjava.util.Scanner;importjavax.swing.3Frame;importjava×.swing.DOptionPane;importjavax.swing.JTextArea;importnet.sf.json.DSONObject;publicclassICPpublicstaticJSONObjectgetHtmlJSonByUrl(StringurlTemp)URLurl=null;InputStreamReaderinput=null;HttpURLConnectionconn;DSONObjectjsonObj=null;tryurl=newURL(urlTemp);conn=(HttpURLConnection)url.OpenConnection();input=newInPUtStreamReader(COnn.getlnpUtStream(),"utf8");字节解码为字符ScannerinputStream=newScanner(input);StringBuffersb=newStringBUffer();while(inputstream.hasNext()sb.append(inputstream.nextLine();jsonObj=JSONObject.fromObject(sb.toString();catch(Exceptione)System.out.printin(e.getMessage();returnjsonObj;publicstaticvoidmain(Stringargs)finalStringkey="cef5c87064b3436ece77cd5070daf50d;StringBufferstb=newStringBuffer(m");inttype=0;Stringinputjinputlnfo=nulljkeyword;input=JOptionPane.s/?。W7“PUtDiaLog(”请输入查询类型(域名、网站首页、许可证号、主办单位、工商营业执照)");if(input.equals(“域名”)type=l;inputInfO=JOptionPane.s/?。W工即UtDiaLog("请输入信息");elseif(input.equals("网站首页”)type=2;inputInfO=JOptionPane"请输入信息");elseif(input.equals(“许可证号”)type=3;inputInfO=DOptionPane.s/?ow7“putDia(og("请输入信息”);elseif(input.equals("主办单位")type=5;inputInfO=DOptionPane.s/?ow7"putDiaLog("请输入信息”);elseif(input.equals("工商营业执照”)type=7;inputInfO=DOptionPane.s/?ow7“putDia(og("请输入信息");else(DOptionPane.ShoMMessageDiaLog(null”请输入正确查询类型”);input=J0ptionPanes/?ow7“putDia(og("请输入查询类型(网站名称、域名、网站首页、许可证号、主办单位、工商营业执照)");keyword=inputlnfo;Stringurl="DSONObjectjsonObject=ICP.getHtmLJSonByUrL(url);Stringstr=jsonObject.get(,result,).toString();Str=Strsubstring(2,str.length()-2);Stringarr=str.split(m,);DFramejf=newJFrame(”域名ICP备案查询“);jf.addWindowListener(newjava.awt.event.WindowAdapterOpublicvoidwindovClosing(java.awt.event.WindowEventevt)System.ext(0););for(inti=0;i<arr.length;i+)Stringarrl=arri.split(n:n);arrl0=arrl0.substring(ljarrl0.length()-1);arrll=arrll.substring(1,arrll.length()-1);stb.append(arrl0+"i,+arrll+,n");JTextAreajta=newJTeXtArea();jta.setTe×t(stb.toString();jf.add(jta);jf.pack();jf.SetVisible(true);3.2.3快递状况查询的实现快递状况查询功能首先通过用户输入的快递公司以及快递单号后建立URL连接,并将网页返回的JSON数据经过直接解析后保存(将字节解码为字符)。将解析后的数据进行处理后输出在图形用户界面中。快递状况查询功能实现的代码如下:importjavc,ioBUfferedReadrr;importjava.io.IOException;importjava.io.InputStream;importjava,io.InputStreamReader;importjava,ioPrintStream;import.HttpURLConnection;import.URL;importjava.util.Map;importjava.util.Scanner;importjava.util.HashMap;importjava,Util.Iterator;importjava.util.Set;importjava×.swing.JFrame;importjava×.swing.DOptionPane;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.SWin日textDOCUment;importnet.sf,jSOn.JSONArray;importnet.sf.json.JSONObject;publicclassExpressSearchpublicstaticJSONObjectgetHtml3SonByUrl(StringurlTemp)URLurl=null;InputStreamReaderinput=null;HttpURLConnectionconn;JSONObjectjsonObj=null;tryurl=newURL(urlTemp);conn=(HttpURLConnection)url.OpenConnection();input=newInputStreamReader(conn.getlnputstream()j"utf-8);ScannerinputStream=newScanner(input);StringBuffersb=newStringBuffer();while(inputstream.hasNe×t()sb.append(inputstream.ne×tLine();jsonObj=DSONObject.from0bject(sboString();catch(Exceptione)System.out.printin(e.getMessage();returnjsonObj;staticclassGetExpressInfopublicfinalstaticMaP<String,String>e×pCode=newHaShMaP<String,String>();staticMaP<String,Stringmap=newHaShMaPString,String");publicstaticvoidExpresses()expCode.put(“顺丰二"sf");expCode.put(“申通:"sto");e×pCode.PUt("韵达","yd");expCode.put(“圆通"yt");expCode.put("EMS,j"ems");expCode.put(“中通:"zt");expCode.put("7匚通"ht");expCode.put(“全峰'"qf");expCode.put(“天天”,',tt");publicstaticvoidnewMap()加叩.PUt(“申通申通单号由12位数字组成,常见以268*、368*、58*5开头”);mpput("EMS”,,EMS单号开头和结尾2位是字母,中间是9位数字”);加p.put(“顺丰“,“顺丰单号由12位数字组成,常以电话区号后3位开头”);加pput(“圆通L”圆通单号由10位字母数字组成,常见以1*、2*、6*、8*及V*等开头”);加pput(“韵达二”韵达单号由13位数字组成,常见以10*、12*、19*等开头”);publicstaticvoidmain(Stringargs)finalStringkeyl=dd7cl52flc97ccda3ac7c05af3eb254a"DFramejf=newJFranle(“快递查询”);jf.addWindowListener(newjava.awt.event.WindowAdapterOpublicvoidwindowclosing(java.awt.event.WindowEventevt)System.ext(0););GetEXPreSSlnfo.r)ewMp();GetExpressInfo.Expresses();Stringinput,com,numjinputl;input=JOPtionPanes/?ow7"putDiaLog("请输入快递公司”);Set<String>mapSet=GetExpressInfo.expCode.keyset();/map的键的值取出while(!mapSet.contains(input)input=JOPtiOnPane.show工叩UtDiGLog("请输入快递公司“);Com=GetExpressInfo.expCode.get(input);inputl=JOPtiOnPane.s/?。W7“PUtDiaLog(“请输入快递单号m+("+GetExpressInfo.map.get(input)+")");num=inputl;Stringurl=,expindexPkey=',+keyl+,'com=,+com+*,Sno="+num;JSONObjectjsonObject=ExpressSearch.getHtmLJsonByUrL(url);Stringresult=jsonObject.get("result,).toString();JTextAreajta=newJTeXtArea();jta.setTe×t(result);jf.add(jta);jf.pack();jf.SetVisible(true);第4章调试及发现问题的解决虽然在程序的编写过程中遇到了很多问题,但是通过上网查阅相关资料,与其它同学讨论,询问指导老师等方式,最终都一一解决了,程序实现及调试过程中遇到的主要问题及解决方法如下。1、XML文件的遍历如何解决?解决方法:通过NoCIeLiSt接口提供对节点的有序集合,通过channel来获得元素。通过for循环i只要小于nodelist的芒度,就返回集合中第i个项,定义下一个nodelistl来获得nodelist的子节点。然后再通过node接口的getNodeName方法获得此节点的名称,进行比对,逐步遍历文件,直至获得想要的结果。2、如何解析JSoN文件?解决方法:定义URL、HttpURLConnectionJSoNobjeCt等,通过URL建立连接,然后用InPUtStreamReader获得输入流,通过Utf-8将字节转码为字符。用SCanner方法定义一个输入,输入的值为InPUtStreamReader所获得输入流。并遍历所输入的值,最后在StringBUffer的Sb后接上输入流。3、域名ICP查询的结果如何排列?解决方法:先定义一个String类型的str,将获得的结果转化为String类型,利用SUbString方法将结果中的大括号、中括号去掉。然后定义一个数组arr,将利用SPIit方法通过逗号切开后的值传给arr数组。再利用for循环,将an数组用split方法以冒号切开后保存在arrl数组中。接着将arrl数组中的第0号单元调用SUbString方法去掉大括号,同样处理arH数组中的第1号单元。最后,用append方法将all接在al0后。第5章程序测试及分析运行程序,弹出输入框,显示想要查询的内容,要求用户输入。图5-1至5-3为天气预报查询:图5-1天气预报查询图5-2天气预报城市输入界面IOJuI 2015晴朗最低温度:23*C最高温度:34t11 Jul 2015转晴最低温度:23C最高温度:3TC12 Jul 2015晴朗最低温度:24'C最高温度:38*C13 Jul 2015转晴最低温度:25*0最高温度:39*C14 Jul 2015转晴最低温度:23t最高温度:38*C图5-3天气预报结果图5-4至5-7为域名ICP备案查询图5-4域名ICP备案查询图5-5域名ICP查询类型图5-6域名输入域名ICP备案查询expired:alsIiCenSe京ICP证030173号-1name:百度time:2015-06-12type企业UItWWW图5-7域名ICP备案查询结果第6章总结这次的JAVA课程设计,自己也写了三百多条代码,对JaVa又有了一定地深入了解,这次我选的题目是日常信息查询系统2,涉及的编程知识不是太多,主要的就是在XML/JSON文件的解析,虽然之前并不懂这个模块,但在仔细看了发的几个视频后,基本能了解大致的内容,但在很多地方有许多问题,比如并不知道某几行代码的意思,但只要按照视频所给的样例代码一样写上去就没错,并且能得出结果,之后也在百度查询了相应的意思、,虽然能知道在文字上的大概意思,但其实并不知道真正的意思,只能按照别人写的方式来进行编程。这样我并不能具有很强的编程能力,只能跟在别人的后面,别人做什么,我也做什么,所以此次对自己十分的不满意,并不能真正的理解并运用这次的XML解析。也知道了下次必须先要理解其相应的意思,然后按照自己的思路一步一步的做下去,虽然可能遇到很多的困难,但还是相信会成功的实现出结果的。经过这次课程设计,知道了自己许多的不足,APl文档十分不熟悉,图形界面相应的代码对需要在书上查询才能解决,说明自己的基础不是太好,要多看看相应的程序代码和API里各个类的解释。参考文献1董小圆,编著,java面向对象程序设计,清华大学出版社,20112张化祥,陆晶,编著,java程序设计,清华大学出版社,20103依维恩著.王春楠,刘永金翻译.XML高级编程.北京:清华大学出版社,2009.24张银鹤等编著.XML实践教程.北京:清华大学出版社.2007.8