转载请标明出处:http://blog.csdn.net/u012637501
在了解了Android
的HTTP应用编程相关知识后,我们通过一个实例来进一步深化基于HTTP协议的Android客户端应用的开发,即模拟高效信息查询平台实例。该APP应用作为高校信息查询客户端,可以完成用户的注册、登录,信息查询、资料的下载与上传等功能,整体开发流程图如下:
基础知识:
①HTTP协议介绍: http://blog.csdn.net/u012637501/article/details/45149067
②HTTP协议客户端实现: http://blog.csdn.net/u012637501/article/details/45149145
③HTTP协议之服务器实现: http://blog.csdn.net/u012637501/article/details/45149211
④HTTP协议之GET请求与访问MySQL数据库: http://blog.csdn.net/u012637501/article/details/45149425
一、登录模块服务端
1.(MyEclipse)src/../DBUtil.java:数据库工具类(JDBC,链接数据库)
由于
高效信息查询平台客户端访问的是服务器MySQL数据库,首先,需在MyEclipse创建一个Java Web工程并创建一个数据库工具类
DBUtil.java,然后将MySQL数据库驱动"mysql-connector-java-3.1.11-bin.jar"拷贝到该工程目录下(假设MySQL数据库在服务器主机已经安装配置好)。
数据库工具类主要完成以下功能:
(1)加载数据库驱动,建立Java Web应用与MySQ数据库之间的连接;
(2)实现解析SQL语句,且访问数据库相关方法(如登录时查询数据库数据);
- package com.jiangdongguo.login;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import com.mysql.jdbc.PreparedStatement;
- import com.mysql.jdbc.ResultSet;
- /*访问数据库工具类:获取数据库链接*/
- public class DBUtil {
- private String dbName = "ServerDatabase"; //数据库名
- private String url="jdbc:mysql://localhost:3306/"+dbName;//URI
- private String user="root"; //MySQL数据库root账户
- private String psd="111111"; //MySQL账户密码
-
- private PreparedStatement ps;
- private ResultSet result;
-
- //获取数据库链接的方法getConn()
- private Connection conn;
- public Connection getConn()
- {
- try {
- Class.forName("com.mysql.jdbc.Driver"); //根据字符串new一个实例,Class类为类装载器
- conn=DriverManager.getConnection(url,user,psd); //获取数据库链接,传入参数:数据库名称、账户名、密码
- } catch (Exception e) {
- e.printStackTrace();
- }
- return conn;
- }
-
- //查询数据库业务逻辑
- public boolean checkUser(String sql,String[] args)
- {
- boolean flag=false;
- conn=getConn(); //获得数据库链接
- try {
- ps=(PreparedStatement) conn.prepareStatement(sql);
- if(args!=null) //对sql语句每个占位符赋值
- {
- for(int i=0;i<args.length;i++)
- ps.setString(i+1, args[i]);
- result=(ResultSet) ps.executeQuery(); //执行sql查询语句,并返回结果集
- if(result.next()) //遍历结果集,如果存在传递过来的数据(字段)的记录返回true
- {
- flag=true;
- }
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return flag;
- }
- }
2.(MyEclipse)src/../LoginServlet.java:Servlet(Java Web应用的Servlet)
Servlet(Server+let)是在
服务器上运行的小程序
,具有独立于平台和协议的特性,
可以生成动态的web页面,用于处理及响应客户端的请求
,担当客户请求(web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的
中间层
。
Servlet实质上是个特殊的Java类,该类继承于Servley或其子类(如
HttpServlet
),Servlet用于处理和响应客户端的请求,
Servlet提供了不同的方法用于响应客户端请求
。通常客户端的请求只有GET和POST两种,Servlet为了响应这两种请求,只需
重写doGet()和doPost()
两个方法即可。
功能: ①重写响应客户端的GET请求方法
③实例化数据库工具类,建立Java Web应用与数据库的连接并传递查询数据库的sql语句(登录功能的具体实现);
源码:
- package com.jiangdongguo.login;
-
- import java.io.IOException;
- import java.io.PrintWriter;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- //查询服务器数据库中的数据
- public class LoginServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- response.setContentType("text/html"); //设置返回类型为网页形式
- PrintWriter out = response.getWriter(); //输出
- String name = request.getParameter("username"); //获取请求传入的参数-用户名信息
- String psd = request.getParameter("psd"); // -密码
- System.out.println("username="+name+"psd="+psd); //打印获取的客户端数据到Tomcat观察窗口
-
- //使用MySql数据库
- DBUtil dbUtil = new DBUtil();
- boolean result=dbUtil.checkUser("select * from users where user_name=? and user_psd=?", new String[]{name,psd});
- out.print(result);
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
-
- }
- }
3.测试Java Web应用程序
Tomcat安装目录下的
conf
文件夹
下的
Server.xml,
在该文件的倒数第四行即</host>标签之上,添加如下代码。
◆
path:
虚拟路径,启动Tomcat后,可通过
http://localhost:8080/login/来访问该项目中的相关页面;
◆
docBase:Servlet项目根目录所在路径,是本机上的一个绝对路径,即Java Web应用所存放的位置,需要定位到WebRoot目录下;
◆
reloadable:设置为"true",表示修改Servlet文件后,不需要重启服务器就可以实现页面的同步更新。
(3)在浏览器中输入:http://localhost:8080/,点击"Manager App"
注:
在Applications栏目,查看Path列是否包含"/login"(path=/login在部署Java web时设置),否则,说明部署不成功
(
4)
启动Tomcat:双击bin目录下的Tomcat7.exe(Tomcat观察窗口)
(5)测试
点击"/login"进入web应用,浏览器中输入"
http://localhost:8080/login/LoginServlet?username=jiangdongguo&psd=111"作为客户端访问服务器,观察如下:
A.假如数据库存在("username=jiangdongguo","psd=111")记录,网页界面显示"true"且Tomcat观察窗口显示接
"username=jiangdongguo","psd=111",则说明Java Web应用(服务器端)开发成功,且访问MySQL数据库成功。
B.假如数据库存在("username=jiangdongguo","psd=111")记录,网页界面显示"false"且Tomcat观察窗口显示接
"username=jiangdongguo","psd=111",则说明Java Web应用(服务器端)开发成功,且访问MySQL数据库成功。
否则,说明Java Web应用开发不成功,或者,连接MySQL数据失败。
1.(Eclipse)src/.../LoginActivity.java:客户端主UI
(1)登录:通过子线程调用doGet()方法,向服务器发送GET请求并获取服务器返回的响应数据;
(2)注册:跳转至注册模块UI界面;
(3)重置:清空登录信息;
- package com.example.http_client;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
-
- public class LoginActivity extends Activity {
- private EditText userName;
- private EditText password;
- private Button loginBtn;
- private Button registerBtn;
- private Button resetBtn;
- private void init()
- {
- userName = (EditText)findViewById(R.id.uername);
- password= (EditText)findViewById(R.id.password);
- registerBtn= (Button)findViewById(R.id.registerLogin);
- resetBtn=(Button)findViewById(R.id.resetLogin);
- loginBtn=(Button)findViewById(R.id.Login);
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.login);
- init(); //初始化控件
-
- /*1.登录按钮业务逻辑
- * 当用户点击登录按钮后,应用访问服务器数据库,若存在用户信息,则跳转至个人用户界面UserActivity*/
-
- loginBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v)
- {
- //1.创建一个Handler类对象,并重写handleMessage()方法
- final Handler myHandler=new Handler(){
- public void handleMessage(Message msg) {
- String response=(String)msg.obj; //读取obj发送过来的消息
- if("true".equals(response)) //a.用户存在,跳转至个人用户界面
- {
- Intent intent=new Intent();
- intent.setClass(LoginActivity.this, UserActivity.class);
- startActivity(intent);
- }
- else //b.如果服务器返回false,说明用户信息不存在或者填写错误
- {
- Toast.makeText(LoginActivity.this, "用户名或密码不正确,请重新输
- 入!",Toast.LENGTH_SHORT).show();
- }
- }
- };
- //2.创建一个子线程
- //当服务器没有开启时应用会异常终止,这里我们需要处理这个异常防止程序异常退出
- new Thread(new Runnable(){
- public void run() {
- LoginToServer login = new LoginToServer();
- String result=login.doGet(userName.getText().toString().trim(), password.getText().toString().trim());
- Message msg=new Message();
- msg.obj=result; //将响应信息保存到obj中
- myHandler.sendMessage(msg);
- }
- }).start();
- }
- });
-
- /*2.注册按钮业务逻辑
- * 当用户点击注册按钮后,应用跳转至RegisterActivity注册界面*/
- registerBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Intent intent=new Intent();
- intent.setClass(LoginActivity.this, RegisterActivity.class);
- startActivity(intent);
- }
- });
-
- /*3.重置按钮业务逻辑
- * 即清空用户名和密码输入框内容*/
- resetBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- userName.setText("");
- password.setText("");
- }
- });
- }
- }
注:服务器响应数据为"true".
2.(Eclipse)src/.../LoginToServer.java:doGet()方法具体实现类
功能:用于客户端向服务器实现发送GET请求/POST请求的具体实现类
- package com.example.http_client;
-
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
-
- public class LoginToServer {
- private String url="http://10.0.2.2:8080/login/LoginServlet"; //访问服务器资源的URL地址
- String result="";
- /*doGet方法
- * 作用:实现客户端向服务器发送GET请求*/
- public String doGet(String name,String psd)
- {
- HttpClient httpClient = new DefaultHttpClient(); //客户端实例
- String urlStr=url+"?username="+name+"&psd="+psd; //给UIL装载请求数据
- HttpGet getRequest=new HttpGet(urlStr); //实例化HttpGet,代表Get请求
- try {
-
- HttpResponse response = httpClient.execute(getRequest);//发送Get请求,并获取响应
- if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
- {
- HttpEntity entity=response.getEntity(); //获取响应信息实体
- InputStream is= entity.getContent(); //h.执行HttpEntity的getContent方法,获取对应的输入流
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- //i.读取输入流中的内容,并以字符串的形式返回
- String readLine = null;
- while((readLine = br.readLine()) != null )
- {
- result=result+readLine;
- }
- is.close();
- }
- else
- {
- result="error";
- }
- }
- catch (IOException e)
- {
- System.out.println(e.getMessage());
- }
- return result;
- }
- }
注:UserActivity
、RegisterActivity会在后面实现。
三、登录模块测试
这里,我们已经向服务器主机的MySQL数据库中添加了一条记录
测试结果:
注:当客户端向服务器传输数据后,在Tomcat观察窗口也可以观察到("username=jiangpsd=111")信息。