提交数据到服务器有下面4中方式:
1.以Get方式提交
2.以Post方式提交
3.以HttpClient的Get方式提交
4以HttpClient的Post方式提交
首先在eclipse中新建一个dynamic web project ,记得设置项目的编码格式为utf-8,否则后面会出现乱码。
在src下新建一个servlet,代码如下:
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式,防止乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//response.setContentType("text/html;charset=utf-8");
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println("username="+username);
System.out.println("password="+password);
if("zhangsan".equals(username)&&"123".equals(password)){
response.getOutputStream().write("登陆成功".getBytes("utf-8"));
}else{
response.getOutputStream().write("登陆失败".getBytes("utf-8"));
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("doPost方式提交");
doGet(request, response);
}
}
接着便是搞android客户端,布局文件代码如下:
<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"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/et_username"
android:hint="请输入用户名"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/et_password"
android:hint="请输入密码"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPassword"
/>
<Button
android:id="@+id/bt"
android:onClick="click"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GET登陆"
/>
<Button
android:id="@+id/bt2"
android:onClick="click2"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="POST登陆"
/>
<Button
android:id="@+id/bt3"
android:onClick="click3"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HttpClient GET登陆"
/>
<Button
android:id="@+id/bt4"
android:onClick="click4"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HttpClient POST登陆"
/>
</LinearLayout>
记得加上用户权限:
<uses-permission android:name="android.permission.INTERNET"/>
MainActivity文件的代码如下:
public class MainActivity extends Activity {
private EditText et_username;
private EditText et_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username=(EditText) findViewById(R.id.et_username);
et_password=(EditText) findViewById(R.id.et_password);
}
public void click(View v){
final String username=et_username.getText().toString().trim();
final String password=et_password.getText().toString().trim();
new Thread(){
public void run() {
if(username!=null&&password!=null){
LoginService ls=new LoginService();
final String result=ls.loginByGet(username, password);
runOnUiThread(new Runnable() {
@Override
public void run() {
if(result!=null){
Toast.makeText(MainActivity.this, result, 0).show();
}else{
Toast.makeText(MainActivity.this, "请求失败...", 0).show();
}
}
});
}
};
}.start();
}
public void click2(View v){
final String username=et_username.getText().toString().trim();
final String password=et_password.getText().toString().trim();
/**
* MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这 个 类对网络的访问方式进行了一定的改变。
* StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,
* UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
* 并且在配置文件中将SDK的最低等级设为9
*
* 下面这种方法是没用到Thread,但必须加上下面的这一段,若不加则会产生问题,
*/
/*StrictMode.setThreadPolicy(new
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
*/
/*if(username!=null&&password!=null){
LoginService ls=new LoginService();
String result=ls.loginByPost(username, password);
if(result!=null){
Toast.makeText(this, result, 0).show();
}else{
Toast.makeText(this, "请求失败...", 0).show();
}
}*/
new Thread(){
public void run() {
if(username!=null&&password!=null){
LoginService ls=new LoginService();
final String result=ls.loginByPost(username, password);
/**将非UI线程加到UI线程中执行*/
runOnUiThread(new Runnable() {
@Override
public void run() {
if(result!=null){
Toast.makeText(MainActivity.this, result, 0).show();
}else{
Toast.makeText(MainActivity.this, "请求失败...", 0).show();
}
}
});
}
};
}.start();
}
public void click3(View v){
final String username=et_username.getText().toString().trim();
final String password=et_password.getText().toString().trim();
new Thread(){
public void run() {
if(username!=null&&password!=null){
LoginService ls=new LoginService();
final String result=ls.loginByHttpClientGet(username, password);
/**将非UI线程加到UI线程中执行*/
runOnUiThread(new Runnable() {
@Override
public void run() {
if(result!=null){
Toast.makeText(MainActivity.this, result, 0).show();
}else{
Toast.makeText(MainActivity.this, "请求失败...", 0).show();
}
}
});
}
};
}.start();
}
public void click4(View v){
final String username=et_username.getText().toString().trim();
final String password=et_password.getText().toString().trim();
new Thread(){
public void run() {
if(username!=null&&password!=null){
LoginService ls=new LoginService();
final String result=ls.loginByHttpClientPost(username, password);
/**将非UI线程加到UI线程中执行*/
runOnUiThread(new Runnable() {
@Override
public void run() {
if(result!=null){
Toast.makeText(MainActivity.this, result, 0).show();
}else{
Toast.makeText(MainActivity.this, "请求失败...", 0).show();
}
}
});
}
};
}.start();
}
}
业务类的代码如下:
public class LoginService {
public String loginByGet(String username,String password){
try {
//设置编码格式,使之能够传递中文
String path="http://172.22.20.14:8080/TestJavaScript/LoginServlet?username="
+URLEncoder.encode(username, "utf-8")+"&password="+URLEncoder.encode(password, "utf-8");
URL url=new URL(path);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code=conn.getResponseCode();
if(code==200){
InputStream is=conn.getInputStream();
String text=StreamTool.streamToString(is);
return text;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String loginByPost(String username, String password) {
try {
String path="http://172.22.20.14:8080/TestJavaScript/LoginServlet";
URL url=new URL(path);
StringBuffer sb=new StringBuffer();
//sb.append("?");
sb.append("username="+URLEncoder.encode(username, "utf-8")+"&password="+URLEncoder.encode(password, "utf-8"));
// Post方式提交的时候参数和URL是分开提交的,参数形式是这样子的:name=y&age=6
String str = sb.toString();
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000);
conn.setDoInput(true);
conn.setDoOutput(true);
// 设置请求体的类型是文本类型,表示当前提交的是文本数据
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(str.getBytes().length));
//conn.setRequestProperty("Content-Length", str.length()+"");
OutputStream os=conn.getOutputStream();
os.write(str.getBytes());
int code=conn.getResponseCode();
if(code==200){
InputStream is=conn.getInputStream();
String text=StreamTool.streamToString(is);
return text;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String loginByHttpClientGet(String username, String password) {
try {
HttpClient hc=new DefaultHttpClient();
String path="http://172.22.20.14:8080/TestJavaScript/LoginServlet?username="
+URLEncoder.encode(username, "utf-8")+"&password="+URLEncoder.encode(password, "utf-8");
HttpGet request=new HttpGet(path);
HttpResponse response=hc.execute(request);
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
String text=StreamTool.streamToString(is);
return text;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String loginByHttpClientPost(String username, String password) {
try {
String path="http://172.22.20.14:8080/TestJavaScript/LoginServlet";
// 1. 获得一个相当于浏览器对象HttpClient,使用这个接口的实现类来创建对象,DefaultHttpClient
HttpClient hc = new DefaultHttpClient();
// DoPost方式请求的时候设置请求,关键是路径
HttpPost request = new HttpPost(path);
// 2.设置参数
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
NameValuePair nameValuePairs1 = new BasicNameValuePair("username", username);
parameters.add(nameValuePairs1);
NameValuePair nameValuePairs2 = new BasicNameValuePair("password", password);
parameters.add(nameValuePairs2);
HttpEntity entity = new UrlEncodedFormEntity(parameters, "UTF-8");
request.setEntity(entity);
// 3. 执行请求
HttpResponse response = hc.execute(request);
// 4. 通过返回码来判断请求成功与否
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entitys = response.getEntity();
InputStream is = entitys.getContent();
String text=StreamTool.streamToString(is);
return text;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
所用到的工具类(将输入流转换成字符串),代码如下:
public class StreamTool {
public static String streamToString(InputStream is){
try {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=0;
while((len=is.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
baos.close();
byte[] result=baos.toByteArray();
return new String(result);
} catch (Exception e) {
e.printStackTrace();
return "获取失败";
}
}
}
效果如下图所示:
在服务器端的控制台打印如下的数据:
username=zhangsan
password=123
username=zhangsan
password=123
username=zhangsan
password=123
username=zhangsan
password=123
doPost方式提交
username=zhangsan
password=123
username=zhangsan
password=123
源代码下载地址:http://download.csdn.net/detail/dangnianmingyue_gg/8995727