HttpClient作客户端,Tomcat Servlet作服务器的交互示例

转载地址:


http://blog.csdn.net/yanzi1225627/article/details/24882569


前面相继介绍了Android网络编程里的Socket传输图片、HttpURLConnection,今天看HttpClient.

第一部分:JavaEE版的Eclipse配置Tomcat

【备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的。我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse。】

1、下载Eclipse的Tomcat插件:http://www.eclipsetotale.com/tomcatPlugin.html 将其解压得到com.sysdeo.eclipse.tomcat_3.3.0文件夹。将它复制到eclipse的plugins文件夹下。 重启Eclipse会看到上面有三个小猫,哈哈

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第1张图片

2、下载apache-tomcat-7.0.53-windows-x86 最新到8.0了,但Eclipse支持貌似最高7.0,所以还是用7.0。解压apache-tomcat-7.0.53-windows-x86至C盘根目录,配置环境变量,新增CATALINA_HOME 路径为:C:\apache-tomcat-7.0.53 或者直接将这个变量配置到Path里都ok。  然后双击bin目录下的startup脚本,浏览器输入:http://localhost:8080/ 看到小猫表示windows上的tomcat配好了。

3、新建一个java工程,在里面选择Tomcat Project工程如图所示:

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第2张图片

配置Tomcat和Server选项:

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第3张图片

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第4张图片


备注:新建工程这块也可以在Web里选择新建Dynamic Web Project,这是标准的使用Servlet、JSP等技术开发动态网站的项目,需要JavaEE版的Eclipse

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第5张图片


第二部分:联通浏览器和Tomcat

即在浏览器输入一个网址,tomcat里返回一句话,浏览器收到并显示。之所以弄这一步一是为了测试,二是后来会发现,Android里的HttpClient就跟这个浏览器一样。

1.在WEB-INF/src文件夹下新建包名org.yanzi.testtomcat,在里面新建一个类TestTomcat继承自HttpServlet.并重写里面的doGet方法。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");


PrintWriter out = resp.getWriter();
// //用HTML格式给浏览器返回数据
// out.println("<html>");
// out.println("<head>");
// out.println("<title>Hello,Servlet!</title>");
// out.println("</head>");
// out.println("<body>");
// out.println("Hello,First Servlet!");
// out.println("</body>");
// out.println("</html>");
out.println("Hello,第一个Tomcat!!!");
out.close();
}

2.在WEB-INF文件夹下新建文件wem.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">


<web-app >
<servlet>
<servlet-name>test_yan</servlet-name>
<!-- 名字随便 -->
<servlet-class>org.yanzi.testtomcat.TestTomcat</servlet-class>
<!-- servlet类名 -->
</servlet>
<servlet-mapping>
<servlet-name>test_yan</servlet-name>
<url-pattern>/login</url-pattern>
<!-- url访问虚拟路径,最后我们就是通过工程名/login进行访问的,像这样http://127.0.0.1:8000/LoginAction/login -->
</servlet-mapping>


</web-app>

关于上面的配置注意:a. servlet-name是servlet的名字,这个名字可以随便起。只要servlet-name标签里名字一样就可以了。b. servlet-class里写包名+类名。c. url-pattern这里也是随便写的,是输入浏览器里的地址。本博文中浏览器的地址是:

http://localhost:8080/TestTomcat/login     这里的8080是端口,是在tomcat安装文件里的conf里的server.xml配置好的,用默认的就ok。除非此端口已被其他占用。 TestTomcat这里指的是工程的名字,而非类的名字。最后的“/login”跟web.xml里对应,注意后面不要再多加一个斜杠成这样"/login/", 这是解析不了的。

3. 修改conf文件夹下的tomcat-users.xml文件,在里面添加一个用户:

 <role rolename="manager"/> 
  <user username="admin" password="admin" roles="manager"/>

默认的都是全被注释掉的。

然后就可以点击eclipse上的小猫头像,开启这个servlet服务了。浏览器输入http://localhost:8080/TestTomcat/login 可以看到:

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第6张图片

在doGet()函数里用html格式输出,即:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");


