doGet和doPost不同使用以及安卓乱码问题解决案例总结

来源:互联网 发布:linux 修改文件指令 编辑:程序博客网 时间:2024/05/16 17:53

1、path传输数据,数据之间是一个&符号进行连接。

2、Get post 

Public 

(1)get 方式提交参数给web应用

(2)post方式提交参数给web应用

(3)HttpClient发送post请求

具体代码:

   public static boolean save(String title,String length,String encoding){

String path="http://............:8080/tennis_game/addService";

Map<String,String> pa = new HashMap<String, String>();

pa.put("title", title);

pa.put("timelength", length);

try {

return SendHttpClientPost(path,pa,encoding);

catch (Exception e) {

e.printStackTrace();

}//分别为请求的路径和请求的参数

return false;

}

/*

 *通过HttpClient这个开源项目发送post请求

 *封装了很多操作,使用时性能有些降低,简单的发送请求不需要使用这个

 *但有些情况可以加快开发速度

 * */

private static boolean SendHttpClientPost(String path,//Http是一个开源项目,已经集成在java请求中

Map<String, String> pa, String encoding) throws Exception {

List<NameValuePair> pairs = new ArrayList<NameValuePair>();

for(Map.Entry<String, String> entry : pa.entrySet())

{

pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

//构建参数对象,放在集合中

}

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,encoding);

//构建实体对象,

HttpPost httpPost = new HttpPost(path);

httpPost.setEntity(entity);

DefaultHttpClient client = new DefaultHttpClient();

HttpResponse response = client.execute(httpPost);

if(response.getStatusLine().getStatusCode() == 200)//取得状态行

{

return true;

}

return false;

}

/*

 * 发送post请求

 * 首先组品路径

 * */

private static boolean SenddoPost(String path, Map<String, String> pa,

String encoding) throws Exception {

StringBuilder data = new StringBuilder();

//构造直接传输数据的get方法所对应的路径

if(pa!=null)

{

for(Map.Entry<String, String> entry : pa.entrySet())

{//迭代参数对象,得到实体数据

data.append(entry.getKey()).append("=");

data.append(URLEncoder.encode(entry.getValue(),encoding));//解决中文乱码问题

data.append("&");//一个&还是两个&都是一样的,也可以进行删除,保存一个&符合

}

data.deleteCharAt(data.length()-1);

//删除最后的&符号

}

byte[] entity = data.toString().getBytes();

//生成实体数据

HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection();

conn.setConnectTimeout(5000);//这个必须有,防止僵死

conn.setRequestMethod("POST");//发送post请求

conn.setDoOutput(true);//允许对外输出数据

conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded");

//设置头字段

conn.setRequestProperty("Content-Length", String.valueOf(entity.length));

//长度设置

OutputStream outStream = conn.getOutputStream();

//相对是输出数据的

outStream.write(entity);

//向外写数据,实际是写到了缓存里面

if(conn.getResponseCode()==200)//取得响应时,才真正发送请求到web

{

return true;

}

return false;

}

/*

 * get传输数据

 * 首先构造路径

 * 连接后,get方法进行提交

 */

private static boolean SendGet(String path, Map<String, String> pa,String encoding) throws Exception{

StringBuilder url = new StringBuilder(path);

//构造直接传输数据的get方法所对应的路径

url.append("?");

for(Map.Entry<String, String> entry : pa.entrySet())

{

url.append(entry.getKey()).append("=");

url.append(URLEncoder.encode(entry.getValue(),encoding));//解决中文乱码问题

url.append("&");//一个&还是两个&都是一样的,也可以进行删除,保存一个&符合

}

url.deleteCharAt(url.length()-1);

HttpURLConnection conn = (HttpURLConnection)new URL(url.toString()).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

if(conn.getResponseCode()==200)

{

return true;

}

return false;

}

 

3、安卓乱码问题

原因1get提交参数时,没有对中文的参数进行URL编码。

     2tomcat服务器默认采用的是IS08859-1编码得到参数值。不支持中文。

解决方法

1、提交参数时进行中文编码。具体是构造路径时,确认想要的编码机制

StringBuilder url = new StringBuilder(path);

//构造直接传输数据的get方法所对应的路径

url.append("?");

for(Map.Entry<String, String> entry : pa.entrySet())

{url.append(entry.getKey()).append("="); url.append(URLEncoder.encode(entry.getValue(),encoding));//解决中文乱码问题

url.append("&");}

//一个&还是两个&都是一样的,也可以进行删除,保存一个&符合

2、在web找到对应的servlet

1)中文属性值较少的时候,对应的中文参数进行改变

String realname = new String(realname.getBytes(“IS08859-1”),”UTF-8”);

(2)中文属性值较多的时候,使用过滤器

新建一个filter ,点击选中新建的文件,选中edit,改为/*,对所有文件进行过滤

点击完成。Destory摧毁时被调用,doFiler每次请求都会调用

其内容为

HttpServletRequest req = (HttpServletRequest)request;

if(“GET”.equals(request.getm()))//get请求

{

EcodingHttpServletRequest  wrapper = new EcodingHttpServletRequest(req);

req.getParameter();

chain.doFilter(wrapper,response);

}

 else

{

req.setCharacterEncoding(“UTF-8”);//post方法时修改编码

chain.doFilter(wrapper,response);

 

}

 

新建一个类,EcodingHttpServletRequest 继承HttpServletRequestWrapper这个类

内容为

Private  HttpServletRequest requet;

Public EncodingHttpServletRequest(HttpServletRequest request)

{

Super(request);

This.request = request;

}

Public String getParameter(String name)

{

String value = request.getParameter(name);

If(value!=null)

{

Value = new String (value.getBytes(“ISO8859-1”),”UTF-8”);

}

return value;

}

这样就完成了修改编码。

4、Form表单中Action可以对应的写一个路径例如一个servlet,那么该jsp就好调用此servlet

5、http协议

  点击查看->浏览器栏->httpwatch Profesional,输入框输入好内容,点击record,然后进行查看。得到http协议的主要内容。

0 0