Android开发用MyEclipse作为服务器端访问MySQL数据库,并把某张表解析成xml格式输出到浏览器,客户端解析获取xml数据

     这阵子一直在了解服这里务器端与客户端的交互,对这方面真的不熟悉,在这里记录一下。

服务器端:

类截图:

                              

1、MyEclipse连接数据库

     先建立一个gongjDBUtil.java类用于连接数据库,在这里要导入连接MySQL一个外包:mysql-connector-java-5.1.38-bin-jar。

public class DBUtil {
	
  public void closeConn(Connection conn){
	  try {
		conn.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  }
  public Connection openConnection(){
	  String driver=null;
	  String url=null;
	  String username=null;
	  String password=null;	  
	  try {		
		driver="com.mysql.jdbc.Driver";
		url="jdbc:mysql://localhost:3306/javademo";
		username = "root";
	    password = "root";
	    
	    Class.forName(driver);
	    
	    return DriverManager.getConnection(url, username, password);
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	  return null;
  }
}

数据库的username和password要跟你电脑自己数据库一样,Javademo是我的数据库的名字,写的时候换成自己的数据库名字就行。

2、接下来要将数据库的一张表解析成xml格式,要先建一个实体类,这里以Menu.java为例。

public class Menu {
	private int id;
	private int price;
    private int typeId;
    private String name;
    private String pic;
    private String remark;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getTypeId() {
		return typeId;
	}
	public void setTypeId(int typeId) {
		this.typeId = typeId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPic() {
		return pic;
	}
	public void setPic(String pic) {
		this.pic = pic;
	}
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
    
    
}

3、新建Update.java用于执行同步,即更新Android SQLite数据库中的数据

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;


public class Update {
	
  public List<Menu> getMenuList(){
	  String sql =" select id,typeId,price,name,pic,remark from Menu ";
	  DBUtil util=new DBUtil();
	  Connection conn=util.openConnection();
	  
	  try {
		  //获得预定义语句
		Statement pstmt=conn.createStatement();
		//查询SQL语句
		ResultSet rs=pstmt.executeQuery(sql);
		 List<Menu> list = new ArrayList<Menu>();
		 
		 while(rs.next()){
			 int id=rs.getInt(1);
			 int typeId = rs.getInt(2);
			 int price = rs.getInt(3);
	         String name = rs.getString(4);
	         String pic = rs.getString(5);
		     String remark = rs.getString(6);
		     
		     Menu m=new Menu();
		     m.setId(id);
		     m.setName(name);
		     m.setPic(pic);
	         m.setPrice(price);
	         m.setRemark(remark);
             m.setTypeId(typeId);
             
             list.add(m);
		 }
		 
		 return list;
		
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
		util.closeConn(conn);
	}
	return null;
  }
}

4、新建一个servlet文件 UpdateMenuServlet.java

public class UpdateMenuServlet extends HttpServlet {
	 private static final long serialVersionUID = 1L;
	 
	 public UpdateMenuServlet() {
		         super();	    
	}
	 public void destroy(){
		 super.destroy();
	 }
	 
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/xml");
		PrintWriter out = response.getWriter();
		Update dao=new Update();
		List<Menu> list=dao.getMenuList();
		out.println("<?xml version='1.0' encoding='UTF-8'?>");
		out.println("<menulist>");
		for(int i=0;i<list.size();i++){
		    Menu m=list.get(i);
		    out.println("<menu>");		    
		 // 菜谱编号
		    out.print("<id>");
            out.print(m.getId());
		    out.println("</id>");
		    // 分类
		     out.print("<typeId>");
		     out.print(m.getTypeId());
		     out.println("</typeId>");
		     // 名称
		     out.print("<name>");
		     out.print(m.getName());
		     out.println("</name>");
		      // 图片路径
		     out.print("<pic>");
		     out.print(m.getPic());
		     out.println("</pic>");
		     // 价格
		     out.print("<price>");
		     out.print(m.getPrice());
		     out.println("</price>");
		     // 备注
		     out.print("<remark>");
		     out.print(m.getRemark());
		     out.println("</remark>");
		                       
		     out.println("</menu>");

			 
		}
		out.println("</menulist>");
	
		out.flush();
		out.close();
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request,response);
	}
	public void init() throws ServletException {
		    }
}
5、最后部署tomcat,在浏览器中输入URL,就可得到xml数据啦。

部署tomcat:


点击旁边绿色的三角形start tomcat,再点击旁边那个地球形状的图标,输入URL



蹬蹬蹬,成功,里面的数据是我数据库Menu表的数据。

6、有个包我们还没用到小伙伴有没有注意到。Filter包下有个EncodingFilter.java类。这个类是防止中文乱码的,师兄教我的,说像万金油一样,哪里都可以使用。

public class EncodingFilter implements  Filter{
	