PrintWriter out = resp.getWriter();
//用HTML格式给浏览器返回数据
out.println("<html>");
out.println("<head>");
out.println("<title>Tomcat Servlet测试</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello,First Servlet!");
out.println("</body>");
out.println("</html>");
out.println("Hello,第一个Tomcat!!!");
out.close();
}

看到效果:

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第7张图片

这是因为用html格式给它设置了标题名字,并打印了一句话。这里真想吐槽一下,最初我用百度浏览器倒置了两个小时都没有出来,后来在google浏览器里一输入就ok了。真心坑爹啊。另外,如果浏览器在看视频,貌似也是出不来的。大爷的,此点么深究!!

第三部分:重写TestTomcat里的doPost()和doGet()方法。

因为我准备再手机上用doPost跟Tomcat通信,传递一个用户名和密码。Tomcat判断后再返回结果。改好后的TestTomcat.java的完整文件如下:

[java]  view plain copy print ?
  1. package org.yanzi.testtomcat;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. public class TestTomcat extends HttpServlet {  
  12.   
  13.     private static final long serialVersionUID = 1L;  
  14.     private static final int NAME_CODE_RIGHT = 0//  
  15.     private static final int CODE_WRONG = 1;     //  
  16.     private static final int NAME_WRONG = 2;     //  
  17.   
  18.     public TestTomcat(){  
  19.   
  20.     }  
  21.     @Override  
  22.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  23.             throws ServletException, IOException {  
  24.         // TODO Auto-generated method stub  
  25.   
  26.         if(req == null){  
  27.             return;  
  28.         }  
  29.         resp.setContentType("text/html;charset=utf-8");  
  30.         req.setCharacterEncoding("utf-8");  
  31.         resp.setCharacterEncoding("utf-8");  
  32.         PrintWriter out = resp.getWriter();  
  33.         String name = req.getParameter("NAME");  
  34.         String code = req.getParameter("CODE");  
  35.   
  36. /*      //浏览器访问,没传递任何参数。用HTML格式给浏览器返回数据 
  37.         out.println("<html>"); 
  38.         out.println("<head>"); 
  39.         out.println("<title>Tomcat Servlet测试</title>"); 
  40.         out.println("</head>"); 
  41.         out.println("<body>"); 
  42.         out.println("Hello,哥知道你是浏览器访问的."); 
  43.         out.println("</body>"); 
  44.         out.println("</html>"); 
  45.         out.println("Hello,第一个Tomcat!!!"); 
  46.         out.close();*/  
  47.   
  48.         //手机客户端访问  
  49.         int ret = checkSubmit(name, code);  
  50.         out.print(ret);  
  51.         out.flush();  
  52.         out.close();  
  53.   
  54.     }  
  55.   
  56.     @Override  
  57.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  58.             throws ServletException, IOException {  
  59.         // TODO Auto-generated method stub  
  60.         if(req == null){  
  61.             return;  
  62.         }  
  63.   
  64.         resp.setContentType("text/html;charset=utf-8");  
  65.         req.setCharacterEncoding("utf-8");  
  66.         resp.setCharacterEncoding("utf-8");  
  67.   
  68.         PrintWriter out = resp.getWriter();  
  69.         String name = req.getParameter("NAME");  
  70.         String code = req.getParameter("CODE");  
  71.   
  72.         int ret = checkSubmit(name, code);  
  73.         out.print(ret);  
  74.         out.flush();  
  75.         out.close();  
  76.     }  
  77.   
  78.     /** 
  79.      * 判断登录名和密码 
  80.      * @param name 
  81.      * @param code 
  82.      * @return 
  83.      */  
  84.     private int checkSubmit(String name, String code){  
  85.         int ret = -2;  
  86.         if(name.equals("admin")){  
  87.             if(code.equals("123")){  
  88.                 ret = NAME_CODE_RIGHT;  
  89.             }else{  
  90.                 ret = CODE_WRONG;  
  91.             }  
  92.         }else{  
  93.             ret = NAME_WRONG;  
  94.         }  
  95.         return ret;  
  96.     }  
  97.   
  98.   
  99. }  

第四步: Android客户端的开发,这里我弄两个按钮分别对应HttpPost和HttpGet两种方式跟服务器通讯。下面是个ScrollView显示服务器回传结果.效果如下所示:

HttpClient作客户端,Tomcat Servlet作服务器的交互示例_第8张图片

AndroidManifest.xml里加权限:  <uses-permission android:name="android.permission.INTERNET"/>


activity_main.xml的内容:

[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <EditText  
  12.         android:id="@+id/edit_name"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:hint="输入用户名" />  
  16.   
  17.     <EditText  
  18.         android:id="@+id/edit_code"  
  19.         android:layout_width="match_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_below="@id/edit_name"  
  22.         android:hint="输入密码" />  
  23.   
  24.     <LinearLayout  
  25.         android:id="@+id/layout_btn"  
  26.         android:layout_width="match_parent"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_centerInParent="true"  
  29.         android:orientation="horizontal" >  
  30.   
  31.         <Button  
  32.             android:id="@+id/btn_submit_post"  
  33.             android:layout_width="0dip"  
  34.             android:layout_height="wrap_content"  
  35.             android:layout_weight="1"  
  36.             android:gravity="center"  
  37.             android:text="POST登录 " />  
  38.   
  39.         <Button  
  40.             android:id="@+id/btn_submit_get"  
  41.             android:layout_width="0dip"  
  42.             android:layout_height="wrap_content"  
  43.             android:layout_weight="1"  
  44.             android:gravity="center"  
  45.             android:text="GET登录 " />  
  46.     </LinearLayout>  
  47.   
  48.     <ScrollView  
  49.         android:id="@+id/info_scroll_view"  
  50.         android:layout_width="match_parent"  
  51.         android:layout_height="wrap_content"  
  52.         android:layout_below="@id/layout_btn" >  
  53.   
  54.         <TextView  
  55.             android:id="@+id/tv_info"  
  56.             android:layout_width="wrap_content"  
  57.             android:layout_height="wrap_content"  
  58.             android:text="结果显示........." />  
  59.     </ScrollView>  
  60.   
  61. </RelativeLayout>  

MainActivity.java里的内容:

[java]  view plain copy print ?
  1. package org.yanzi.testtomecat;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.UnsupportedEncodingException;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import org.apache.http.HttpResponse;  
  9. import org.apache.http.HttpStatus;  
  10. import org.apache.http.client.ClientProtocolException;  
  11. import org.apache.http.client.HttpClient;  
  12. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  13. import org.apache.http.client.methods.HttpGet;  
  14. import org.apache.http.client.methods.HttpPost;  
  15. import org.apache.http.conn.params.ConnManagerParams;  
  16. import org.apache.http.impl.client.DefaultHttpClient;  
  17. import org.apache.http.impl.conn.DefaultClientConnection;  
  18. import org.apache.http.message.BasicNameValuePair;  
  19. import org.apache.http.params.BasicHttpParams;  
  20. import org.apache.http.params.HttpConnectionParams;  
  21. import org.apache.http.params.HttpParams;  
  22. import org.apache.http.protocol.HTTP;  
  23. import org.apache.http.util.EntityUtils;  
  24.   
  25. import android.app.Activity;  
  26. import android.os.AsyncTask;  
  27. import android.os.Bundle;  
  28. import android.view.Menu;  
  29. import android.view.View;  
  30. import android.view.View.OnClickListener;  
  31. import android.widget.Button;  
  32. import android.widget.EditText;  
  33. import android.widget.ScrollView;  
  34. import android.widget.TextView;  
  35.   
  36. public class MainActivity extends Activity {  
  37.     public static final String URL = "http://192.168.16.8:8080/TestTomcat/login";  
  38.     Button submitBtnPost = null;  
  39.     Button submitBtnGet = null;  
  40.     TextView infoTextView = null;  
  41.     EditText nameEdit = null;  
  42.     EditText codeEdit = null;  
  43.     ScrollView scrollView = null;  
  44.     boolean isPost = true//默认采取post登录方式  
  45.       
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         setContentView(R.layout.activity_main);  
  50.         scrollView = (ScrollView)findViewById(R.id.info_scroll_view);  
  51.         submitBtnPost = (Button)findViewById(R.id.btn_submit_post);  
  52.         submitBtnGet = (Button)findViewById(R.id.btn_submit_get);  
  53.         infoTextView = (TextView)findViewById(R.id.tv_info);  
  54.         nameEdit = (EditText)findViewById(R.id.edit_name);  
  55.         codeEdit = (EditText)findViewById(R.id.edit_code);  
  56.         submitBtnPost.setOnClickListener(new View.OnClickListener() {  
  57.               
  58.             @Override  
  59.             public void onClick(View v) {  
  60.                 // TODO Auto-generated method stub  
  61.                 isPost = true;  
  62.                 new SubmitAsyncTask().execute(URL);  
  63.             }  
  64.         });  
  65.         submitBtnGet.setOnClickListener(new View.OnClickListener() {  
  66.               
  67.             @Override  
  68.             public void onClick(View v) {  
  69.                 // TODO Auto-generated method stub  
  70.                 isPost = false;  
  71.                 new SubmitAsyncTask().execute(URL);  
  72.             }  
  73.         });  
  74.     }  
  75.       
  76.   
  77.   
  78.     @Override  
  79.     public boolean onCreateOptionsMenu(Menu menu) {  
  80.         // Inflate the menu; this adds items to the action bar if it is present.  
  81.         getMenuInflater().inflate(R.menu.main, menu);  
  82.         return true;  
  83.     }  
  84.     public class SubmitAsyncTask extends AsyncTask<String, Void, String>{  
  85.         String info = "";  
  86.         @Override  
  87.         protected String doInBackground(String... params) {  
  88.             // TODO Auto-generated method stub  
  89.             String url = params[0];  
  90.             String reps = "";  
  91.             if(isPost){  
  92.                 info = "HttpPost返回结果: ";  
  93.                 reps = doPost(url);  
  94.             }else{  
  95.                 info = "HttpGet返回结果: ";  
  96.                 reps = doGet(url);    
  97.             }  
  98.             return reps;  
  99.         }  
  100.   
  101.         @Override  
  102.         protected void onPostExecute(String result) {  
  103.             // TODO Auto-generated method stub  
  104.             infoTextView.append("\n" + info + result +"\n");  
  105.             String res = result.trim();  
  106.             if(res.equals("0")){  
  107.                 info = "验证通过.....";  
  108.             }else if(res.equals("1")){  
  109.                 info = "密码错误.....";  
  110.             }else if(res.equals("2")){  
  111.                 info = "用户名错误.....";  
  112.             }else if(res.equals("-1")){  
  113.                 info = "返回结果异常!";  
  114.             }  
  115.             infoTextView.append(info + "\n");  
  116.             scrollView.fullScroll(ScrollView.FOCUS_DOWN);  
  117.             super.onPostExecute(result);  
  118.         }  
  119.           
  120.   
  121.   
  122.     }  
  123.     private String doGet(String url){  
  124.         String responseStr = "";  
  125.         try {  
  126.             String name = nameEdit.getText().toString().trim();  
  127.             String code = codeEdit.getText().toString().trim();  
  128.             String getUrl = URL + "?NAME=" + name+"&"+"CODE=" + code;         
  129.               
  130.             HttpGet httpRequest = new HttpGet(getUrl);  
  131.             HttpParams params = new BasicHttpParams();  
  132.             ConnManagerParams.setTimeout(params, 1000);  
  133.             HttpConnectionParams.setConnectionTimeout(params, 3000);  
  134.             HttpConnectionParams.setSoTimeout(params, 5000);  
  135.             httpRequest.setParams(params);  
  136.   
  137.             HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);  
  138.         final int ret = httpResponse.getStatusLine().getStatusCode();  
  139.         if(ret == HttpStatus.SC_OK){  
  140.             responseStr = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);  
  141.         }else{  
  142.             responseStr = "-1";  
  143.         }  
  144.         } catch (ClientProtocolException e) {  
  145.             // TODO Auto-generated catch block  
  146.             e.printStackTrace();  
  147.         } catch (IOException e) {  
  148.             // TODO Auto-generated catch block  
  149.             e.printStackTrace();  
  150.         }  
  151.           
  152.         return responseStr;  
  153.     }  
  154.       
  155.     /** 
  156.      * 用Post方式跟服务器传递数据 
  157.      * @param url 
  158.      * @return 
  159.      */  
  160.     private String doPost(String url){  
  161.         String responseStr = "";  
  162.         try {  
  163.             HttpPost httpRequest = new HttpPost(url);  
  164.             HttpParams params = new BasicHttpParams();  
  165.             ConnManagerParams.setTimeout(params, 1000); //从连接池中获取连接的超时时间  
  166.             HttpConnectionParams.setConnectionTimeout(params, 3000);//通过网络与服务器建立连接的超时时间  
  167.             HttpConnectionParams.setSoTimeout(params, 5000);//读响应数据的超时时间  
  168.             httpRequest.setParams(params);  
  169.             //下面开始跟服务器传递数据,使用BasicNameValuePair  
  170.             List<BasicNameValuePair> paramsList = new ArrayList<BasicNameValuePair>();  
  171.             String name = nameEdit.getText().toString().trim();  
  172.             String code = codeEdit.getText().toString().trim();  
  173.             paramsList.add(new BasicNameValuePair("NAME", name));  
  174.             paramsList.add(new BasicNameValuePair("CODE", code));  
  175.             UrlEncodedFormEntity mUrlEncodeFormEntity = new UrlEncodedFormEntity(paramsList, HTTP.UTF_8);  
  176.             httpRequest.setEntity(mUrlEncodeFormEntity);  
  177.             HttpClient httpClient = new DefaultHttpClient();  
  178.             HttpResponse httpResponse = httpClient.execute(httpRequest);  
  179.             final int ret = httpResponse.getStatusLine().getStatusCode();  
  180.             if(ret == HttpStatus.SC_OK){  
  181.                 responseStr = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);  
  182.             }else{  
  183.                 responseStr = "-1";  
  184.             }  
  185.   
  186.         } catch (UnsupportedEncodingException e) {  
  187.             // TODO Auto-generated catch block  
  188.             e.printStackTrace();  
  189.         } catch (ClientProtocolException e) {  
  190.             // TODO Auto-generated catch block  
  191.             e.printStackTrace();  
  192.         } catch (IOException e) {  
  193.             // TODO Auto-generated catch block  
  194.             e.printStackTrace();  
  195.         }  
  196.   
  197.         return responseStr;  
  198.     }  
  199.   
  200. }  

