万书网 > 文学作品 > Android从入门到精通 > 第155页

第155页





<%



String  content=request.getParameter("content");  //获取输入的微博信息



String  nickname=request.getParameter("nickname");  //获取输入的昵称



if(content!=null  &&  nickname!=null){



nickname=new  String(nickname.getBytes("iso-8859-1"),"utf-8");  //对昵称进行转码



content=new  String(content.getBytes("iso-8859-1"),"utf-8");  //对内容进行转码



String  date=new  java.util.Date().toLocaleString();  //获取系统时间



%>



<%="[  "+nickname+"  ]于  "+date+"  发表一条微博,内容如下:"%>



<%=content%>



<%  }%>

将dealPost.jsp文件放到Tomcat安装路径下的webapps\blog目录下,并启动Tomcat服务器,然后运行本实例,在屏幕上方的编辑框中输入昵称和微博信息,单击“发表”按钮,在下方将显示Web服务器的处理结果。例如,输入昵称为“无语”、微博内容为“坚持到底就是胜利!”后,单击“发表”按钮,将显示如图14.2所示的运行结果。



图14.2 应用POST方式发表一条微博信息

14.1.2 使用HttpClient访问网络

在14.1.1节中,介绍了使用java包中的HttpURLConnection类来访问网络,在一般情况下,如果只需要到某个简单页面提交请求并获取服务器的响应,完全可以使用该技术来实现。不过,对于比较复杂的联网操作,使用HttpURLConnection类就不一定能满足要求,这时,可以使用Apache组织提供的HttpClient项目来实现。在Android中,已经成功地集成了HttpClient,所以可以直接在Android中使用HttpClient来访问网络。

HttpClient实际上是对Java提供的访问网络的方法进行了封装。HttpURLConnection类中的输入/输出流操作,在HttpClient中被统一封装成了HttpGet、HttpPost和HttpResponse类,这样,就简化了操作。其中,HttpGet类代表发送GET请求;HttpPost类代表发送POST请求;HttpResponse类代表处理响应的对象。

同使用HttpURLConnection类一样,使用HttpClient发送HTTP请求也可以分为发送GET请求和POST请求两种,下面分别进行介绍。

1.  发送GET请求

同HttpURLConnection类一样,使用HttpClient发送GET请求的方法也比较简单,大致可以分为以下几个步骤。

(1)创建HttpClient对象。

(2)创建HttpGet对象。

(3)如果需要发送请求参数,可以直接将要发送的参数连接到URL地址中,也可以调用HttpGet的setParams()方法来添加请求参数。

(4)调用HttpClient对象的execute()方法发送请求。执行该方法将返回一个HttpResponse对象。

(5)调用HttpResponse的getEntity()方法,可获得包含服务器响应内容的HttpEntity对象,通过该对象可以获取服务器的响应内容。

下面通过一个具体的实例来说明如何使用HttpClient来发送GET请求。

例14.3   在Eclipse中创建Android项目,名称为14.3,实现使用HttpClient向服务器发送GET请求,并获取服务器的响应结果。(实例位置:光盘\TM\sl\14\14.3)

(1)修改新建项目的res\layout目录下的布局文件main.xml,在默认添加的TextView组件的上方添加一个Button组件,并设置其显示文本为“发送GET请求”,然后将TextView组件的id属性修改为result。具体代码请参见光盘。

(2)在该MainActivity中,创建程序中所需的成员变量,具体代码如下:

private  Button  button;  //声明一个“发送GET请求”按钮对象



private  Handler  handler;  //声明一个Handler对象



private  String  result  =  "";  //声明一个代表显示结果的字符串



private  TextView  resultTV;  //声明一个显示结果的文本框对象

(3)编写一个无返回值的send()方法,用于建立一个发送GET请求的HTTP连接,并将指定的参数发送到Web服务器上,再读取服务器的响应信息,具体代码如下:

public  void  send()  {



String  target  =  "http://192.168.1.66:8081/blog/deal_httpclient.jsp?param=get";  //要提交的目标地址



HttpClient  httpclient  =  new  DefaultHttpClient();  //创建HttpClient对象



HttpGet  httpRequest  =  new  HttpGet(target);  //创建HttpGet连接对象



HttpResponse  httpResponse;



try  {



httpResponse  =  httpclient.execute(httpRequest);  //执行HttpClient请求



if  (httpResponse.getStatusLine().getStatusCode()  ==  HttpStatus.SC_OK){



result  =  EntityUtils.toString(httpResponse.getEntity());  //获取返回的字符串



}else{



result="请求失败!";



}



}  catch  (ClientProtocolException  e)  {



e.printStackTrace();  //输出异常信息



}  catch  (IOException  e)  {



e.printStackTrace();



}



}

(4)在onCreate()方法中,获取布局管理器中添加的用于显示结果的文本框和“发表”按钮,并为“发表”按钮添加单击事件监听器,在重写的onClick()方法中,创建并开启一个新的线程,并且在重写的run()方法中,首先调用send()方法发送并读取微博信息,然后获取一个Message对象,并调用其sendMessage()方法发送消息,具体代码如下:

resultTV  =  (TextView)  findViewById(R.id.result);  //获取显示结果的TextView组件