一 服务器准备:
本文使用Tomcat 6做服务器。
本文搭建服务器端使用MyEclipse 10。
首先准备好Tomcat 6与MyEclipse 10,并且将服务器配置到MyEclipse中,对于长期做JavaWeb的同学来说,当然知道了,在此不做赘述了。
新建Web项目MyDemo,代码如下:
然后在项目中新建一个Servlet,具体如下:
Login.java:
package cn.clear.demo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("这是get请求"); response.setContentType("text/html;charset=utf-8"); String userName = request.getParameter("username"); String userPass = request.getParameter("userpass"); System.out.println(userName + " " + userPass); if (userName != null || userPass != null) { if (userName.equals("clear") && userPass.equals("123456")) { response.getWriter().write("恭喜" + userName + "登陆成功!"); } else { response.getWriter().write("用户名或者密码错误!"); } } else { response.getWriter().write("用户名或者密码为空!"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("这是post请求"); response.setContentType("text/html;charset=utf-8"); String userName = request.getParameter("username"); String userPass = request.getParameter("userpass"); System.out.println(userName + " " + userPass); if (userName != null || userPass != null) { if (userName.equals("clear") && userPass.equals("123456")) { response.getWriter().write("恭喜" + userName + "登陆成功!"); } else { response.getWriter().write("用户名或者密码错误!"); } } else { response.getWriter().write("用户名或者密码为空!"); } } }
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>Login</servlet-name> <servlet-class>cn.clear.demo.Login</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
启动服务器,使用http://10.0.1.72:8080/MyDemo/login访问,如果成功,此时MyEclipse的Console中将会显示:
这是get请求
null null
浏览器将显示:用户名或者密码为空!
这是因为我们没有使用传入任何参数。但是已经成功搭建并启动好一个简单的服务器。如果在浏览器地址栏中加入参数访问的话http://10.0.1.72:8080/MyDemo/login?username=clear&userpass=123456
则Console中会打印:
这是get请求
clear 123456
浏览器显示:恭喜clear登陆成功!
表示我们的服务器接收参数和一系列交互是没有问题的。那么下面就可以搭建Android客户端代码了。
二 客户端:
准备好android开发环境,我这里使用的开发工具是android studio。
Sdk版本如下:
新建项目LoginDemo,让它自动生成MainActivity.java与activity_main.xml:
加入android-async-http框架jar包(具体请去https://github.com/loopj/android-async-http下载):android-async-http-1.4.7.jar
修改activity_main.xml中的代码,具体如下:
<TableLayout 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:stretchColumns="1"> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:textColor="#ff7b09ff" android:text="用户名:"/> <EditText android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColorHint="#ffabb3ff" android:hint="请输入您的用户名"/> </TableRow> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:textColor="#ff7b09ff" android:text="密 码:"/> <EditText android:id="@+id/et_pass" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="textPassword" android:textColorHint="#ffabb3ff" android:hint="请输入您的密码"/> </TableRow> <TableRow > <Button android:id="@+id/login" android:onClick="login" android:layout_height="wrap_content" android:layout_span="2" android:text="登陆"/> </TableRow> <TextView android:id="@+id/result" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="内容显示区"/> </TableLayout>
这样建立一个登陆界面:
修改MainActivity.java的代码:
package com.app.logindemo; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import org.apache.http.Header; public class MainActivity extends Activity { private EditText et_name,et_pass; private TextView tv_result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //获取控件的对象 et_name = (EditText) findViewById(R.id.et_name); et_pass = (EditText) findViewById(R.id.et_pass); tv_result = (TextView) findViewById(R.id.result); } //点击登陆按钮事件 public void login(View v){ int id = v.getId(); switch (id){ case R.id.login: //获取用户名和密码 String userName = et_name.getText().toString(); String userPass = et_pass.getText().toString(); if (TextUtils.isEmpty(userName.trim()) || TextUtils.isEmpty(userPass.trim())){ Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_LONG).show(); }else{ //如果用户名和密码已经输入,则进入以下方法 loginByAsyncHttpClientPost(userName, userPass); //loginByAsyncHttpClientGet(userName,userPass); } break; } } //post请求 private void loginByAsyncHttpClientPost(String userName, String userPass) { //创建异步请求对象 AsyncHttpClient client = new AsyncHttpClient(); //输入要请求的url String url = "http://10.0.1.72:8080/MyDemo/login?"; //String url = "http://www.baidu.com"; //请求的参数对象 RequestParams params = new RequestParams(); //将参数加入到参数对象中 params.put("username",userName); params.put("userpass",userPass); //进行post请求 client.post(url, params, new AsyncHttpResponseHandler() { //如果成功 @Override public void onSuccess(int i, Header[] headers, byte[] bytes) { //i代表状态码 if (i == 200){ tv_result.setText(new String(bytes)); } } //如果失败 @Override public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { //打印异常信息 throwable.printStackTrace(); } }); } //get请求 private void loginByAsyncHttpClientGet(String userName, String userPass) { AsyncHttpClient client = new AsyncHttpClient(); //String url = "http://www.baidu.com"; String url = "http://10.0.1.72:8080/MyDemo/login?"; RequestParams params = new RequestParams(); params.put("username",userName); params.put("userpass",userPass); client.get(url, params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int i, Header[] headers, byte[] bytes) { Log.d("请求响应码",i+""); for (int ii = 0; ii < headers.length;ii++){ Header header = headers[ii]; Log.d("values","header name:"+header.getName()+" value:"+header.getValue()); } tv_result.setText(new String(bytes)); } @Override public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { throwable.printStackTrace(); } }); } }
上面代码53行和54行依次进行测试。
在AndroidManifest.xml中要加入网络访问授权,具体代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.app.logindemo" > <!--网络授权--> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
所有代码都完成后启动模拟器会跳转到上图界面:
不输入用户名和密码,则会提示“用户名或密码不能为空”
随便输入一个用户名和密码,点击登陆会提示:
同时在MyECLipse中Console会打印:
这是post请求
sdfdsf sdfdfs
输入正确的用户名clear和密码123456,则界面会显示:
这样就实现了android客户端与服务端的数据交互,是不是很开心。
在此注意一定要进行网络授权,否则会报错且访问不了服务器。