这阵子一直在了解服这里务器端与客户端的交互,对这方面真的不熟悉,在这里记录一下。
服务器端:
类截图:
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里吧。整个过程就这样,有任何错误欢迎批评指教。