JSP天气预报servlet版

题外话:
本程序利用网络上发布的公共webservice endpoint

www.webxml.com.cn/WebServices/WeatherWebService.asmx


大致步骤是
1  利用soap向webservice endpoint进行请求,取回请求结果
2  把结果显示在web界面上,web界面采用Java+Jsp(呵呵,有点丑陋,篇幅所迫)
好,废话少说,直接进入核心程序讲解。

一  WeatherReport类  
    方法 1  构造soap请求(请求格式请见上面的链接),用用户输入的城市名称镶在此请求里面

java 代码


/** */ /**   
     * 获取SOAP的请求头,并替换其中的标志符号为用户输入的城市   
     *    
     * 编写者:王景辉   
     *    
     * 
@param city   
     *            用户输入的城市名称   
     * 
@return 客户将要发送给服务器的SOAP请求   
     
*/
   
    
private   static  String getSoapRequest(String city)  {    
        StringBuilder sb 
= new StringBuilder();    
        sb    
                .append(
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"   
                        
+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "   
                        + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "   
                        + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"   
                        + "<soap:Body>    <getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"   
                        + "<theCityName>" + city    
                        
+ "</theCityName>    </getWeatherbyCityName>"   
                        
+ "</soap:Body></soap:Envelope>");    
        
return sb.toString();    
    }
   


方法 2  向endpoint发送上述SOAP请求,并设置一些请求属性,返回一个服务器端的InputStream(XML文档流)

java 代码



