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

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. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. //查询服务器数据库中的数据
  9. public class LoginServlet extends HttpServlet {
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. response.setContentType("text/html");           //设置返回类型为网页形式
  13. PrintWriter out = response.getWriter();         //输出
  14. String name = request.getParameter("username"); //获取请求传入的参数-用户名信息
  15. String psd = request.getParameter("psd");       //              -密码
  16. System.out.println("username="+name+"psd="+psd);  //打印获取的客户端数据到Tomcat观察窗口
  17. //使用MySql数据库
  18. DBUtil dbUtil = new DBUtil();
  19. boolean result=dbUtil.checkUser("select * from users where user_name=? and user_psd=?", new String[]{name,psd});
  20. out.print(result);
  21. }
  22. public void doPost(HttpServletRequest request, HttpServletResponse response)
  23. throws ServletException, IOException {
  24. this.doGet(request, response);
  25. }
  26. }

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. public class LoginActivity extends Activity {
  13. private EditText userName;
  14. private EditText password;
  15. private Button loginBtn;
  16. private Button registerBtn;
  17. private Button resetBtn;
  18. private void init()
  19. {
  20. userName = (EditText)findViewById(R.id.uername);
  21. password= (EditText)findViewById(R.id.password);
  22. registerBtn= (Button)findViewById(R.id.registerLogin);
  23. resetBtn=(Button)findViewById(R.id.resetLogin);
  24. loginBtn=(Button)findViewById(R.id.Login);
  25. }
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.login);
  30. init();     //初始化控件
  31. /*1.登录按钮业务逻辑
  32. *      当用户点击登录按钮后,应用访问服务器数据库,若存在用户信息,则跳转至个人用户界面UserActivity*/
  33. loginBtn.setOnClickListener(new OnClickListener() {
  34. public void onClick(View v)
  35. {
  36. //1.创建一个Handler类对象,并重写handleMessage()方法
  37. final Handler myHandler=new Handler(){
  38. public void handleMessage(Message msg) {
  39. String response=(String)msg.obj;                //读取obj发送过来的消息
  40. if("true".equals(response))     //a.用户存在,跳转至个人用户界面
  41. {
  42. Intent intent=new Intent();
  43. intent.setClass(LoginActivity.this, UserActivity.class);
  44. startActivity(intent);
  45. }
  46. else                                        //b.如果服务器返回false,说明用户信息不存在或者填写错误
  47. {
  48. Toast.makeText(LoginActivity.this, "用户名或密码不正确,请重新输
  49. 入!",Toast.LENGTH_SHORT).show();
  50. }
  51. }
  52. };
  53. //2.创建一个子线程
  54. //当服务器没有开启时应用会异常终止,这里我们需要处理这个异常防止程序异常退出
  55. new Thread(new Runnable(){
  56. public void run() {
  57. LoginToServer login = new LoginToServer();
  58. String result=login.doGet(userName.getText().toString().trim(), password.getText().toString().trim());
  59. Message msg=new Message();
  60. msg.obj=result; //将响应信息保存到obj中
  61. myHandler.sendMessage(msg);
  62. }
  63. }).start();
  64. }
  65. });
  66. /*2.注册按钮业务逻辑
  67. *  当用户点击注册按钮后,应用跳转至RegisterActivity注册界面*/
  68. registerBtn.setOnClickListener(new OnClickListener() {
  69. public void onClick(View v) {
  70. Intent intent=new Intent();
  71. intent.setClass(LoginActivity.this, RegisterActivity.class);
  72. startActivity(intent);
  73. }
  74. });
  75. /*3.重置按钮业务逻辑
  76. *      即清空用户名和密码输入框内容*/
  77. resetBtn.setOnClickListener(new OnClickListener() {
  78. public void onClick(View v) {
  79. userName.setText("");
  80. password.setText("");
  81. }
  82. });
  83. }
  84. }

注:服务器响应数据为"true".

2.(Eclipse)src/.../LoginToServer.java:doGet()方法具体实现类

功能:用于客户端向服务器实现发送GET请求/POST请求的具体实现类

  1. package com.example.http_client;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import org.apache.http.HttpEntity;
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.HttpStatus;
  9. import org.apache.http.client.HttpClient;
  10. import org.apache.http.client.methods.HttpGet;
  11. import org.apache.http.impl.client.DefaultHttpClient;
  12. public class LoginToServer {
  13. private String url="http://10.0.2.2:8080/login/LoginServlet";       //访问服务器资源的URL地址
  14. String result="";
  15. /*doGet方法
  16. * 作用:实现客户端向服务器发送GET请求*/
  17. public String doGet(String name,String psd)
  18. {
  19. HttpClient httpClient = new DefaultHttpClient();            //客户端实例
  20. String urlStr=url+"?username="+name+"&psd="+psd;            //给UIL装载请求数据
  21. HttpGet getRequest=new HttpGet(urlStr);                     //实例化HttpGet,代表Get请求
  22. try {
  23. HttpResponse response = httpClient.execute(getRequest);//发送Get请求,并获取响应
  24. if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
  25. {
  26. HttpEntity entity=response.getEntity();     //获取响应信息实体
  27. InputStream is= entity.getContent(); //h.执行HttpEntity的getContent方法,获取对应的输入流
  28. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  29. //i.读取输入流中的内容,并以字符串的形式返回
  30. String readLine = null;
  31. while((readLine = br.readLine()) != null )
  32. {
  33. result=result+readLine;
  34. }
  35. is.close();
  36. }
  37. else
  38. {
  39. result="error";
  40. }
  41. }
  42. catch (IOException e)
  43. {
  44. System.out.println(e.getMessage());
  45. }
  46. return result;
  47. }
  48. }

