web服务器端代码:返回两种格式的数据json和xml
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<News> list=newsDao.newList();
String format=request.getParameter("format");
if("json".equals(format)){
StringBuilder data=new StringBuilder();
data.append("[");
for (News news : list) {
data.append("{");
data.append("id:").append(news.getId()).append(",");
data.append("name:\"").append(news.getName()).append("\",");
data.append("date:\"").append(news.getDate()).append("\"");
data.append("},");
}
data.deleteCharAt(data.length()-1);
data.append("]");
request.setAttribute("json", data.toString());
request.getRequestDispatcher("/jsonnews.jsp").forward(request, response);
}else{
request.setAttribute("newslist", list);
request.getRequestDispatcher("/news.jsp").forward(request, response);
}
}
Android客户端:访问服务器并解析返回的json或xml数据
1.解析json数据
/**
* 获取json数据
* @return
* @throws Exception
*/
public static List<News> getJSONNews()throws Exception{
String path="http://192.168.1.186:8080/web/NewsServlet?format=json";
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
if(conn.getResponseCode()==200){
InputStream inStream=conn.getInputStream();
return parseJSON(inStream);
}
return null;
}
private static List<News> parseJSON(InputStream inStream)throws Exception {
List<News> list=new ArrayList<News>();
//DataTool帮助类
byte[] data=DataTool.read(inStream);
String text=new String(data,"utf-8");
JSONArray array=new JSONArray(text);
for (int i = 0; i < array.length(); i++) {
JSONObject object=array.getJSONObject(i);
int id=object.getInt("id");
String name=object.getString("name");
String date=object.getString("date");
list.add(new News(id, name, date));
}
return list;
}
帮助类DataTool.java
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class DataTool {
public static byte[] read(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=0;
while((len=inStream.read(buffer))!=-1){
outStream.write(buffer,0,len);
}
return outStream.toByteArray();
}
}
2.解析xml数据
/**
* 获取xml数据
* @return
* @throws Exception
*/
public static List<News> getNews()throws Exception{
String path="http://192.168.1.186:8080/web/NewsServlet";
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
if(conn.getResponseCode()==200){
InputStream inStream=conn.getInputStream();
return parseXml(inStream);
}
return null;
}
/**
* 解析xml
* @param inStream
* @return
* @throws Exception
*/
private static List<News> parseXml(InputStream inStream) throws Exception {
List<News> list=new ArrayList<News>();
News news=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(inStream, "utf-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_TAG:
if("news".equals(parser.getName())){
int id=Integer.parseInt(parser.getAttributeValue(0));
news=new News();
news.setId(id);
}
if("title".equals(parser.getName())){
String name=parser.nextText();
news.setName(name);
}
if("date".equals(parser.getName())){
String date=parser.nextText();
news.setDate(date);
}
break;
case XmlPullParser.END_TAG:
if("news".equals(parser.getName())){
list.add(news);
news=null;
}
break;
}
event=parser.next();
}
return list;
}
最后在MainActivity类中实现将数据显示到页面
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//android3.0以上需要调用此方法才能访问网络
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite数据库操作
.detectLeakedClosableObjects()
.penaltyLog() //打印logcat
.penaltyDeath()
.build());
listview=(ListView)findViewById(R.id.newslist);
try {
List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();
List<News> list=NewsService.getJSONNews();
for (News news : list) {
Map<String, Object> map=new HashMap<String, Object>();
map.put("u_id", news.getId().toString());
map.put("name", news.getName());
map.put("date", news.getDate());
data.add(map);
}
SimpleAdapter adapter=new SimpleAdapter(this, data, R.layout.items, new String[]{"u_id","name","date"}, new int[]{R.id.u_id,R.id.name,R.id.date});
listview.setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.error, Toast.LENGTH_SHORT).show();
}
}
页面的布局就不再放了,就是一个listview控件