try {
httpRequest.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //设置编码方式
HttpResponse httpResponse = httpclient.execute(httpRequest); //执行HttpClient请求
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //如果请求成功
result += EntityUtils.toString(httpResponse.getEntity()); //获取返回的字符串
}else{
result = "请求失败!";
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace(); //输出异常信息
} catch (ClientProtocolException e) {
e.printStackTrace(); //输出异常信息
} catch (IOException e) {
e.printStackTrace(); //输出异常信息
}
}
(4)在onCreate()方法中,获取布局管理器中添加的昵称编辑框、内容编辑框、显示结果的文本框和“发表”按钮,并为“发表”按钮添加单击事件监听器,在重写的onClick()方法中,首先判断输入的昵称和内容是否为空,只要有一个为空,就给出消息提示;否则,创建一个新的线程,调用send()方法发送并读取服务器处理后的微博信息,具体代码如下:
content = (EditText) findViewById(R.id.content); //获取输入文本内容的EditText组件
resultTV = (TextView) findViewById(R.id.result); //获取显示结果的TextView组件
nickname=(EditText)findViewById(R.id.nickname); //获取输入昵称的EditText组件
button = (Button) findViewById(R.id.button); //获取“发表”按钮组件
//为按钮添加单击事件监听器
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if ("".equals(content.getText().toString())) {
Toast.makeText(MainActivity.this, "请输入要发表的内容!",Toast.LENGTH_SHORT).show();
return;
}
//创建一个新线程,用于发送并读取微博信息
new Thread(new Runnable() {
public void run() {
send();
Message m = handler.obtainMessage(); //获取一个Message
handler.sendMessage(m); //发送消息
}
}).start(); //开启线程
}
});
(5)创建一个Handler对象,在重写的handleMessage()方法中,当变量result不为空时,将其显示到结果文本框中,并清空昵称和内容编辑器,具体代码如下:
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (result != null) {
resultTV.setText(result); //显示获得的结果
content.setText(""); //清空内容编辑框
nickname.setText(""); //清空昵称编辑框
}
super.handleMessage(msg);
}
};
(6)由于在本实例中需要访问网络资源,所以还需要在AndroidManifest.xml文件中指定允许访问网络资源的权限,具体代码如下:
另外,还需要编写一个Java Web实例,用于接收Android客户端发送的请求,并做出响应。这里仍然使用例14.3中创建的deal_httpclient.jsp文件,在该文件的if语句的结尾处添加一个else if语句,用于处理当请求参数param的值为post的情况。关键代码如下:
else if("post".equals(param)){
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(); //获取系统时间
out.println("[ "+nickname+" ]于 "+date+" 发表一条微博,内容如下:");
out.println(content);
}
}
说明: 在上面的代码中,首先获取参数nickname和content指定的昵称和微博信息,并保存到相应的变量中,然后当昵称和微博内容均不为空时对其进行转码,并获取系统时间,同时组合微博信息输出到页面上。
将deal_httpclient.jsp文件放到Tomcat安装路径下的webapps/blog目录下,并启动Tomcat服务器,然后运行本实例,在屏幕上方的编辑框中输入昵称和微博信息,单击“发表”按钮,在下方将显示Web服务器的处理结果。实例运行结果如图14.4所示。
图14.4 应用HttpClient发送POST请求
14.1.3 范例1:从指定网站下载文件
例14.5 在Eclipse中创建Android项目,名称为14.5,实现从指定网站下载文件。(实例位置:光盘\TM\sl\14\14.5)