注:UserActivity、RegisterActivity会在后面实现。

三、登录模块测试

这里,我们已经向服务器主机的MySQL数据库中添加了一条记录


测试结果

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

时间: 2024-07-28 14:04:10

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

06.HTTP编程实战:高校信息查询平台之注册模块

转载请标明出处:http://blog.csdn.net/u012637501 一.注册模块服务端   1.(MyEclipse)src/../DBUtil.java:数据库工具类(JDBC,链接数据库) 在数据库工具类中,添加sql语句插入数据具体实现方法. package com.jiangdongguo.login; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException

Web信息查询平台

每天记录学习,每天会有好心情.*^_^* 今天记录的项目是基于Web的信息查询平台,采用当前非常流行的B/S体系结构,以JSP作为开发技术,主要依赖SSM技术框架,mysql数据库建立本系统.做基于Web的信息查询平台的时候,我们需要用到SSM(MYECLIPSE)框架,开发工具选用最拿手的MYECLIPSE.基于Web的信息查询平台项目是一个 后台项目.开发系统时,需求分析是必不可少的一个环节.基于Web的信息查询平台拥有的登录角色包括了管理员.用户.每个账号设置身份.账号.密码是必不可少的,

java并发编程实战学习(3)--基础构建模块

转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到空间可用:如果队列为空,那么take方法将阻塞直到有元素可用.队列可以是有界的也可以是无界的. 如果生产者生成工作的速率比消费者处理工作的速率款,那么工作项会在队列中累计起来,最终好紧内存.同样,put方法的阻塞特性也极大地简化了生产者的编码.如果使用有界队列,当队列充满时,生产者将阻

《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&amp;并发容器类&amp;同步工具类,消费者模式

上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Hashtable,此外还包括在JDK1.2中添加的一些功能相似的类,这些同步的封装器类由Collections.synchronizedXxx等工厂方法创建的.这些类实现线程安全的方式是:将他们的状态封装起来,并对每个共有方法都进行同步,使得每次只能有一个线程能访问容器的状态. 关于java中的Vect

通过数据库读取,获取MVM各扫描任务的漏扫数量趋势统计以及详细信息查询

当大型分布式部署的漏扫系统投入运行之后,对全行接近50家分行的服务器进行扫描,数据量陡增,作为唯一的管理员,必然被淹没了,不可能再像之前一样,逐个扫描报告分析,并编写扫描报告,通知各管理员整改.而且MVM自身的漏洞整改跟踪机制也不再适用,细粒度的Ticket功能,对分行管理员和自己都是负担.该如何解决呢? 经过思考和讨论,决定转换角色,通过统计全局的数据,来掌握分行管理员的配合支持程度,和分行的总体漏洞数量.通过建立漏洞信息查询平台,提供整改方法和补丁下载等各种资源.而具体的工作则由分行管理员自

第05组团队Github现场编程实战

第05组团队Github现场编程实战 一.组员职责分工 组员 分工 卢欢(组长) 前后端接口设计 严喜 寻找相关资料 张火标 设计并描述界面原型 钟璐英 编写随笔 周华 填写完善文档 古力亚尔·艾山 填写完善文档 张聪 前后端接口设计 池九锡 前端界面设计 汪佳祥 后端代码求解 杨忠燎 前后端接口设计 陈天恒 前端界面设计 WANT TO 吐槽 卢欢:如果事先能分工,我们团队就能更好的协调工作. 严喜:如果时间够长,那么我们可以做的更好. 张火标:如果提前说明本次作业所需要的技能,就可能不是呆呆

Linux下的编程实战【转】

一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台的),进程控制与进程通信编程 1.Linux进程 Linux进程在内存中包含三部分数据:代码段.堆栈段和数据段.代码段存放了程序的代码.代码段可以为机器中运行同一程序的数个 进程共享.堆栈段存放的是子程序(函数)的返回地址.子程序的参数及程序的局部变量.而数据段则存放程序的全局变量.常数以及动态数

《Java并发编程实战》要点笔记及java.util.concurrent 的结构介绍

买了<java并发编程实战>这本书,看了好几遍都不是很懂,这个还是要在实战中找取其中的要点的,后面看到一篇文章笔记做的很不错分享给大家!! 原文地址:http://blog.csdn.net/cdl2008sky/article/details/26377433 Subsections  1.线程安全(Thread safety) 2.锁(lock) 3.共享对象 4.对象组合 5.基础构建模块 6.任务执行 7.取消和关闭 8.线程池的使用 9.性能与可伸缩性 10.并发程序的测试 11.显

10、会话管理/编程实战分析/Jsp

1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建Cookie对象 Cookeie cookie = new Cookie("name","value"); 2.2 把cookie发送给浏览器端(通过响应头:set-cookie) response.addCookie(cookie); 2.3 浏览器带着cookie信息