	private String charEncoding = null;	
	
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		charEncoding = filterConfig.getInitParameter("encoding");
		if(charEncoding == null){
			new ServletException("EncodingFilter中charEncoding的设置为空");
		}
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		if(!charEncoding.equals(request.getCharacterEncoding())){
			request.setCharacterEncoding(charEncoding);
		}
		response.setCharacterEncoding(charEncoding);
		chain.doFilter(request, response);
	}

	public void destroy() {
		// TODO Auto-generated method stub
		
	}	

}
得在WebRoot/WEB-INF/web.xml文件下声明:


服务器端的写完了,细节也兼顾到了。接下来就是客户端了。我已经把数据库的数据以xml格式发布到浏览器了,就等着客户端来用了。

客户端:

1、先建立一个工具类HttpUtil.java,用于执行网络请求和解析xml文件

import android.util.Log;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.StringReader;

/**
 * Created by Administrator on 2016/5/18.
 */
public class HttpUtil {
    /**
     * 网络请求
     * @param url
     * @return
     */
 public static String httpGet(String url){
     HttpGet httpGet=new HttpGet(url);
     String strResult=null;
     BasicHttpParams httpParams=new BasicHttpParams();
     HttpConnectionParams.setConnectionTimeout(httpParams,10000);
     HttpConnectionParams.setSoTimeout(httpParams,10000);

     HttpClient httpClient;
     try {
         httpClient=new DefaultHttpClient();
         HttpResponse response=httpClient.execute(httpGet);
         if (response.getStatusLine().getStatusCode()==200){
             HttpEntity entity=response.getEntity();
             strResult= EntityUtils.toString(entity,"UTF-8");
         }
     } catch (IOException e) {
         e.printStackTrace();
     }

        return strResult;
 }

    /**
     * 解析xml文件
     * @param xmlData
     */
    public static void parseXmlWithPull(String xmlData){
        try {
            XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser=factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType=xmlPullParser.getEventType();
            String id="";
            String typeId="";
            String price="";
            String remark="";
            String pic="";
            String name="";
            while (eventType!=XmlPullParser.END_DOCUMENT){
                String nodeName=xmlPullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if ("id".equals(nodeName)) {
                            id = xmlPullParser.nextText();
                        } else if ("typeId".equals(nodeName)) {
                            typeId = xmlPullParser.nextText();
                        }else if ("price".equals(nodeName)){
                            price=xmlPullParser.nextText();
                        }else if ("pic".equals(nodeName)){
                            pic=xmlPullParser.nextText();
                        }else if ("remark".equals(nodeName)){
                            remark=xmlPullParser.nextText();
                        }else if ("name".equals(nodeName)){
                            name=xmlPullParser.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("menu".equals(nodeName)){
                            Log.d("ParseXmlActivity","id is "+id);
                            Log.d("ParseXmlActivity","typeId is "+typeId);
                            Log.d("ParseXmlActivity","price is "+price);
                            Log.d("ParseXmlActivity","name is "+name);
                            Log.d("ParseXmlActivity","remark is "+remark);
                            Log.d("ParseXmlActivity","pic is "+pic);
                        }
                        break;
                    default:
                        break;
                }
                eventType=xmlPullParser.next();
            }

        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解析xml格式数据有pull解析和SAX解析等,我这里用的是pull解析方式,可以用SAX解析方式试一下。 得到数据可以有很多用途,这里我只是简单的把数据打印在logcat上。

2、在activity中调用

public class ParseXmlActivity extends Activity {

    TextView tv_data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.parsexml);

        tv_data= (TextView) findViewById(R.id.data);
        final String url="http://192.168.56.1:8080/gxq/UpdateMenuServlet";
        new Thread(new Runnable() {
            @Override
            public void run() {
             String xmlData= HttpUtil.httpGet(url);
                Log.d("xmldata",xmlData);
                HttpUtil.parseXmlWithPull(xmlData);
            }
        }).start();
    }
}

parse.xml文件只有个TextView就不贴代码了。

这里要注意的是URL:

url="http://192.168.56.1:8080/gxq/UpdateMenuServlet"
url="http://localhost(或127.0.0.1或ip地址):8080(端口号)/projectName/servletName",因为我的服务端和客户端都是同一台电脑,所以不能用localhost或者127.0.0.1,192.168.56.1是我电脑的IP地址。这里简单的开启一个线程来显示数据(主线程不能有耗时操作,不要忘了在Manifes文件里添加网络权限)。完成
运行,观察logcat:


数据出来了,感动啊呜呜。一般实际应用是把数据装在listview里吧。整个过程就这样,有任何错误欢迎批评指教。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值