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

来源:互联网 发布:五笔拼音输入法mac版 编辑:程序博客网 时间:2024/06/05 13:25

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

服务器端:

类截图:

                              

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 blocke.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 blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.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 blocke.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 stubcharEncoding = 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 stubif(!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里吧。整个过程就这样,有任何错误欢迎批评指教。

0 0
原创粉丝点击