android的httppost方法访问本地web服务(一)

   本篇文章比较长,包括两大部分,第一部分是创建一个web服务来响应android客户端的 post请求,另一部分是android客户端的提交post请求。用到的工具是编写android的eclipse,和部署好tomcat服务的myeclipse。

  我的实例是用android客户端向服务端发送post请求,来查询某个用户是否存在

  第一部分创建一个myweb工程,创建一个LoginAction类,继承了HttpServlet,它会响应你的httppost的请求。代码如下

  

package com.android.Login;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONSerializer;

public class LoginAction extends HttpServlet {
	private static final long serialVersionUID=1L;
	private LoginService service;
	/**
	 * 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
	 */
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		service=new LoginDao();
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.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;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter writer=response.getWriter();
		//获得客户端提交表单数据
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		List<Object> params=new ArrayList<Object>();
		params.add(username);
		params.add(password);
		boolean flag=service.isUserExitLogin(params);<span style="font-family: Arial, Helvetica, sans-serif;">/*调用isUserExitLogin方法判断这个用户是否存在。true为查询的用户存在,false为不存在*/</span>
		if(flag){
			ResultMessage message=new ResultMessage(1, "登陆成功");//把结果信息封装
			Map<String,Object> map=new HashMap<String,Object>();
			map.put("result", message);
			String jsonString=JSONSerializer.toJSON(map).toString();//结果封装成json然后传给客户端,客户端再进行解析。
			writer.println(jsonString);//把封装好的显示在网页上
		}
		writer.flush();
		writer.close();
	}

}
 定义一个接口LoginService,他只有一个方法就是查询用户是否存在。
package com.android.Login;

import java.util.List;

public interface LoginService {
	//判断用户是否存在
	public boolean isUserExitLogin(List<Object> params);
}
再定义一个LoginDao类来实现这个接口
package com.android.Login;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

import com.jdbc.db.DBManager;//这个类的代码我会在下面给出,这是个db的工具类
public class LoginDao implements LoginService {
	
	public DBManager manager;
	public LoginDao() {
		// TODO Auto-generated constructor stub
		manager=DBManager.getInstance();
	
	}
	@Override
	public boolean isUserExitLogin(List<Object> params) {
		// TODO Auto-generated method stub
		String sql="select * from test.userinfo where username = ? and password = ? ";//预处理方式。可以参考<a target=_blank href="http://blog.csdn.net/california94/article/details/49816573" target="_blank">预处理</a>。
		Connection connection=manager.getConnection();
		Map<String,Object> map=null;
		boolean flag=false;
		try {
			map=manager.querySimpleMap(sql, params);
			flag=map.isEmpty()? false:true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return flag;
	}

}
我的db工具类,用它来访问数据库来验证用户是否存在,我用的是mysql数据库

package com.jdbc.db;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.management.Query;

/**
 * 负责访问数据库的工具类
 * 
 * @author jack
 * 
 */
public class DBManager {

	// 数据库的用户名和密码
	public String user = "****;
	public String password = "*****";
	// 数据库的驱动
	public  String DRIVER = "com.mysql.jdbc.Driver";
        //驱动下载地址<a target=_blank href="http://download.csdn.net/detail/california94/9266253" target="_blank">点击打开链接</a>
	public String url = "jdbc:mysql://localhost:3306/test";//test是我建立的数据库
	public  Connection connection=null;// 链接数据库
	private PreparedStatement pstmt;// 采用预编译的sql语句执行添加、删除、修改和查询的功能,效率高
	private ResultSet rs;// 查询返回的结果集合
	private static DBManager instance;

	private DBManager() {
		// TODO Auto-generated constructor stub
		try {
			Class.forName(DRIVER);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}

	}

	public Connection getConnection() {
		try {
			connection=DriverManager.getConnection(url, user, password);
			if(!connection.isClosed()){
				System.out.println("连接成功");
			}else{
				System.out.println("连接失败");
			}
		
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return connection;
	}

	/**
	 * 使用单例模式获得数据库的访问对象:保证数据的安全性
	 * 
	 * @return
	 */
	public static DBManager getInstance() {
		if (instance == null) {
			instance = new DBManager();
		}
		return instance;
	}

	/**
	 * 释放连接:
	 */
	public void releaseConn() {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
				// TODO: handle exception
			}

		}
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}

	/**
	 * 功能:对数据库的表的添加删除和修改功能
	 * 
	 * @param sql
	 *            传递的Sql语句
	 * @param params
	 *            sql的占位符
	 * @return
	 */
	public boolean updateBySql(String sql, List<Object> params)
			throws SQLException {
		boolean flag = false;
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		// 影响数据库的行数,如果大于0 表示操作成功
		int count = pstmt.executeUpdate();
		flag = count > 0 ? true : false;
		return flag;
	}

