相信学习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请求到服务器端,根据返回值写对应的客户端逻辑。怎么样,看到这里,是不是感觉非常简单呢?自己赶快动手实验一下吧!