学习javaweb的时候都知道向服务端提交数据有两种方式,get和post。今天学习了在Android客户端使用get方式提交登录数据的小案例。
步骤:
- 先新建一个web项目,搭建一个简单的登录表单界面
- 设置好用户名和密码,点击登录的时候会显示登录成功或者失败,这里就不在贴Servlet和jsp的代码了。在这里我设置用户名为”小强”,密码为123.
- 设置安卓的布局,两个EditView和一个Button。点击Button的时候会弹出一个吐司显示登录成功或者失败
乱码问题:
使用浏览器打开这个表单界面的时候,用户名内容如果是中文字符“小强”,那么在用户名和密码都正确的情况下,点击登录后显示的信息会是看不懂的乱码。把码表都改成utf-8之后可以正确显示,但是却显示的是登录失败!因为浏览器提交数据的时候使用的是utf-8,而服务器使用ISO-8859-1的方式自然就把用户名“小强”解析成了乱码封装了,所以登录才会失败的。
解决办法:
name = new String(name.getBytes("ISO-8859-1"),"utf-8");
这样浏览器端的乱码问题就解决了,下面看Android客户端。
当用户名使用中文提交的时候,你会发现用户名“小强”和密码“123”,都写对了,但是还是提示登录失败。
这是因为,浏览器在提交表单数据的时候,会把用户名”小强”进行一次URL编码,我们可以在地址栏中清晰的看出
http://192.168.252.1:8080/web/LoginServletname=%E5%B0%8F%E5%BC%BA&password=123
name被URL编码了。所以,我们在安卓客户端进行提交数据的时候也要对name进行URL编码,如下:
//提交的数据需要进行URL编码,字母和数字编码后都不变
String path = "http://192.168.252.1:8080/web/LoginServlet?name="+URLEncoder.encode(name)+"&password="+pass;
这样就可以解决用户名为中文字符时及时用户名密码都正确却显示登录不成功的问题。
* 部分代码
//布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}"
android:orientation="vertical"
>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
/>
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="登录"
/>
</LinearLayout>
- 现在开始写按钮的点击事件click()方法,主要注意一下几点
- 开启网络连接的步骤
- 网络编程的权限设置
- 刷新UI只能在主线程内设置,所以要使用消息队列机制,开启一个子线程运行其他代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//刷新主线程
@SuppressLint("HandlerLeak")
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
Toast.makeText(MainActivity.this, (String) msg.obj, 0).show();
};
};
public void click(View v){
EditText et_name = (EditText) findViewById(R.id.et_name);
EditText et_password = (EditText) findViewById(R.id .et_password);
final String name = et_name.getText().toString();
final String pass = et_password.getText().toString();
Thread t = new Thread(){
@Override
public void run() {
//提交的数据需要进行URL编码,字母和数字编码后都不变
String path = "http://192.168.252.1:8080/web/LoginServlet?name="+URLEncoder.encode(name)+"&password="+pass;
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
if(conn.getResponseCode() == 200){
InputStream is = conn.getInputStream();
String text = utils.getTextFromStream(is);
//消息队列机制,把读取出来的数据交给handler发送给主线程刷新UI
Message msg = handler.obtainMessage();
msg.obj = text;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
}
}