	/**
	 * 使用java的 反射机制封装查询,查询返回单条记录
	 * 
	 * @param <T>
	 * @param sql
	 * @param params
	 * @param cls
	 * @return
	 */
	public <T> T querySimleResultRef(String sql, List<Object> params,
			Class<T> cls) throws Exception {
		T t = null;
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		// 查询结果
		rs = pstmt.executeQuery();
		ResultSetMetaData metaData = rs.getMetaData();
		int cols_len = metaData.getColumnCount();
		if (rs.next()) {
			t = cls.newInstance();
			for (int i = 0; i < cols_len; i++) {
				String cols_name = metaData.getColumnName(i + 1);
				Object cols_value = rs.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}
				Field field = cls.getDeclaredField(cols_name);
				field.setAccessible(true);
				field.set(t, cols_value);
			}
		}
		return t;
	}

	/**
	 * 使用java的 反射机制封装查询,查询返回多条记录
	 * 
	 * @param <T>
	 * @param sql
	 * @param params
	 * @param cls
	 * @return
	 * @throws Exception
	 */
	public <T> List<T> queryMultResultRef(String sql, List<Object> params,
			Class<T> cls) throws Exception {
		List<T> list = new ArrayList<T>();
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		rs = pstmt.executeQuery();
		ResultSetMetaData metaData = rs.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (rs.next()) {
			T t = cls.newInstance();
			for (int i = 0; i < cols_len; i++) {
				String cols_name = metaData.getColumnName(i + 1);
				Object cols_value = rs.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}
				Field field = cls.getDeclaredField(cols_name);
				field.setAccessible(true);
				field.set(t, cols_value);
			}
			list.add(t);
		}
		return list;
	}

	/**
	 * 使用封装查询,查询返回一个Map表示一行记录
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public Map<String, Object> querySimpleMap(String sql, List<Object> params)
			throws SQLException, ClassNotFoundException {
		
		Map<String, Object> map = new HashMap<String, Object>();
		//System.out.println(sql);
	
		try {
			pstmt = connection.prepareStatement(sql);
			int index = 1;
			if (params != null && !params.isEmpty()) {
				for (int i = 0; i < params.size(); i++) {
					pstmt.setObject(index++, params.get(i));
				}
			}
			rs = pstmt.executeQuery();
		}catch(Exception ee){
			System.out.println(ee.getMessage());
		}	
		ResultSetMetaData metaData = rs.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (rs.next()) {
			for (int i = 0; i < cols_len; i++) {
				String key = metaData.getColumnName(i + 1);
				Object value = rs.getObject(key);
				if (value == null) {
					value = "";
				}
				map.put(key, value);
			}
		}
		return map;
	}

	/**
	 * 使用封装查询,查询返回一个List<Map<String, Object>>表示多行记录
	 * 
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public List<Map<String, Object>> queryMultMap(String sql,
			List<Object> params) throws SQLException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		rs = pstmt.executeQuery();
		ResultSetMetaData metaData = rs.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (rs.next()) {
			Map<String, Object> map = new HashMap<String, Object>();
			for (int i = 0; i < cols_len; i++) {
				String key = metaData.getColumnName(i + 1);
				Object value = rs.getObject(key);
				if (value == null) {
					value = "";
				}
				map.put(key, value);
			}
			list.add(map);
		}
		return list;
	}
//这里是我测试连接情况的测试代码
	/*public static void main(String[] args){
		DBManager db=new DBManager();
		Connection conn=db.getConnection();
		String sql="select * from test.userinfo where username = ? and password = ? ";
		Map<String,Object> map=null;
		boolean flag=false;
		String usernameString="admin";
		String userpassword="123";
		List <Object> params=new ArrayList<Object>();
		params.add(usernameString);
		params.add(userpassword);
		try {
			map=db.querySimpleMap(sql, params);
			flag=(map.isEmpty()?false:true);
			System.out.println("--->>"+flag);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		db.releaseConn();
	}*/
}

最后是创建的一个ResultMessage它用来封装结果信息的。
package com.android.Login;

public class ResultMessage {
	private int resultCode;//结果码
	private String resultMsaaage;//结果信息
	
    public int getResultCode() {
		return resultCode;
	}
	public void setResultCode(int resultCode) {
		this.resultCode = resultCode;
	}
	public String getResultMsaaage() {
		return resultMsaaage;
	}
	public void setResultMsaaage(String resultMsaaage) {
		this.resultMsaaage = resultMsaaage;
	}
	public ResultMessage() {
		// TODO Auto-generated constructor stub
	}
	public ResultMessage(int resultCode, String resultMsaaage) {
		super();
		this.resultCode = resultCode;
		this.resultMsaaage = resultMsaaage;
	}
}
package com.android.Login;

public class ResultMessage {
	private int resultCode;//结果码
	private String resultMsaaage;//结果信息
	
    public int getResultCode() {
		return resultCode;
	}
	public void setResultCode(int resultCode) {
		this.resultCode = resultCode;
	}
	public String getResultMsaaage() {
		return resultMsaaage;
	}
	public void setResultMsaaage(String resultMsaaage) {
		this.resultMsaaage = resultMsaaage;
	}
	public ResultMessage() {
		// TODO Auto-generated constructor stub
	}
	public ResultMessage(int resultCode, String resultMsaaage) {
		super();
		this.resultCode = resultCode;
		this.resultMsaaage = resultMsaaage;
	}
}
好了,部署到你的tomcat上之后就可以测试了。我在数据库里建立了一个userinfo表,里面有一条信息是username="admin",password=123;打开网页输入http://localhost:8080/myweb/servlet/LoginAction?username=admin&password=123如果在页面上打印出结果信息,说明服务器端成功了。


上面的那条信息就是要返回给客户端的ResultMessage信息。它用json封装好了,我在文章的最后会给出json的jar包的。下面我们就开始建立android客户端了

请点击下一篇文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值