/** */ /**   
     * 用户把SOAP请求发送给服务器端,并返回服务器点返回的输入流   
     *    
     * 编写者:王景辉   
     *    
     * 
@param city   
     *            用户输入的城市名称   
     * 
@return 服务器端返回的输入流,供客户端读取   
     * 
@throws Exception   
     
*/
   
    
private   static  InputStream getSoapInputStream(String city)  throws  Exception  {    
        
try {    
            String soap 
= getSoapRequest(city);    
            
if (soap == null{    
                
return null;    
            }
    
            URL url 
= new URL(    
                    
"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");    
            URLConnection conn 
= url.openConnection();    
            conn.setUseCaches(
false);    
            conn.setDoInput(
true);    
            conn.setDoOutput(
true);    
   
            conn.setRequestProperty(
"Content-Length", Integer.toString(soap    
                    .length()));    
            conn.setRequestProperty(
"Content-Type""text/xml; charset=utf-8");    
            conn.setRequestProperty(
"SOAPAction",    
                    
"http://WebXml.com.cn/getWeatherbyCityName");    
   
            OutputStream os 
= conn.getOutputStream();    
            OutputStreamWriter osw 
= new OutputStreamWriter(os, "utf-8");    
            osw.write(soap);    
            osw.flush();    
            osw.close();    
   
            InputStream is 
= conn.getInputStream();    
            
return is;    
        }
 catch (Exception e) {    
            e.printStackTrace();    
            
return null;    
        }
    
    }
   


方法 3  解析方法2返回的XML文档流,并用特定的符号分隔,以便我们在Jsp页面进行结果分析

java 代码






/** */ /**   
     * 对服务器端返回的XML进行解析   
     *    
     * 编写者:王景辉   
     *    
     * 
@param city   
     *            用户输入的城市名称   
     * 
@return 字符串 用,分割   
     
*/
   
    
public   static  String getWeather(String city)  {    
        
try {    
            Document doc;    
            DocumentBuilderFactory dbf 
= DocumentBuilderFactory.newInstance();    
            dbf.setNamespaceAware(
true);    
            DocumentBuilder db 
= dbf.newDocumentBuilder();    
            InputStream is 
= getSoapInputStream(city);    
            doc 
= db.parse(is);    
            NodeList nl 
= doc.getElementsByTagName("string");    
            StringBuffer sb 
= new StringBuffer();    
            
for (int count = 0; count < nl.getLength(); count++{    
                Node n 
= nl.item(count);    
                
if(n.getFirstChild().getNodeValue().equals("查询结果为空!")) {    
                    sb 
= new StringBuffer("#") ;    
                    
break ;    
                }
    
                sb.append(n.getFirstChild().getNodeValue() 
+ "#\n");    
            }
    
            is.close();    
            
return sb.toString();    
        }
 catch (Exception e) {    
            e.printStackTrace();    
            
return null;    
        }
    
    }
   


二   weatherInfo.jsp页面

     

<% @ page language="java" pageEncoding="UTF-8" %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
  
< head >
    
    
< title > 城市天气信息 </ title >
    
< meta  http-equiv ="pragma"  content ="no-cache" >
    
< meta  http-equiv ="cache-control"  content ="no-cache" >
    
< meta  http-equiv ="expires"  content ="0" >     
    
< meta  http-equiv ="keywords"  content ="keyword1,keyword2,keyword3" >
    
< meta  http-equiv ="description"  content ="This is my page" >
    
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    
-->

  
</ head >
  
  
< body >
    
<%  
    
String info = (String) request.getAttribute("info") ; 
    
    
if(info.equals("#")) {
    
%>
    
< h1 > 该城市暂不被支持天气预报服务 </ h1 >
    
<%
    } 
else {
    
String[] infos = info.split("#") ; 
    
%>
    
    
    
< table  border ="1" >
     
< tr >
     
< td  colspan ="3" >
     
< strong >< font  color ="blue" > 72小时天气预报 </ font > ---
     
< font  color ="red" >
     
<!--  城市名称  -->
     
<% = infos[ 0 ] %> &nbsp;&nbsp;&nbsp; <% = infos[ 1 ] %>
     
</ font >
     
< font  size ="-1" >
     
<% = infos[ 4 %> 发布
     
</ font >
     
</ strong >
     
</ td >
     
</ tr >
     
< tr  align ="center" >
     
< td >
     
< table >
     
< tr  align ="center" >
     
<!--  日期  -->
     
< td >
     
< font  size ="-1" >
     
<% = infos[ 6 %>
     
</ font >
     
</ td >
     
</ tr >
     
< tr  align ="center" >
     
<!--  天气图标  -->
     
< td >
     
< img  src ="tqimgs/a_<%=infos[8]%>"   />
     
< img  src ="tqimgs/a_<%=infos[9]%>"   />
     
</ td >
     
</ tr >
     
< tr  align ="center" >
     
<!--  天气细则  -->
     
< td >
     
< font  size ="-1" >
     
<% = infos[ 5 %> < br >
     
<% = infos[ 7 %> < br >
     
</ font >
     
</ td >
     
</ tr >
     
</ table >
     
</ td >
     
     
     
< td >
     
< table  align ="center" >
     
< tr  align ="center" >
     
< td >
     
<!--  第二天的时间  -->
     
< font  size ="-1" >
     
<% = infos[ 13 %>
     
</ font >
     
</ td >
     
</ tr >
     
     
< tr  align ="center" >
     
< td >
     
<!--  第二天的天气图标  -->
     
< img  src ="tqimgs/a_<%=infos[15]%>" >
     
< img  src ="tqimgs/a_<%=infos[16]%>" >
    
</ td >
     
</ tr >
     
     
< tr  align ="center" >
     
< td >
     
<!--  第二天的天气细则  -->
     
< font  size ="-1" >
     
<% = infos[ 12 %> < br >
     
<% = infos[ 14 %> < br >
     
</ font >
     
</ td >
     
</ tr >
     
</ table >
     
</ td >
     
     
     
< td >
     
< table  align ="center" >
     
< tr  align ="center" >
     
< td >
     
<!--  第三天的天气时间  -->
        
< font  size ="-1" >
     
<% = infos[ 18 %>
     
</ font >
        
</ td >
     
</ tr >
     
     
< tr  align ="center" >
     
< td >
     
<!--  第三天的天气图标  -->
     
< img  src ="tqimgs/a_<%=infos[20]%>"   />
     
< img  src ="tqimgs/a_<%=infos[21]%>"   />
     
</ td >
     
</ tr >
     
< tr  align ="center" >
     
< td >
     
<!--  第三天的天气细则  -->
     
< font  size ="-1" >
     
<% = infos[ 17 %> < br >
     
<% = infos[ 19 %> < br >
     
</ font >
     
</ td >
     
</ tr >
     
</ table >
     
</ td >
         
</ tr >
         
< tr >
         
< td  colspan ="3" >
         
<!--  居家指数  -->
         
< strong >< font  color ="blue" > 温馨提醒 </ font ></ strong >
         
</ td >
         
</ tr >
         
< tr >
         
< td  colspan ="3" >
         
         
< table >
         
< tr >
         
< td >
         
< img  src ="tqimgs/sun.gif"   />
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = infos[ 10 %>
         
</ font >
         
</ td >
         
</ tr >
         
</ table >
         
         
         
</ td >
         
</ tr >
         
< tr >
         
< td  colspan ="3" >
         
          
          
<%
          
String str = "" ;
          
String s1 = "" ;
          
String s1Content = "" ;
          
String s2 = "" ;
          
String s2Content = "" ;
          
String s3 = "" ;
          
String s3Content = "" ;
          
String s4 = "" ;
          
String s4Content = "" ;
          
String s5 = "" ;
          
String s5Content = "" ;
          
String s6 = "" ;
          
String s6Content = "" ;
          
String s7 = "" ;
          
String s7Content = "" ;
          try {
              
//这里开始进行具体详细测试
          str 
= infos[11] ;
          
//穿衣指数
          s1 
= str.substring(str.indexOf("穿衣指数:"),str.indexOf("穿衣指数:")+4) ;
          s1Content 
= str.substring(str.indexOf("穿衣指数:")+5,str.indexOf("感冒指数:")) ;
          
//感冒指数
          s2 
= str.substring(str.indexOf("感冒指数:"),str.indexOf("感冒指数:")+4) ;
          s2Content 
= str.substring(str.indexOf("感冒指数:")+5,str.indexOf("晨练指数:")) ;
          
          
//晨练指数
          s3 
= str.substring(str.indexOf("晨练指数:"),str.indexOf("晨练指数:")+4) ;
          s3Content 
= str.substring(str.indexOf("晨练指数:")+5,str.indexOf("交通指数:")) ;
          
//交通指数
          s7 
= str.substring(str.indexOf("交通指数:"),str.indexOf("交通指数:")+4) ;
          s7Content 
= str.substring(str.indexOf("交通指数:")+5,str.indexOf("中暑指数:")) ;
          
//中暑指数
          s4 
= str.substring(str.indexOf("中暑指数:"),str.indexOf("中暑指数:")+4) ;
          s4Content 
= str.substring(str.indexOf("中暑指数:")+5,str.indexOf("防晒指数:")) ;
          
//防晒指数
          s5 
= str.substring(str.indexOf("防晒指数:"),str.indexOf("防晒指数:")+4) ;
          s5Content 
= str.substring(str.indexOf("防晒指数:")+5,str.indexOf("旅行指数:")) ;
          
//旅行指数
          s6 
= str.substring(str.indexOf("旅行指数:"),str.indexOf("旅行指数:")+4) ;
          s6Content 
= str.substring(str.indexOf("旅行指数:")+5) ;
          
%>
          
           
< table >
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_01.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s1  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s1Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_20.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s2  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s2Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_03.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s3  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s3Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_22.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s4  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s4Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_07.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s5  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s5Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_31.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s6  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s6Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
         
         
< tr >
         
< td  width ="50" >
         
< img  src ="tqimgs/zhishu_11.gif"   />
         
</ td >
         
< td >
         
< strong >
         
< font  size ="-1" >
         
<% = s7  %> &nbsp;
         
</ font >
         
</ strong >
         
</ td >
         
< td >
         
< font  size ="-1" >
         
<% = s7Content  %>
         
</ font >
         
</ td >
         
</ tr >
         
         
         
</ table >
         
         
         
</ td >
         
</ tr >
     
</ table >
          
          
          
<%
          } catch(Exception e) {
              
          }
          
           
%>
    
    
    
<%
    }
     
     
%>
     
          
         
         
        
  
</ body >
</ html >



D9e075b4-57ec-47c4-be33-de8914f5e307-thumb 描述: 天气预报效果图 大小: 1.6 MB


转载于:https://www.cnblogs.com/tjsquall/archive/2008/01/08/1030479.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值