Android开发入门之通过GET和POST方式提交参数给web应用

依然是上一个应用

服务器端:

新建一个名为ManagerServlet的Servlet:

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 {
	}

}

运行后控制台打印:



Android客户端:

<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:

<?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:

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:

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 {
		// http://192.168.1.100:8080/videonews/ManagerServlet?title=abc&timelength=30
		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;
	}
}

运行:



此时如果输入的是中文,则会出现乱码



产生乱码原因:

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

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

修改后继续测试,运行



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

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

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

new String(title.getBytes("ISO8859-1"), "UTF-8");
这中方式解决很麻烦,咱们可以定义一个过滤器对每次穿过来的参数进行编码

EncodingFilter.java:

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 {

	}

}

EncodingHttpServletRequest.java:

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;
	}

}

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

在WEB-INF下修改index.jsp:

<%@ 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>

修改ManagerSevlet.java:

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

点击提交

在firebug中查看信息




/**
	 * 发送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;
	}

防乱码:

if ("GET".equals(req.getMethod())) {
			EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(
					req);
			chain.doFilter(wrapper, response);
		} else {
			req.setCharacterEncoding("UTF-8");
			chain.doFilter(request, response);
		}


/**
	 * 通过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;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值