Get方式向服务器发送数据主要用于数据量小于2kb,并且安全性要求不是很高的情况。
在完成一个向服务器发送数据的业务需要如下流程:
web服务器端
创建一个动态web 工程,并在web.xml 中配置Sverlet。
创建一个Servlet类并重写其doGet()方法代码如下:
public class ServerlateGetMethod extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServerlateGetMethod() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println("name:"+names);
System.out.println("ages:"+age);
PrintWriter out = response.getWriter();
out.println("name:"+names);
out.println("age:"+age);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
web.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0"
>
<display-name>ServiceForPicture</display-name>
<servlet>
<display-name>ServerlateGetMethod</display-name>
<servlet-name>ServerlateGetMethod</servlet-name>
<servlet-class>com.xiyou.dongqu.ServerlateGetMethod</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServerlateGetMethod</servlet-name>
<url-pattern>ServerlateGetMethod</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
创建Android端:
创建Android项目的业务逻辑层:
public class sendDataToServer {
private static String url = "http://192.168.1.128:8080/ServiceForPicture/ServerlateGetMethod";
public boolean SenddataToServer(String name, String age) throws Exception {
final Map<String, String> map = new HashMap<String, String>();
map.put("name", name);
map.put("age", age);
return sendGetRequest(map, url, "utf-8"); // 请求的具体业务
}
protected boolean sendGetRequest(Map<String, String> map, String path,
String encoding) throws MalformedURLException, IOException {
// http://localhost:8080/ServiceForPicture/ServerlateGetMethod?name=1234&age=3
StringBuilder sb = new StringBuilder(path);
if (map != null && !map.isEmpty()) {
sb.append("?"); // 追加?
System.out.println("---->" + sb);
/*
* Map 的entrySet()方法返回一个 实现Map.Entry接口的对象集合,结合中每个对象
* 都是一个底层Map中一个特定的健/值对,通过这个集合迭代器,可以获取每一个条目 的键值对并对值进行更改。
*/
for (Map.Entry<String, String> entry : map.entrySet()) { // 遍历map
sb.append(entry.getKey()).append("="); // 对每一组键值对进行修改
sb.append(URLEncoder.encode(entry.getValue(), encoding));// 对每一组键值对进行修改添加指定的编码格式
sb.append("&");
System.out.println(sb);
}
// 在上面对键值队的修改中会在最后一个属性后多加一个& 这样就会造成错误,因此要删除最后一个多余的字符
sb.deleteCharAt(sb.length() - 1);// 删除字符串中最后一个字符
}
HttpURLConnection conn = (HttpURLConnection) new URL(sb.toString())
.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
return true;
}
return false;
}
}
2:创建MainActivity :
public class MainActivity extends Activity {
private Button button;
private EditText txtname;
private EditText txtage = null;
String path = "http://192.168.1.128:8080/ServiceForPicture/ServerlateGetMethod";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
txtname = (EditText) findViewById(R.id.edname);
txtage = (EditText) findViewById(R.id.age);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = txtname.getText().toString();
String age = txtage.getText().toString();
if (name.equals("") || age.equals("")) {
Toast.makeText(MainActivity.this, "用户名或密码不正确", 2000).show();
} else {
try {
new sendDataToServer().SenddataToServer(name, age);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
});
}
}
最后在清单文件中开启网络权限,然后将项目运行在模拟器上测试,第一次运行时出现乱码,这是由于在Android端使用的是utf-8进行编码,而对于Tomcat而言,默认使用的是ISO8859-1,编码不同因此出现乱码, 下面给出解决方法:
使用ISO8859-1解码Servlet得到的汉字,然后在用utf-8编码。如下:
tring names = new String (request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
此时再次运行则编码正常如下: