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、安卓乱码问题
原因1、get提交参数时,没有对中文的参数进行URL编码。
2、tomcat服务器默认采用的是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协议的主要内容。
- doGet和doPost不同使用以及安卓乱码问题解决案例总结
- doGet和doPost乱码
- 浅谈doGet和doPost
- doGet 和 doPost区别
- android doGet和doPost
- day0812-doGet和doPost
- DoGet和DoPost
- doPost()和doGet()
- doGet和doPost
- doGet和doPost区别
- servlet(doget和dopost)
- doget和dopost区别
- servlet中doGet和doPost字符乱码问题
- Servlet解决doGet和doPost参数乱码问题
- 关于HttpServlet和Servlet以及doPost和doGet关系
- doGet()和doPost()各自的功能以及它们的关系
- service()和doGet()和doPost()
- HttpUrlConnection和HttpClient的使用(doGet( )、doPost( )方法)
- 小窥备份数据库之expdp和impdp
- 如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
- 数字图像处理与机器视觉用到的Matlab语句
- CentOS6.5+LAMP+YAF
- 剑指offer 算法 (举例让抽象具体化)
- doGet和doPost不同使用以及安卓乱码问题解决案例总结
- ps aux命令显示的状态列中的Ss+,Rsl,R+,S<sl含义
- jQuery内ready与load事件的区别
- for in语句中hasOwnProperty过滤原型属性
- 有关C/C++指针的经典面试题
- Android之NDK开发
- hdu5396(区间DP)
- #include、#import与@class的使用与头文件循环引用问题
- Android屏幕适配(官方适配指导)