Android客户端与服务器交互,登录案例
2015-10-29 10:22
615 查看
实现了Android客户端与服务器的交互,客户端采用Android Studio开发,Web服务器采用MyEclipse开发,数据库使用MySQL,采用Hibernate框架开发
1、Android客户端采用开发工具为Android Studio,用到的jar包com.alibaba:fastjson:1.2.7
.jar、com.squareup.okhttp:okhttp:2.5.0.jar、com.squareup.okio:okio:1.6.0.jar,客户端采用OkHttp与服务器进行交互,详见
2、Web服务器采用MyEclipse,用到的jar包,主要是Hibernate的jar
一 Android客户端
1.1 布局文件activity_main.xml
1.2 主界面 LoginActivity.java
在LoginActivity.java中,实现与服务器间的交互主要采用OKHttp架包,这个架包封装了各种与服务器的交互,详见点击打开链接
二、Web服务器
服务器中采用Hibernate架构,
2.1 Domain包
2.1.1 User.hbm.xml Pojo类的配置文件
2.1.2 User.java Pojo类 (Pojo类必需进行序列化(Serializable))
2.2 Service包
主要分成两层,分别是接口类和继承接口的类
2.2.1UserServiceInter.java接口类
2.2.2 UserServiceImp.java继承接口的类
2.3 Util包
主要是Hibernate对MySQL数据库的操作工具
2.4 servlet包
Login.java主要是响应从Android客户端发送过来的指令,并回应
2.5 Hibernate的配置hibernate.cfg.xml
这里必需引入c3p0连接池,不然在服务器上添加一条数据,客户端是无法访问,必需重启服务器才能访问得到
三、结果
源码地址点击打开链接,大家可以自己下载查看。
1、Android客户端采用开发工具为Android Studio,用到的jar包com.alibaba:fastjson:1.2.7
.jar、com.squareup.okhttp:okhttp:2.5.0.jar、com.squareup.okio:okio:1.6.0.jar,客户端采用OkHttp与服务器进行交互,详见
2、Web服务器采用MyEclipse,用到的jar包,主要是Hibernate的jar
一 Android客户端
1.1 布局文件activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".LoginActivity"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@string/loginregister" android:textColor="#D10B0B" android:textSize="30dp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/username" /> <EditText android:id="@+id/etusername" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/password" /> <EditText android:id="@+id/etpassword" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login" /> <Button android:id="@+id/register" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/register" /> </LinearLayout> </LinearLayout>
1.2 主界面 LoginActivity.java
在LoginActivity.java中,实现与服务器间的交互主要采用OKHttp架包,这个架包封装了各种与服务器的交互,详见点击打开链接
package com.zsp.applogin.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.squareup.okhttp.Request; import com.zsp.applogin.Json.WriteJson; import com.zsp.applogin.R; import com.zsp.applogin.Util.OkHttpClientManager; import com.zsp.applogin.domain.User; import java.util.ArrayList; import java.util.List; public class LoginActivity extends AppCompatActivity { Button login; Button register; EditText etusername; EditText etpassword; String username; String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); init(); register.setOnClickListener(new RegisterOnclick()); login.setOnClickListener(new LoginOnclick()); } private void init() { etusername = (EditText) findViewById(R.id.etusername); etpassword = (EditText) findViewById(R.id.etpassword); login = (Button) findViewById(R.id.login); register = (Button) findViewById(R.id.register); } private class RegisterOnclick implements View.OnClickListener { public void onClick(View v) { } } private class LoginOnclick implements View.OnClickListener { public void onClick(View arg0) { username = etusername.getText().toString().trim(); if (username == null || username.length() <= 0) { etusername.requestFocus(); etusername.setError("对不起,用户名不能为空"); return; } else { username = etusername.getText().toString().trim(); } password = etpassword.getText().toString().trim(); if (password == null || password.length() <= 0) { etpassword.requestFocus(); etpassword.setError("对不起,密码不能为空"); return; } else { password = etpassword.getText().toString().trim(); } User user = new User(username, password); //构造一个user对象 List<User> list = new ArrayList<User>(); list.add(user); WriteJson writeJson = new WriteJson(); //将user对象写出json形式字符串 String jsonString = writeJson.getJsonData(list); String url = "http://192.168.1.186:8080/LoginTest/servlet/Login"; OkHttpClientManager.postAsyn(url, new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(String u) { Toast.makeText(LoginActivity.this, u, Toast.LENGTH_SHORT).show(); } }, new OkHttpClientManager.Param("username", username), new OkHttpClientManager.Param("password", password)); } } }
二、Web服务器
服务器中采用Hibernate架构,
2.1 Domain包
2.1.1 User.hbm.xml Pojo类的配置文件
<?xml version="1.0" encoding="UTF-8"?> <!-- dtd指定格式 --> <!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'> <hibernate-mapping package="com.zsp.domain"> <class name="User" table="user"> <id name="userid" column="userid" type="java.lang.Integer"> <!-- id元素用于指定主键属性 --> <generator class="increment"></generator> <!-- 该元素用于指定主键值生成策略hilo native increment sequence uuid --> </id> <!-- 其他属性配置 --> <property name="username" type="java.lang.String"> <column name="username" not-null="false"/> </property> <property name="userpwd" type="java.lang.String"> <column name="userpwd" not-null="false"/> </property> </class> </hibernate-mapping>
2.1.2 User.java Pojo类 (Pojo类必需进行序列化(Serializable))
package com.zsp.domain; import java.io.Serializable; public class User implements Serializable { /** * @Fields serialVersionUID : TODO */ private static final long serialVersionUID = 1L; private int userid; private String username; private String userpwd; public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpwd() { return userpwd; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } }
2.2 Service包
主要分成两层,分别是接口类和继承接口的类
2.2.1UserServiceInter.java接口类
package com.zsp.service.inter; import com.zsp.domain.User; public interface UserServiceInter { public User checkUser(User user); }
2.2.2 UserServiceImp.java继承接口的类
package com.zsp.service.imp; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import org.hibernate.Query; import com.zsp.domain.User; import com.zsp.service.inter.UserServiceInter; import com.zsp.util.HibernateUtil; public class UserServiceImp implements UserServiceInter { public User checkUser(User user) { List<User> list = null; String hql = "from User where username = ? and userpwd = ?"; String[] parameters = {user.getUsername(),user.getUserpwd()}; list = HibernateUtil.hqlQuery(hql, parameters); if(list.size()==0){ return null; }else{ return list.get(0); } } }
2.3 Util包
主要是Hibernate对MySQL数据库的操作工具
<pre name="code" class="java">import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory = null; //使用线程局部模式 private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private HibernateUtil(){}; static { sessionFactory = new Configuration().configure().buildSessionFactory(); } //获取全新的session public static Session openSession(){ return sessionFactory.openSession(); } //获取和线程关联的session public static Session getCurrentSession(){ Session session= threadLocal.get(); //判断是否得到 if(session==null){ session = sessionFactory.openSession(); //把session对象设置到threadLocal, threadLocal.set(session); } return session; } public static void closeCurrentSession(){ Session s=getCurrentSession(); if(s!=null&& s.isOpen() ){ s.close(); threadLocal.set(null); } } //提供一个统一的查询方法 hql 形式 from 类 where 条件=? .. public static List hqlQuery(String hql,String [] parameters){ Session session= null; List list = null; try { session = openSession(); Query query = session.createQuery(hql); //判断是否有参数要绑定 if(parameters !=null && parameters.length>0){ for (int i = 0; i < parameters.length; i++) { query.setString(i, parameters[i]); } } list = query.list(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally{ if(session != null && session.isOpen()){ session.close(); } } return list; } }
2.4 servlet包
Login.java主要是响应从Android客户端发送过来的指令,并回应
package com.zsp.servlet; 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; import com.zsp.domain.User; import com.zsp.service.imp.UserServiceImp; import com.zsp.service.inter.UserServiceInter; public class Login extends HttpServlet { /** * Constructor of the object. */ public Login() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out=response.getWriter(); String username=request.getParameter("username"); String password=request.getParameter("password"); User user = new User(); user.setUsername(username); user.setUserpwd(password); UserServiceInter userServiceInter = new UserServiceImp(); user = userServiceInter.checkUser(user); System.out.println(username+" "+password); if(user != null){ out.write("success"); }else{ out.write("failure"); } out.flush(); out.close(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }
2.5 Hibernate的配置hibernate.cfg.xml
这里必需引入c3p0连接池,不然在服务器上添加一条数据,客户端是无法访问,必需重启服务器才能访问得到
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.url">jdbc:mysql:///lesson</property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hbm2ddl.auto">update</property> <property name="show_sql">true</property> <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.max_size">20</property> <!--在连接池中所有数据库连接的最大数目--> <property name="hibernate.c3p0.min_size">5</property> <!--在连接池中可用数据库连接的最小数目--> <property name="automaticTestTable">Test</property> <property name="hibernate.c3p0.max_statements">100</property> <!--可以被缓存的PreparedStatement的最大数目--> <property name="hibernate.c3p0.idle_test_period">120</property> <property name="hibernate.c3p0.acquire_increment">1</property> <property name="c3p0.testConnectionOnCheckout">true</property> <property name="c3p0.idleConnectionTestPeriod">18000</property> <property name="c3p0.maxIdleTime">25000</property> <mapping resource="com/zsp/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
三、结果
源码地址点击打开链接,大家可以自己下载查看。
相关文章推荐
- 用Canvas画Switch控件
- Android 07:Android的国际化应用
- Android--TextView属性用法
- Android adb多设备管理
- android图片裁剪和缩放
- Android 各种MIME类型和文件类型的匹配表
- android中Invalidate和postInvalidate的区别
- Android中AIDL及其使用
- android执行外部命令、检测文件是否存在、自动检测U盘路径
- Android ListView 异步加载图片乱序问题,原因分析及解决方案
- AndroidStudio的经典教程(干货)
- android 4.0 全屏 屏蔽下面的status bar
- 第一个简单的android项目
- Android Messenger 跨进程通信
- Android菜鸟的成长笔记——ViewPager图片循环
- Android 反编译
- 框架模式 MVC 在Android中的使用
- Android本地数据存储之SQLite
- android的消息机制——Handler机制
- Android Studio 快捷键整理分享