<%
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组件