要点注释:

1、核心在doGet()和doPost()两个函数里,可以看到用get方式比用post传递参数更方便,可以直接写到url里。使用get方式时传递数据在url里写的:

String name = nameEdit.getText().toString().trim();
String code = codeEdit.getText().toString().trim();
String getUrl = URL + "?NAME=" + name+"&"+"CODE=" + code;

post方式时是用BasicNameValuePair来弄的。其他流程都差不多。首先new一个HttpGet或HttpPost,然后设参数,共设三个,作用注释里有。然后设参数,传数据,通过HttpResponse httpResponse = httpClient.execute(httpRequest);得到返回结果。

2、如果在Tomcat里使用的是out.println(),则再解析数据时需要再得到的String上trim()一下,否则会错。

3、Android客户端URL地址为:

public static final String URL = "http://192.168.16.8:8080/TestTomcat/login";

这里的IP就是电脑的IP加端口号就ok。


当然这仅是个最基本的示例,遗留问题:

1.JSON传递数据

2.每次链接都开一个DefaultHttpClient很不科学。


参考: 

http://blog.chinaunix.net/uid-25799257-id-3774015.html

http://blog.chinaunix.net/uid-25799257-id-3774047.html


你可能感兴趣的:(HttpClient作客户端,Tomcat Servlet作服务器的交互示例)