andriod和服务器间的josn交互 servlet服务器jsonandroid 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 采用gson这个jar包吧,非常方便。 这里android和web没有区别,把需要传递的数据封装成对象,然后转换成字符串通过post传递。下面附上封装好的几个常用方法:import java.net.URLEncoder;import java.util.ArrayList;import java.util.Arrays;import com.google.gson.Gson;/** * json字符串 和对象互换 工具类 * 依赖Gson包 * @see com.google.gson.Gson * @author devil * */public class JsonUtil { /** * 将json字符串转换成对象 * * @param json * @param type * @return */ public static <T> T parse(String json, Class<T> type) { Gson gson = new Gson(); T t = null ; try { t = gson.fromJson(json, type) ; } catch (Exception e) { e.printStackTrace() ; return null ; } return t; } /** * 将json转成数组 * * @param json * @param type * @return */ public static <T> T[] parseArr(String json, Class<T[]> type) { return parse(json, type); } /** * 将json转成集合 * * @param json * @param type * @return */ public static <T> ArrayList<T> parseList(String json, Class<T[]> type) { return new ArrayList<T>(Arrays.asList(parse(json, type))); } /** * 将对象转成json字符串 * * @param o * @return */ public static String format(Object o) { Gson gson = new Gson(); return gson.toJson(o); } /** * 将对象转成json字符串 并使用url编码 * @param o * @return */ public static String formatURLString(Object o) { try { return URLEncoder.encode(format(o), "utf-8"); }catch (Exception e) { return null; } }} 具体的应该怎么用post传递呢?谢谢 HttpPost httpPost = new HttpPost(url); try { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username", username)); httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); DefaultHttpClient httpclient = new DefaultHttpClient(); HttpConnectionParams.setConnectionTimeout(httpPost.getParams(), 10000);//设置连接超时 HttpConnectionParams.setSoTimeout(httpPost.getParams(), 10000); //设置请求超时 HttpResponse httpResponse =httpclient.execute(httpPost); if(httpResponse.getStatusLine().getStatusCode()==200){//成功响应了请求 http请求网上代码一大堆。public static String postHttpResponseText(String url, String post) { BufferedReader reader = null; HttpURLConnection conn = null; try { URL httpUrl = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) httpUrl .openConnection(); // //设置连接属性 httpConn.setDoOutput(true);// 使用URL 连接进行输出 httpConn.setDoInput(true);// 使用 URL 连接进行输入 httpConn.setUseCaches(false);// 忽略缓存 httpConn.setRequestMethod("POST");// 设置URL请求方法 String requestString = post; // 设置请求属性 // 获得数据字节数据,请求数据流的编码,必须和下面服务器端处理请求流的编码一致 byte[] requestStringBytes = requestString.getBytes("UTF-8"); httpConn.setRequestProperty("Content-length", "" + requestStringBytes.length); httpConn.setRequestProperty("Content-Type", "application/json"); httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接 httpConn.setRequestProperty("Charset", "UTF-8"); // 建立输出流,并写入数据 OutputStream outputStream = httpConn.getOutputStream(); outputStream.write(requestStringBytes); outputStream.close(); // 获得响应状态 int responseCode = httpConn.getResponseCode(); if (HttpURLConnection.HTTP_OK == responseCode) {// 连接成功 // // 当正确响应时处理数据 StringBuffer buffer = new StringBuffer(); String readLine = null; // 处理响应流,必须与服务器响应流输出的编码一致 reader = new BufferedReader(new InputStreamReader( httpConn.getInputStream(), "UTF-8")); while ((readLine = reader.readLine()) != null) { //buffer.append(readLine).append("\n"); buffer.append(readLine); } reader.close(); return buffer.toString(); } } catch (Exception e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } if (conn != null) { conn.disconnect(); } } return null; }这是自己写的,url是请求地址,post是参数 这个是android建立和服务器的链接后,通过outputStream就把requestStringBytes发送过去了么?那POST传的是什么参数 不好意思小弟初学~麻烦了 还有这个时候服务器的servlet应该怎么接收我传过来的requestStringBytes数据并且给个返回值呢 看错了- -,发的应该是requestString也就是我的post是要发的字符串对吧,吧byte看成string了 还有这个时候服务器的servlet应该怎么接收我传过来的requestStringBytes数据并且给个返回值呢需要传递参数的,javaBean知道吧,给javaBean的各个字段赋值,然后调用JsonUtil.format(Object obj)方法转换成String字符串,这个字符串就是post参数,如果没有参数直接post那直接写null或""就行。既然是以流的形式传递,那servlet那接收也是一样以流的形式接收。贴一段基础的代码: public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/hmtl;charset=utf-8"); PrintWriter out = response.getWriter(); // 当正确响应时处理数据 StringBuffer buffer = new StringBuffer(); String readLine = null; // 处理响应流,必须与服务器响应流输出的编码一致 BufferedReader reader = new BufferedReader(new InputStreamReader( request.getInputStream(), "UTF-8")); while ((readLine = reader.readLine()) != null) { buffer.append(readLine).append("\n"); } reader.close(); CategoryDto cateDto = JsonUtil.parse(buffer.toString(), CategoryDto.class); System.out.println(cateDto.getUserNick() + "用户发布消息"); TongChengDAO chengDAO = new TongChengDAOImpl(); chengDAO.updateCategory(cateDto, 1); out.print("yes"); }接收到的字节流转换成字符串,然后通过JsonUtil转换成JavaBean对象。 servlet返回到android直接out.print出去就行了。 servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么? servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么?postHttpResponseText这个方法的返回值就是servlet返回的数据。如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么?postHttpResponseText这个方法的返回值就是servlet返回的数据。如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下 servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么?postHttpResponseText这个方法的返回值就是servlet返回的数据。如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print为什么现在到建立输出流 OutputStream outputStream = httpConn.getOutputStream();的时候就抛异常? 安卓内置了一个httpClient 用这个邦定参数用一个URL用POST方法发过去.当然.你也可以用GET方法?json=XXXXXservlet接收的方式跟javaEE的一样.reqeust.get参数(参数名).服务器发回来就是直接用流writer出去.安卓接收的话.用httpClient发起一个请求.得到一个httpresponse.HttpResponse response = new DefaultHttpClient().execute(GET请求);content = EntityUtils.toString(response.getEntity());这样就可以得到一个json字符串了像楼上的大神们说的一样..跟WEB开发的 过程差不多..发起请求.响应请求..只不过把jsp换成了安卓.因为跨平台.所以都用JSON或XML来作为数据载体..而不是像JSP那用绑定到request中 谢谢 想再问一下 当服务器writer返回流的时候 安卓端怎么接收? HttpResponse response = new DefaultHttpClient().execute(GET请求);这个response就是你接收到的东西.. 这样说吧.你有一个servlet.它是会返回一个流A的.它叫JSONservlet.action 谁请求它.它就返回一个流A.那么HttpResponse response = new DefaultHttpClient().execute(GET请求--JSONservlet.action) 这个response就得到这个流A了你应走进一个误区了.你要知道.每一个URL请求.都会得到响应数据的.每个URL请求.就对应一个servlet. 你要得到哪个servlet的响应数据.那你就访问哪个servlet就行了 servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么?postHttpResponseText这个方法的返回值就是servlet返回的数据。如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下747043350 ~你如果对java都不熟悉的话还是先去了解点java 的基础吧。android只是像jsp一样的客户端一样而已,客户端输出流,服务端输入流,处理,再输出流,客户端输入流。就这样。都是通过流的形式。 servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么?postHttpResponseText这个方法的返回值就是servlet返回的数据。如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下747043350 ~你如果对java都不熟悉的话还是先去了解点java 的基础吧。android只是像jsp一样的客户端一样而已,客户端输出流,服务端输入流,处理,再输出流,客户端输入流。就这样。都是通过流的形式。哦 麻烦了~原来是用EntityUtils.toString(httpResponse.getEntity()取返回流的~谢谢 servlet接到数据后 直接out.print就是给andriod返回的数据么?然后android在与服务器响应流输出的编码一致的时候你的这句reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));就是接收到的返回的消息了么?postHttpResponseText这个方法的返回值就是servlet返回的数据。如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下747043350 ~你如果对java都不熟悉的话还是先去了解点java 的基础吧。android只是像jsp一样的客户端一样而已,客户端输出流,服务端输入流,处理,再输出流,客户端输入流。就这样。都是通过流的形式。因为之前看了看安卓基础,PDF没有与服务器端的交互 所以概念比较模糊 听你说了后懂很多 真的谢谢 gson转化时貌似时间格式要先变为string,才能转化成果吧 android设计求思路 android FM 音频问题 崩溃,无法编译,到底哪里出错? android的mount命令怎么用 怎么得到工程附件路径? 在onkeydown中再次使用ft.commit报错 超长短信 ,接收如何自动合并成一条 请教有没有必要继续学习 搭建Android环境,为什么Tagert中看不到新建的AVD呢 Android Log就是不输出~~~~ Android多个按钮设置不同风格 Android 如何在代码中准确设置控件的属性
下面附上封装好的几个常用方法:
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;import com.google.gson.Gson;/**
* json字符串 和对象互换 工具类
* 依赖Gson包
* @see com.google.gson.Gson
* @author devil
*
*/
public class JsonUtil {
/**
* 将json字符串转换成对象
*
* @param json
* @param type
* @return
*/
public static <T> T parse(String json, Class<T> type) {
Gson gson = new Gson();
T t = null ;
try {
t = gson.fromJson(json, type) ;
} catch (Exception e) {
e.printStackTrace() ;
return null ;
}
return t;
} /**
* 将json转成数组
*
* @param json
* @param type
* @return
*/
public static <T> T[] parseArr(String json, Class<T[]> type) {
return parse(json, type);
} /**
* 将json转成集合
*
* @param json
* @param type
* @return
*/
public static <T> ArrayList<T> parseList(String json, Class<T[]> type) {
return new ArrayList<T>(Arrays.asList(parse(json, type)));
} /**
* 将对象转成json字符串
*
* @param o
* @return
*/
public static String format(Object o) {
Gson gson = new Gson();
return gson.toJson(o);
}
/**
* 将对象转成json字符串 并使用url编码
* @param o
* @return
*/
public static String formatURLString(Object o)
{
try
{
return URLEncoder.encode(format(o), "utf-8");
}catch (Exception e) {
return null;
}
}
}
HttpPost httpPost = new HttpPost(url);
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpPost.getParams(), 10000);//设置连接超时
HttpConnectionParams.setSoTimeout(httpPost.getParams(), 10000); //设置请求超时
HttpResponse httpResponse =httpclient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode()==200){//成功响应了请求
public static String postHttpResponseText(String url, String post) {
BufferedReader reader = null;
HttpURLConnection conn = null;
try {
URL httpUrl = new URL(url);
HttpURLConnection httpConn = (HttpURLConnection) httpUrl
.openConnection(); // //设置连接属性
httpConn.setDoOutput(true);// 使用URL 连接进行输出
httpConn.setDoInput(true);// 使用 URL 连接进行输入
httpConn.setUseCaches(false);// 忽略缓存
httpConn.setRequestMethod("POST");// 设置URL请求方法
String requestString = post; // 设置请求属性
// 获得数据字节数据,请求数据流的编码,必须和下面服务器端处理请求流的编码一致
byte[] requestStringBytes = requestString.getBytes("UTF-8");
httpConn.setRequestProperty("Content-length", ""
+ requestStringBytes.length);
httpConn.setRequestProperty("Content-Type", "application/json");
httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
httpConn.setRequestProperty("Charset", "UTF-8");
// 建立输出流,并写入数据
OutputStream outputStream = httpConn.getOutputStream();
outputStream.write(requestStringBytes);
outputStream.close(); // 获得响应状态
int responseCode = httpConn.getResponseCode();
if (HttpURLConnection.HTTP_OK == responseCode) {// 连接成功 //
// 当正确响应时处理数据
StringBuffer buffer = new StringBuffer();
String readLine = null;
// 处理响应流,必须与服务器响应流输出的编码一致
reader = new BufferedReader(new InputStreamReader(
httpConn.getInputStream(), "UTF-8"));
while ((readLine = reader.readLine()) != null) {
//buffer.append(readLine).append("\n");
buffer.append(readLine);
}
reader.close();
return buffer.toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
if (conn != null) {
conn.disconnect();
}
}
return null; }
这是自己写的,url是请求地址,post是参数
既然是以流的形式传递,那servlet那接收也是一样以流的形式接收。贴一段基础的代码:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/hmtl;charset=utf-8");
PrintWriter out = response.getWriter();
// 当正确响应时处理数据
StringBuffer buffer = new StringBuffer();
String readLine = null;
// 处理响应流,必须与服务器响应流输出的编码一致
BufferedReader reader = new BufferedReader(new InputStreamReader(
request.getInputStream(), "UTF-8"));
while ((readLine = reader.readLine()) != null) {
buffer.append(readLine).append("\n");
}
reader.close();
CategoryDto cateDto = JsonUtil.parse(buffer.toString(),
CategoryDto.class);
System.out.println(cateDto.getUserNick() + "用户发布消息");
TongChengDAO chengDAO = new TongChengDAOImpl();
chengDAO.updateCategory(cateDto, 1);
out.print("yes");
}
接收到的字节流转换成字符串,然后通过JsonUtil转换成JavaBean对象。
如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print
如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下
如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print为什么现在到建立输出流 OutputStream outputStream = httpConn.getOutputStream();的时候就抛异常?
servlet接收的方式跟javaEE的一样.reqeust.get参数(参数名).
服务器发回来就是直接用流writer出去.
安卓接收的话.用httpClient发起一个请求.得到一个httpresponse.
HttpResponse response = new DefaultHttpClient().execute(GET请求);
content = EntityUtils.toString(response.getEntity());这样就可以得到一个json字符串了像楼上的大神们说的一样..跟WEB开发的 过程差不多..发起请求.响应请求..只不过把jsp换成了安卓.
因为跨平台.所以都用JSON或XML来作为数据载体..而不是像JSP那用绑定到request中
这个response就是你接收到的东西..
这样说吧.你有一个servlet.它是会返回一个流A的.它叫JSONservlet.action 谁请求它.它就返回一个流A.
那么HttpResponse response = new DefaultHttpClient().execute(GET请求--JSONservlet.action) 这个response就得到这个流A了
你应走进一个误区了.你要知道.每一个URL请求.都会得到响应数据的.每个URL请求.就对应一个servlet. 你要得到哪个servlet的响应数据.那你就访问哪个servlet就行了
如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下747043350 ~你如果对java都不熟悉的话还是先去了解点java 的基础吧。android只是像jsp一样的客户端一样而已,客户端输出流,服务端输入流,处理,再输出流,客户端输入流。就这样。都是通过流的形式。
如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下747043350 ~你如果对java都不熟悉的话还是先去了解点java 的基础吧。android只是像jsp一样的客户端一样而已,客户端输出流,服务端输入流,处理,再输出流,客户端输入流。就这样。都是通过流的形式。哦 麻烦了~原来是用EntityUtils.toString(httpResponse.getEntity()取返回流的~谢谢
如果你只是返回简单的状态码表示请求成功或失败,直接out.print就行了。如果是其他的list数据这种,将对象转换成json字符串再out.print能加一下你QQ么~我想具体问下747043350 ~你如果对java都不熟悉的话还是先去了解点java 的基础吧。android只是像jsp一样的客户端一样而已,客户端输出流,服务端输入流,处理,再输出流,客户端输入流。就这样。都是通过流的形式。因为之前看了看安卓基础,PDF没有与服务器端的交互 所以概念比较模糊 听你说了后懂很多 真的谢谢