相信学习Android开发的各位一定会遇到写后台登录注册的功能,今天我就在这里分享一下自己写的后台Servlet+Android如何实现这一功能。如有不足之处,欢迎提出意见
首先整理一下整个程序的逻辑:
登录功能:在用户输入用户名密码后,点击“登录”,android客户端获取EditText中的内容,通过网络发送post请求到自己写的服务器上(我使用的服务器是tomcat,IDE是MyEclipse),服务器端接收获取到的数据,利用JDBC连接mysql数据库(这里需要先下载好JDBC的驱动,自己上网找就好了)查询数据库中是否存在该用户名和密码,如果存在,返回“success”,否则服务器返回失败,android客户端再根据返回的信息判断是否登录成功。
注册功能:基本逻辑和登录功能差不多,无非这个是传递数据后是服务器往数据库中添加新的用户名和密码。
值得一提的是,在写后台功能之前自己先在mysql中创建数据库,用于保存注册的用户名和密码信息
sql语句也分享一下吧:
create table user(id int primary key auto_increment,
username varchar(20),
password varchar(20));
接下来是我自己写的源码:
登录功能的LoginServlet:
public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); request.setCharacterEncoding("utf-8"); String name = request.getParameter("username"); String pass = request.getParameter("password"); try{ Class.forName("com.mysql.jdbc.Driver"); //下面的括号中数据是mysql数据库的用户名和密码,安装数据库的时候自己设置的 Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root"); String sql="select * from user where username='"+name+"'and password='"+pass+"'"; Statement st=con.createStatement(); ResultSet rs=st.executeQuery(sql); if(rs.next()) { out.write("success"); System.out.print("成功"); } else { out.write("failed"); System.out.print("失败"); } rs.close(); st.close(); con.close(); }catch (Exception e) { e.printStackTrace(); } System.out.print(name+pass); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
注册功能的RegisterServlet(其实代码差不多,无非是传入的sql语句不同):
public class RegisterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); request.setCharacterEncoding("utf-8"); String name = request.getParameter("username"); String pass = request.getParameter("password"); if(name!=null&&pass!=null) { try{ Class.forName("com.mysql.jdbc.Driver"); Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root"); String sql="insert into user(username,password)values(?,?)"; PreparedStatement ps=con.prepareStatement(sql); ps.setString(1,name); ps.setString(2,pass); int row=ps.executeUpdate(); if(row>0) { out.write("success"); System.out.print("成功"); } else { out.write("failed"); System.out.print("失败"); } ps.close(); con.close(); }catch (Exception e) { e.printStackTrace(); } } else{ out.write("failed"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Android端代码:
布局文件就不分享了,每个人可以根据自己的喜好设计,总的来说只要包含“登录”和“注册”的Button,用户名和密码的EditText就行了,客户端中我就把登录注册的功能写上了,也不加其他额外的功能比如说判断是否有网络之类的,切入主题,简单明了,代码过多反而画蛇添足了。
几个需要注意的点:
1.由于需要网络,必须在AndroidManifest清单文件中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
2.其中的IP是自己发布的后台的地址,当然,如果是有云服务器或者是互联网上存在的地址那就更好了,直接就有IP地址了。
没有的话,可以参照我的方法:手机连上笔记本电脑或者是路由器的wifi,使自己的手机和电脑保持在同一网络,然后查询自己电脑的Ipv4地址,再加上自己的Servlet后缀名,就得到后台IP。
3.我这里使用了当前流行的Android网络框架okHttp,需要在build.gradle中添加依赖:
compile 'com.squareup.okhttp3:okhttp:3.4.1'
首先是登录功能:
public class MainActivity extends AppCompatActivity { private EditText username, password; private Button loginButton,registerButton; private String responseData,name,pass; private final String IP="http://192.168.1.4:8080/serve/login"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loginButton = (Button) findViewById(R.id.loginButton); registerButton = (Button) findViewById(R.id.registerButton); username = (EditText) findViewById(R.id.usernames); password = (EditText) findViewById(R.id.passwords); registerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, RegActivity.class); startActivity(intent); } }); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { pass = password.getText().toString(); name = username.getText().toString(); if (name.length()<1||pass.length()<1) { Toast.makeText(MainActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();} else{ new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client=new OkHttpClient(); RequestBody requestBody=new FormBody.Builder().add("username",name).add("password",pass).build(); Request request=new Request.Builder().url(IP).post(requestBody).build(); Response response=client.newCall(request).execute(); responseData=response.body().string(); if(responseData.equals("success")) { Intent intent = new Intent(MainActivity.this, ExtraActivity.class); startActivity(intent);} }catch (Exception e){ e.printStackTrace();} } }).start();} } }); } }由于逻辑处理功能在在后台就完成了,因此注册功能和登录功能的代码几乎完全相同,利用网络框架okHttp发送post请求到服务器端,根据返回值写对应的客户端逻辑。怎么样,看到这里,是不是感觉非常简单呢?自己赶快动手实验一下吧!