您的位置:首页 > 移动开发 > Android开发

Android端和Servlet搭建服务器交互小项目知识点汇集

2014-11-18 17:39 369 查看
转载请注明:http://blog.csdn.net/lrs123123/article/details/41250253

初学安卓,基础大的不扎实,都没有自己搭过服务器,摸摸索索爬爬滚滚最后还是憋出来了,虽说很简单,但是对于我来说是一个鼓励

我们需要用Tomcat搭载服务器,当然需要先下载Tomcat啦,这里推荐下载Tomcat6.0,下载地址:http://tomcat.apache.org/,解压到自己制定的地方,就算是安装好了,然后就是配置tomcat,







打开之后如果能看到下图显示那样,就说明你之前的JDK也就是java运行环境没问题,也就ok啦



好啦,接下来才是主要介绍

服务器端搭建介绍:
来到你的Eclipse,我用的是MyEclipse6.5 有点老但是可以用也就无所谓啦!



新建一HTML文件 ,LoginServlet,




如图,很简单,一个src用于存放服务器端代码,WebRoot,里边的WEB-INF/classes子目录,存放编译的class文件,web.xml叫做部署描述符,为web应用核心文件,WebRoot\WEB-INF\用于存放WEB应用使用的第三方库。

1.写个简单HTML,在webRoot新建,提交方式post,get皆可
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>登陆</title>

 </head>
 <body>

  <form action="LoginServlet" method="post"">
   用户
   <input type="text" name="username" />
   <br />
   密码
   <input type="password" name="password" />
   <br />
   <input type="submit" value="登录" />

  </form>
 </body>

</html>
这里边的form表单知识点很值得学习,这里先mark一下,action很重要(后边实现最终一个困难),这里我不是很清楚也就这么写吧。

2、Servlet写完,在Web的src中新建LoginServlet类,代码如下

import java.io.DataOutputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 314719472293387358L;
	private String LOGIN_FLAG = "";

	// 重写doPost方法
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("dopost");
		request.setCharacterEncoding("UTF-8");
		String userName = request.getParameter("username");
		String passWord = request.getParameter("password");
		System.out.println("username=" + userName + ",password=" + passWord);
		try {
			DataOutputStream output = new DataOutputStream(response
					.getOutputStream());
			LOGIN_FLAG = "success";
			output.writeUTF("服务端数据" + LOGIN_FLAG);
			System.out.println(LOGIN_FLAG);
			output.writeInt(1);
			output.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(request, response);
		doPost(request, response);
	}

}


备注以后补充,

3.在WebRoot的WEB-INF的web.xml部署我们写的Servlet,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 	<display-name>LoginServlet</display-name>
	<servlet>
		<servlet-name>MyServlet</servlet-name>    <!-- 随便起名字 -->
		<servlet-class>LoginServlet</servlet-class>   <!-- servlet类名 -->
	</servlet>

	<servlet-mapping>
		<servlet-name>MyServlet</servlet-name>
		<url-pattern>/LoginServlet</url-pattern>   <!-- url访问虚拟路径,最后我们就是通过工程名/login进行访问的,
		像这样http://127.0.0.1:8000/LoginAction/login-->
	</servlet-mapping>

<!-- url访问虚拟路径,最后我们就是通过工程名/login进行访问的,像这样http://127.0.0.1:8000/LoginAction/login-->
</web-app>


好啦,服务端写好了,试着验证下吧,在tomcat上部署我们的项目LoginServlet如图:





选择LoginServlet,Finish,ok





看到Console一堆东西,如图


说明成功把项目部署到Tomcat上了,至此,服务器搭建好了

Android端代码实现

package com.Garry.loginservletdemo;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Login extends Activity {
	private HttpPost httpRequest = new HttpPost(UrlAPI.HTTPCustomer);
	private EditText et_username, et_password;
	private TextView show_login;
	private Button btn_login;
	private ProgressDialog progressDialog;
//	private static String charset = "GB2312";
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();

		btn_login.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				new AT().execute(et_username.getText().toString(), et_password
						.getText().toString());
			}
		});

	}

	public class UrlAPI {
		public static final String HTTPCustomer = "http://10.173.232.159:8080/LoginServlet/LoginServlet";
	}

	class AT extends AsyncTask {
		String result = "";

		@Override
		protected void onPreExecute() {
			progressDialog.show();
			
		}

		@Override
		protected Object doInBackground(Object... params_obj) {
			CharSequence username = "";
			CharSequence password = "";
			username = et_username.getText();
			password = et_password.getText();
			if (!username.equals("") && !password.equals("")) {
				HttpPost httpRequest = new HttpPost(UrlAPI.HTTPCustomer);
				List<NameValuePair> params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair("username", username
						.toString()));
				params.add(new BasicNameValuePair("password", password
						.toString()));
				// params.add(new BasicNameValuePair("flag","0"));
				try {
					// 对提交数据进行编码
					httpRequest.setEntity(new UrlEncodedFormEntity(params,
							HTTP.UTF_8));
					HttpResponse httpResponse = new DefaultHttpClient()
							.execute(httpRequest);
					// 获取响应服务器的数据
					if (httpResponse.getStatusLine().getStatusCode() == 200) {
						// 利用字节数组流和包装的绑定数据
						byte[] data = new byte[2048];
						// 先把从服务端来的数据转化成字节数组
						data = EntityUtils
								.toByteArray((HttpEntity) httpResponse
										.getEntity());
						// 再创建字节数组输入流对象
						ByteArrayInputStream bais = new ByteArrayInputStream(
								data);
						// 绑定字节流和数据包装流
						DataInputStream dis = new DataInputStream(bais);
						// 将字节数组中的数据还原成原来的各种数据类型,代码如下:
						result = new String(dis.readUTF());
						Log.i("服务器返回信息:", result);
					}
				} catch (ClientProtocolException e) {
					e.printStackTrace();
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
			return result;
		}

		@Override
		protected void onPostExecute(Object result) {
			show_login.setText(result.toString());
			progressDialog.cancel();
		}
	}

	private void init() {
		et_username = (EditText) findViewById(R.id.et_username);
		et_password = (EditText) findViewById(R.id.et_password);
		btn_login = (Button) findViewById(R.id.btn_login);
		show_login = (TextView) findViewById(R.id.show_loign);
		progressDialog = new ProgressDialog(this);

	}

}


3.最终界面截图







4.遇到的问题

android.os.NetworkOnMainThreadException



看师兄调试 ,,受教,模拟器不可直接访问Localhost,应该找到其对应ip地址,
public static final String HTTPCustomer = "http://10.173.232.159:8080/LoginServlet/Login.html";(后边才发现还是写错了)
public static final String HTTPCustomer = "http://10.173.232.159:8080/LoginServlet/LoginServlet";



好了,项目就介绍到这里,服务器搭建,html知识,http协议,post,get方式,地址?加上想传入的数据,分隔用&,这些知识点还需要我进一步的学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: