android客户端如何提交表单数据给web服务器
1服务器端的准备
为了完成该实例,我们需要在服务器端做以下准备工作:
(1)我们需要在MyEclipse中创建一个Web工程,用来模拟服务器端的Web服务,这里,我将该工程命名为了“myhttp”。
(2)修改该工程的“indexjsp”文件,添加两个输入框和一个提交按钮,作为该Web工程的显示页面。运行Tomcat,在浏览器中访问该Web工程,可以看到如图1所示的界面。
Web工程的显示页面
(3)在该Web工程中,创建一个继承自HttpServlet的LoginAction类,并实现其中的doPost()方法,用来响应图1所示页面的用户操作。具体实现如下:
由上述代码可以看出,当我们在图1所示的页面输入用户名“admin”,密码“123”时,点击提交按钮,会得到“Login succeeded!”的提示信息,如图2所示。若用户名、密码错误,则会得到“Login failed!”的提示信息。
2客户端实现
在Android客户端,我们需要完成的工作是:以POST方式发送用户名密码到上述服务器,并获得服务器的验证信息。
我们分以下几个步骤来完成。
21 UI界面
在Android工程中,我们需要完成一个简单的UI界面,用来完成用户名密码的输入、发送POST请求、显示服务器的验证结果,完成后的界面如图3所示。
在MainActivity中,我们需要获取两个EditText控件的输入,“提交”按键的监听,以及服务器验证结果的TextView内容显示。具体实现代码如下:
22发送POST请求到服务器
可以看到上述代码中,我们调用了HttpUtils类的静态方法submitPostData()完成了发送POST请求到服务器,并将该方法的返回值(服务器的响应结果)显示在了TextView控件中。
通过以上的代码可以看出,在该方法中,其实完成了3件事:
(1)将用户名密码封装成请求体,这是通过调用getRequestData()方法来实现的(后面会讲到这个方法的具体实现)。
(2)设置HttpURLConnection对象的各种参数(其实是设置HTTP协议请求体的各项参数),然后通过httpURLConnectiongetOutputStream()方法获得服务器输出流outputStream,再使用outputStreamwrite()方法将请求体内容发送给服务器。
(3)判断服务器的响应码,通过httpURLConnectiongetInputStream()方法获得服务器的响应输入流,然后再调用dealResponseResult()方法处理服务器的响应结果。
23封装请求体
使用POST请求时,POST的参数不是放在URL字符串里,而是放在HTTP请求数据中,所以我们需要对POST的参数进行封装。
针对该实例而言,我们发送的URL请求是:http://1921681101:8080/myhttp/servlet/LoginAction,但是我们需要将POST的参数(也就是username和password)封装到该请求中,形成如下的形式:
24处理响应结果
最后,我们再来看一看对服务器返回结果的处理是怎样的。因为在本实例中,服务器的返回结果是字符串“Login succeeded!”或“Login failed!”,所以这里我们需要做的就是将服务器的返回结果输入流转化成字符串。当然了,如果服务器返回的是,那么,我们就需要就得到的输入流转化成Bitmap了。如下代码是上面代码中用到的dealResponseResult()方法的具体实现。
25运行效果
我做了一个代码如下:
public class MainActivity extends Activity {
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
listview = (ListView) findViewById(Ridlistview);
String temp = "[{\"aa\":\"1\",\"bb\":\"2\"},{\"aa\":\"3\",\"bb\":\"4\"},{\"aa\":\"5\",\"bb\":\"6\"}]";
List<Map<String, Object>> data = getList(temp);
SimpleAdapter adapter = new SimpleAdapter(this, data, Rlayoutitem, new String[]{"aa","bb"}, new int[]{Ridaa,Ridbb});
listviewsetAdapter(adapter);
}
public Map<String, Object> getMap(String jsonString) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject(jsonString);
@SuppressWarnings("unchecked")
Iterator<String> keyIter = jsonObjectkeys();
String key;
Object value;
Map<String, Object> valueMap = new HashMap<String, Object>();
while (keyIterhasNext()) {
key = (String) keyIternext();
value = jsonObjectget(key);
valueMapput(key, value);
}
return valueMap;
} catch (JSONException e) {
eprintStackTrace();
}
return null;
}
public List<Map<String, Object>> getList(String jsonString) {
List<Map<String, Object>> list = null;
try {
JSONArray jsonArray = new JSONArray(jsonString);
JSONObject jsonObject;
list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < jsonArraylength(); i++) {
jsonObject = jsonArraygetJSONObject(i);
listadd(getMap(jsonObjecttoString()));
}
} catch (Exception e) {
eprintStackTrace();
}
return list;
}
}
item的布局文件
<xml version="10" encoding="utf-8"><LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/aa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp" />
<TextView
android:id="@+id/bb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="100dp"
android:textColor="#f00"
android:textSize="30sp" />
</LinearLayout>
最后的界面效果:
0条评论