GET和POST方式提交参数给web应用

服务器端:

新建一个名为ManagerServlet的Servlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cn.leigo.servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ManagerServlet extends HttpServlet {
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String title = request.getParameter("title");
        String timelength = request.getParameter("timelength");
        System.out.println("标题:" + title);
        System.out.println("时长:" + timelength + "分钟");
    }
 
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }
 
}

  GET和POST方式提交参数给web应用

运行后控制台打印:

GET和POST方式提交参数给web应用

Android客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/background_dark" 
    android:orientation="vertical" 
    tools:context=".MainActivity"
   
    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/title" 
        android:textColor="@android:color/white" 
        android:textSize="20sp" /> 
   
    <EditText 
        android:id="@+id/et_title" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:inputType="text" /> 
   
    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/timelength" 
        android:textColor="@android:color/white" 
        android:textSize="20sp" /> 
   
    <EditText 
        android:id="@+id/et_timelength" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:inputType="number" /> 
   
    <Button 
        android:id="@+id/btn_save" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/save" /> 
   
</LinearLayout> 

  strings.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
   
    <string name="app_name">资讯管理</string
    <string name="action_settings">Settings</string
    <string name="hello_world">Hello world!</string
    <string name="title">资讯标题</string
    <string name="timelength">资讯时长</string
    <string name="save">保存</string
    <string name="success">保存成功!</string
    <string name="fail">保存失败!</string
    <string name="error">资讯标题和资讯时长不能为空!</string
   
</resources> 

  MainActivity.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package cn.leigo.newsmanager; 
   
import cn.leigo.service.NewsService; 
import android.app.Activity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
   
public class MainActivity extends Activity implements OnClickListener { 
    private EditText mTitleEditText; 
    private EditText mTimelengthEditText; 
    private Button mSaveButton; 
   
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
   
        mTitleEditText = (EditText) findViewById(R.id.et_title); 
        mTimelengthEditText = (EditText) findViewById(R.id.et_timelength); 
        mSaveButton = (Button) findViewById(R.id.btn_save); 
        mSaveButton.setOnClickListener(this); 
    
   
    @Override 
    public void onClick(View v) { 
        String title = mTitleEditText.getText().toString(); 
        String timelength = mTimelengthEditText.getText().toString(); 
        if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(timelength)) { 
            boolean isSuccess = NewsService.save(title, timelength); 
            if (!isSuccess) { 
                Toast.makeText(this, R.string.fail, Toast.LENGTH_SHORT).show(); 
            } else
                Toast.makeText(this, R.string.success, Toast.LENGTH_SHORT) 
                        .show(); 
            
        } else
            Toast.makeText(this, R.string.error, Toast.LENGTH_SHORT).show(); 
        
    
   

  NewsService.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package cn.leigo.service; 
   
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.Map; 
   
public class NewsService { 
   
    /**
     * 保存数据
     
     * @param title
     *            标题
     * @param timelength
     *            时长
     * @return 请求是否成功
     */ 
    public static boolean save(String title, String timelength) { 
        String path = "http://192.168.1.100:8080/videonews/ManagerServlet"
        Map<String, String> params = new HashMap<String, String>(); 
        params.put("title", title); 
        params.put("timelength", timelength); 
        try
            return sendGETRequest(path, params); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        
        return false
    
   
    /**
     * 发送GET请求
     
     * @param path
     *            请求路径
     * @param params
     *            请求参数
     * @return
     * @throws IOException
     */ 
    private static boolean sendGETRequest(String path, 
            Map<String, String> params) throws IOException { 
        StringBuilder url = new StringBuilder(path); 
        url.append("?"); 
        for (Map.Entry<String, String> entry : params.entrySet()) { 
            url.append(entry.getKey()); 
            url.append("="); 
            url.append(entry.getValue()); 
            url.append("&"); 
        
        url.deleteCharAt(url.length() - 1); 
        HttpURLConnection conn = (HttpURLConnection) new URL(url.toString()) 
                .openConnection(); 
        conn.setConnectTimeout(5000); 
        conn.setRequestMethod("GET"); 
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
            return true
        
        return false
    

  运行:

GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用

产生乱码原因:

1)在提交参数时,没有对中文参数进行URL编码

1
url.append(URLEncoder.encode(entry.getValue(), encoding)); 

  修改后继续测试,运行

GET和POST方式提交参数给web应用

2)Tomcat服务器默认采用的是ISO8859-1编码得到参数值

String title = request.getParameter("title");  
title = new String(title.getBytes("ISO8859-1"), "UTF-8");  

GET和POST方式提交参数给web应用

经过这两步处理后,中文乱码问题得到了解决,但是出现一个问题,在第二步中,如果字符串有很多,每次都用

new String(title.getBytes("ISO8859-1"), "UTF-8");  

这中方式解决很麻烦,咱们可以定义一个过滤器对每次穿过来的参数进行编码

 

EncodingFilter.java:

GET和POST方式提交参数给web应用
package cn.leigo.filter;  
  
import java.io.IOException;  
  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
  
import cn.leigo.servlet.EncodingHttpServletRequest;  
  
public class EncodingFilter implements Filter {  
  
    public void destroy() {  
  
    }  
  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        HttpServletRequest req = (HttpServletRequest) request;  
        if ("GET".equals(req.getMethod())) {  
            EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(  
                    req);  
            chain.doFilter(wrapper, response);  
        } else {  
            chain.doFilter(request, response);  
        }  
    }  
  
    public void init(FilterConfig filterConfig) throws ServletException {  
  
    }  
  
}  
GET和POST方式提交参数给web应用
EncodingHttpServletRequest.java:
GET和POST方式提交参数给web应用
package cn.leigo.servlet;  
  
import java.io.UnsupportedEncodingException;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletRequestWrapper;  
  
public class EncodingHttpServletRequest extends HttpServletRequestWrapper {  
  
