码迷,mamicode.com
首页 > Web开发 > 详细

05.HTTP编程实战:高校信息查询平台之登录模块

时间:2015-04-28 02:01:09      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:http协议   网络编程   

转载请标明出处: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语句,且访问数据库相关方法(如登录时查询数据库数据);
  1. package com.jiangdongguo.login;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.SQLException;  
  6. import com.mysql.jdbc.PreparedStatement;  
  7. import com.mysql.jdbc.ResultSet;  
  8. /*访问数据库工具类:获取数据库链接*/  
  9. public class DBUtil {  
  10.     private String dbName = "ServerDatabase";   //数据库名  
  11.     private String url="jdbc:mysql://localhost:3306/"+dbName;//URI 
  12.     private String user="root";                       //MySQL数据库root账户  
  13.     private String psd="111111";                  //MySQL账户密码  
  14.       
  15.     private PreparedStatement ps;                 
  16.     private ResultSet result;  
  17.       
  18.     //获取数据库链接的方法getConn()  
  19.     private Connection conn;                      
  20.     public Connection getConn()  
  21.     {         
  22.         try {  
  23.             Class.forName("com.mysql.jdbc.Driver");             //根据字符串new一个实例,Class类为类装载器
  24.             conn=DriverManager.getConnection(url,user,psd); //获取数据库链接,传入参数:数据库名称、账户名、密码  
  25.         } catch (Exception e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.         return conn;      
  29.     }  
  30.       
  31.     //查询数据库业务逻辑 
  32.     public boolean checkUser(String sql,String[] args)  
  33.     {  
  34.         boolean flag=false;  
  35.         conn=getConn();     //获得数据库链接  
  36.         try {  
  37.             ps=(PreparedStatement) conn.prepareStatement(sql);  
  38.             if(args!=null)  //对sql语句每个占位符赋值  
  39.             {  
  40.                 for(int i=0;i<args.length;i++)  
  41.                     ps.setString(i+1, args[i]);  
  42.                 result=(ResultSet) ps.executeQuery();   //执行sql查询语句,并返回结果集
  43.                 if(result.next())                                      //遍历结果集,如果存在传递过来的数据(字段)的记录返回true
  44.                 {  
  45.                     flag=true;  
  46.                 }  
  47.             }  
  48.         } catch (SQLException e) {  
  49.             e.printStackTrace();  
  50.         }         
  51.         return flag;          
  52.     }  
  53. }  

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()两个方法即可。
为登录模块创建一个LoginServlet类
 功能: ①重写响应客户端的GET请求方法
              
获取客户端登录模块传递到服务器的数据;
              实例化数据库工具类,建立Java Web应用与数据库的连接并传递查询数据库的sql语句(登录功能的具体实现);
技术分享
源码:
  1. package com.jiangdongguo.login;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. //查询服务器数据库中的数据  
  11. public class LoginServlet extends HttpServlet {  
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  13.             throws ServletException, IOException {  
  14.   
  15.         response.setContentType("text/html");           //设置返回类型为网页形式  
  16.         PrintWriter out = response.getWriter();         //输出  
  17.         String name = request.getParameter("username"); //获取请求传入的参数-用户名信息  
  18.         String psd = request.getParameter("psd");       //              -密码  
  19.         System.out.println("username="+name+"psd="+psd);  //打印获取的客户端数据到Tomcat观察窗口
  20.           
  21.         //使用MySql数据库  
  22.         DBUtil dbUtil = new DBUtil();  
  23.         boolean result=dbUtil.checkUser("select * from users where user_name=? and user_psd=?"new String[]{name,psd});  
  24.         out.print(result);  
  25.     }  
  26.   
  27.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  28.             throws ServletException, IOException {  
  29.         this.doGet(request, response);  
  30.       
  31.     }    
3.测试Java Web应用程序
(1)安装Tomcat服务器
(2)在Tomcat中部署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)重置:清空登录信息;
  1. package com.example.http_client; 
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12.   
  13. public class LoginActivity extends Activity {  
  14.     private EditText userName;  
  15.     private EditText password;  
  16.     private Button loginBtn;  
  17.     private Button registerBtn;  
  18.     private Button resetBtn;  
  19.     private void init()  
  20.     {  
  21.         userName = (EditText)findViewById(R.id.uername);  
  22.         password= (EditText)findViewById(R.id.password);  
  23.         registerBtn= (Button)findViewById(R.id.registerLogin);  
  24.         resetBtn=(Button)findViewById(R.id.resetLogin);  
  25.          loginBtn=(Button)findViewById(R.id.Login);  
  26.     }  
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.login);  
  31.         init();     //初始化控件  
  32.           
  33.         /*1.登录按钮业务逻辑 
  34.          *      当用户点击登录按钮后,应用访问服务器数据库,若存在用户信息,则跳转至个人用户界面UserActivity*/  
  35.           
  36.         loginBtn.setOnClickListener(new OnClickListener() {          
  37.                 public void onClick(View v)  
  38.                 {  
  39.                     //1.创建一个Handler类对象,并重写handleMessage()方法  
  40.                     final Handler myHandler=new Handler(){  
  41.                         public void handleMessage(Message msg) {  
  42.                             String response=(String)msg.obj;                //读取obj发送过来的消息    
  43.                             if("true".equals(response))     //a.用户存在,跳转至个人用户界面  
  44.                             {  
  45.                                 Intent intent=new Intent();  
  46.                                 intent.setClass(LoginActivity.this, UserActivity.class);      
  47.                                 startActivity(intent);  
  48.                             }  
  49.                             else                                        //b.如果服务器返回false,说明用户信息不存在或者填写错误  
  50.                             {  
  51.                                 Toast.makeText(LoginActivity.this"用户名或密码不正确,请重新输                                
  52.                                                                                                                     入!",Toast.LENGTH_SHORT).show();  
  53.                             }  
  54.                         }  
  55.                     };  
  56.                 //2.创建一个子线程  
  57.                 //当服务器没有开启时应用会异常终止,这里我们需要处理这个异常防止程序异常退出  
  58.                 new Thread(new Runnable(){  
  59.                     public void run() {  
  60.                         LoginToServer login = new LoginToServer();  
  61.                                 String result=login.doGet(userName.getText().toString().trim(), password.getText().toString().trim());    
  62.                                 Message msg=new Message();  
  63.                                 msg.obj=result; //将响应信息保存到obj中  
  64.                                 myHandler.sendMessage(msg);                  
  65.                         }             
  66.                     }).start();  
  67.             }     
  68.         });  
  69.           
  70.         /*2.注册按钮业务逻辑 
  71.          *  当用户点击注册按钮后,应用跳转至RegisterActivity注册界面*/  
  72.         registerBtn.setOnClickListener(new OnClickListener() {  
  73.             public void onClick(View v) {  
  74.                 Intent intent=new Intent();  
  75.                 intent.setClass(LoginActivity.this, RegisterActivity.class);      
  76.                 startActivity(intent);  
  77.             }  
  78.         });  
  79.           
  80.         /*3.重置按钮业务逻辑 
  81.          *      即清空用户名和密码输入框内容*/  
  82.         resetBtn.setOnClickListener(new OnClickListener() {  
  83.             public void onClick(View v) {  
  84.                 userName.setText("");  
  85.                 password.setText("");  
  86.             }  
  87.         });  
  88.     }  
注:服务器响应数据为"true".
2.(Eclipse)src/.../LoginToServer.java:doGet()方法具体实现类
功能:用于客户端向服务器实现发送GET请求/POST请求的具体实现类
  1. package com.example.http_client;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;   
  7. import org.apache.http.HttpEntity;  
  8. import org.apache.http.HttpResponse;  
  9. import org.apache.http.HttpStatus;  
  10. import org.apache.http.client.HttpClient;  
  11. import org.apache.http.client.methods.HttpGet;  
  12. import org.apache.http.impl.client.DefaultHttpClient;  
  13.   
  14. public class LoginToServer {  
  15.     private String url="http://10.0.2.2:8080/login/LoginServlet";       //访问服务器资源的URL地址  
  16.     String result="";         
  17.     /*doGet方法 
  18.      * 作用:实现客户端向服务器发送GET请求*/  
  19.     public String doGet(String name,String psd)  
  20.     {  
  21.         HttpClient httpClient = new DefaultHttpClient();            //客户端实例  
  22.         String urlStr=url+"?username="+name+"&psd="+psd;            //给UIL装载请求数据  
  23.         HttpGet getRequest=new HttpGet(urlStr);                     //实例化HttpGet,代表Get请求  
  24.         try {  
  25.               
  26.             HttpResponse response = httpClient.execute(getRequest);//发送Get请求,并获取响应  
  27.             if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
  28.             {  
  29.                 HttpEntity entity=response.getEntity();     //获取响应信息实体  
  30.                 InputStream is= entity.getContent(); //h.执行HttpEntity的getContent方法,获取对应的输入流  
  31.                 BufferedReader br = new BufferedReader(new InputStreamReader(is));
  32.                                                      //i.读取输入流中的内容,并以字符串的形式返回        
  33.                 String readLine = null;  
  34.                 while((readLine = br.readLine()) != null )  
  35.                 {  
  36.                         result=result+readLine;  
  37.                 }  
  38.                 is.close();  
  39.             }  
  40.             else  
  41.             {  
  42.                 result="error";  
  43.             }  
  44.         }  
  45.         catch (IOException e)   
  46.         {  
  47.             System.out.println(e.getMessage());  
  48.         }  
  49.         return result;    
  50.     }  
  51. }  
注:UserActivityRegisterActivity会在后面实现。

三、登录模块测试
    这里,我们已经向服务器主机的MySQL数据库中添加了一条记录
技术分享 技术分享

测试结果
技术分享
技术分享技术分享
注:当客户端向服务器传输数据后,在Tomcat观察窗口也可以观察到("username=jiangpsd=111")信息。


05.HTTP编程实战:高校信息查询平台之登录模块

标签:http协议   网络编程   

原文地址:http://blog.csdn.net/u012637501/article/details/45321725

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!