1.服务器代码
struts.xml添加如下代码
<package name="activity" namespace="/" extends="json-default">
<action name="loginActivity" class="jxnu.edu.cn.x3321.action.LoginActivityAction"
method="loginActivity">
<result type="json">
<!-- 返回类型一定要设置成json,不设置返回页面 -->
</result>
</action>
</package>
实体类和数据库工具类见之前的代码
UserDao
在/WebContent/WEB-INF/lib下添加以下6个用于解析json数据的jar包
UserServiceImpl.java
public class UserServiceImpl implements UserService {
DbConnection db=new DbConnection();
ResultSet rs=null;
@Override
public boolean loginCheck(String userName, String passWord) {
boolean bl=false;
//System.out.println("in loginCheck..."+userName);
String strSql="select * from user_a where userName='"+userName+"'";
//System.out.println("in loginCheck..."+strSql);
rs=db.executeQuery(strSql);
try {
while(rs.next()) {
bl=true;
break;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bl;
}
}
LoginActivityAction.java
public class LoginActivityAction extends ActionSupport {
String userName;
String passWord;
UserService us=new UserServiceImpl();
HttpServletResponse response=ServletActionContext.getResponse();
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
/*
* 无返回对象(与返回给jsp页面的区别)
*/
public void loginActivity() {
System.out.println("in action...."+userName);
JSONObject jsonObject=new JSONObject();
System.out.println("in action second..."+userName);
//JSON对象共享,但服务器和客户端导入的包不一致 这里导入的:net.sf.json.JSONObject
if(us.loginCheck(userName, passWord)) {
jsonObject.put("message", "欢迎"+userName+"登录!");
}else {
jsonObject.put("message", "非法登录!");
}
try {
response.setContentType("text/json;charset=utf-8");//设置客户端显示内容的方式
response.setCharacterEncoding("utf-8");//网络中传输格式
byte[] bytes=jsonObject.toString().getBytes("utf-8");
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.客户端代码
AndroidManifest.xml中需要配置网络权限
<uses-permission android:name="android.permission.INTERNET"/>
布局界面如下:
登陆工具类LoginUtil.java
public class LoginUtil {
/*
* http:// 代表服务器使用的是HTTP通信协议
* 10.0.2.2 代表服务器的ip地址
* 8080 代表服务器监听的端口号
* loginActivity与struts.xml中的action的name值一致
*/
private static String URL="http://10.0.2.2:8080/服务器端的工程名/loginActivity.action?";
public String loginToServer(String userName,String passWord) {
//System.out.println("in loginUtil..."+userName);
String result="";
String strURL=URL+"userName="+userName+"&passWord="+passWord;
HttpClient hc=new DefaultHttpClient();
HttpPost request=new HttpPost(strURL);
//System.out.println("in loginUtil...."+strURL);
HttpResponse response=null;
try {
response=hc.execute(request);
if(response.getStatusLine().getStatusCode()==200) {
//System.out.println("in loginUtil..."+response.getStatusLine().getStatusCode());
//取得服务器传来的json对象
HttpEntity entity=response.getEntity();
String strJson=EntityUtils.toString(entity,"utf-8");//这里仍然乱码,还要继续还原成json对象
if(strJson!=null) {
//System.out.println("in loginUtil response..."+strJson);
//这里导入的包为org.json
JSONObject jsonObject=new JSONObject(strJson);
result=jsonObject.getString("message").toString();
//System.out.println("in loginUtil....result="+strURL);
}
}else {
result="没有网络或服务器连接不上";
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
LoginActivity.java
public class LoginActivity extends Activity {
EditText userNameEt,passWordEt;
Button loginBt,cancelBt;
String userName,passWord;
String strResult="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
loginBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
userName=userNameEt.getText().toString().trim();
passWord=passWordEt.getText().toString().trim();
if(userName==null||userName.equals("")||
passWord==null||passWord.equals("")) {
Toast.makeText(getApplicationContext(), "输入完整的登陆信息",Toast.LENGTH_LONG).show();
}else {
//访问网络要放在线程中
new AsyncTask<String,Void,String>(){
@Override
protected String doInBackground(String... params) {
//System.out.println("in asyncTask...");
//访问服务器端
LoginUtil lu=new LoginUtil();
strResult=lu.loginToServer(userName, passWord);
return strResult;
}
protected void onPostExecute(String strResult) {
//!!!!对话框一定是写在这里
AlertDialog.Builder bd=new Builder(LoginActivity.this);
bd.setTitle("对话框");
bd.setMessage(strResult);
bd.setPositiveButton("确定",null);
bd.create().show();
}
}.execute("");
}
}
});
}
private void init() {
userNameEt=(EditText)this.findViewById(R.id.et_userName);
passWordEt=(EditText)this.findViewById(R.id.et_passWord);
loginBt=(Button)this.findViewById(R.id.bt_ok);
cancelBt=(Button)this.findViewById(R.id.bt_cancel);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}