    private HttpServletRequest request;  
  
    public EncodingHttpServletRequest(HttpServletRequest request) {  
        super(request);  
        this.request = request;  
    }  
  
    @Override  
    public String getParameter(String name) {  
        String value = request.getParameter(name);  
        if (value != null) {  
            try {  
                value = new String(value.getBytes("ISO8859-1"), "UTF-8");  
            } catch (UnsupportedEncodingException e) {  
            }  
        }  
  
        return value;  
    }  
  
}  
GET和POST方式提交参数给web应用

下面我们来看看使用POST方式提交数据

 

在WEB-INF下修改index.jsp:

GET和POST方式提交参数给web应用
<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
</head>  
<body>  
    <form action="/web/ManageServlet" method="post">  
        视频标题:<input name="title" type="text"><br/>  
        视频时长:<input name="timelength" type="text"><br/>  
        <input type="submit" value=" 提 交 "/>  
    </form>  
</body>  
</html>  
GET和POST方式提交参数给web应用

修改ManagerSevlet.java:

public void doPost(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException {  
    doGet(request, response);  
}  

GET和POST方式提交参数给web应用

点击提交

GET和POST方式提交参数给web应用

 

在firebug中查看信息

GET和POST方式提交参数给web应用

 

GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用
/** 
     * 发送POST请求 
     *  
     * @param path 
     *            请求路径 
     * @param params 
     *            请求参数 
     * @param encoding 
     *            编码 
     * @return 请求是否成功 
     * @throws IOException 
     */  
    private static boolean sendPOSTRequest(String path,  
            Map<String, String> params, String encoding) throws IOException {  
        // title=leigo&timelength=45 Content-Length 25 Content-Type  
        // application/x-www-form-urlencoded  
        StringBuilder data = new StringBuilder();  
        if (params != null && !params.isEmpty()) {  
            for (Map.Entry<String, String> entry : params.entrySet()) {  
                data.append(entry.getKey());  
                data.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");  
        conn.setDoOutput(true); // 允许对外输出数据  
        conn.setRequestProperty("Content-Type",  
                "application/x-www-form-urlencoded");  
        conn.setRequestProperty("Content-Length", String.valueOf(entity.length));  
        OutputStream outputStream = conn.getOutputStream();  
        outputStream.write(entity);  
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {  
            return true;  
        }  
        return false;  
    }  
GET和POST方式提交参数给web应用

防乱码:

GET和POST方式提交参数给web应用
if ("GET".equals(req.getMethod())) {  
            EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(  
                    req);  
            chain.doFilter(wrapper, response);  
        } else {  
            req.setCharacterEncoding("UTF-8");  
            chain.doFilter(request, response);  
        }  
GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用

GET和POST方式提交参数给web应用
/** 
     * 通过HttpClient发送请求 
     *  
     * @param path 
     *            请求路径 
     * @param params 
     *            请求参数 
     * @param encoding 
     *            编码 
     * @return 请求是否成功 
     * @throws IOException 
     */  
    private static boolean sendHttpClientPOSTRequest(String path,  
            Map<String, String> params, String encoding) throws IOException {  
        List<NameValuePair> pairs = new ArrayList<NameValuePair>(); // 存放请求参数  
        for (Map.Entry<String, String> entry : params.entrySet()) {  
            BasicNameValuePair pair = new BasicNameValuePair(entry.getKey(),  
                    entry.getValue());  
            pairs.add(pair);  
        }  
        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;  
    }  
GET和POST方式提交参数给web应用

煮酒声明: 文章转自:http://blog.csdn.net/le_go/article/details/9295327

GET和POST方式提交参数给web应用

上一篇:Js template engine


下一篇:学习js(Jquery)