Android XmpPullParser with JSP
Android XmpPullParser with JSP
안드로이드에서 제공하는 XML 파서인 XmlPullParser를 이용하여 JSP의 XML 응답을 처리하는 예
표준 자바 API인 URL, URLConnection 클래스를 사용하여 웹서버에 접속하고 응답을 XML으로 수신 및 처리함
androidPost.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page contentType="text/xml; charset=UTF-8" pageEncoding="EUC-KR"%>
<params>
<%
request.setCharacterEncoding("UTF-8");
String value1 = request.getParameter("key1");
String value2 = request.getParameter("key2");
System.out.println("key1="+value1);
System.out.println("key2="+value2);
%>
<param1><%=value1%></param1>
<param2><%=value2%></param2>
</params>
AndroidWeb.java
package test.android.hello;
import java.net.*;
import java.io.*;
import org.xmlpull.v1.*;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AndroidWeb extends Activity {
TextView textview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textview = (TextView) this.findViewById(R.id.tv);
try {
// Construct data
String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("홍길동", "UTF-8");
// Send data
// 안드로이드에서는 네트워크의 접속 및 요청, 응답의 처리는 유저 쓰레드 내에서 하도록 강제하고 있으므로
//아래의 코드는 다시 작성되어야 한다. 아울러 응답을 받아서 화면에 반영하는 부분도 유저 쓰레드에서 작성하게 되므로
//핸들러를 이용하여 메인 쓰레드에서 화면을 갱신하도록 변경해 주어야 한다
URL url = new URL("http://211.183.3.170:8282/WebTest/android/androidPost.jsp");
URLConnection conn = url.openConnection();
// If you invoke the method setDoOutput(true) on the URLConnection, it will always use the POST method.
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line = null;
String response = "";
while ((line = rd.readLine()) != null) {
response += line;
}
findName(response);
//textview.setText(response.trim());
wr.close();
rd.close();
}
catch (Exception e) {
}
}
/* XmlPullParser 이용 특정 엘리먼트의 값을 추출하는 예 */
private void findName(String xmlString) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput( new StringReader ( xmlString ) );
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if(eventType == XmlPullParser.START_DOCUMENT) {
Log.i("Start document","시작태그");
} else if(eventType == XmlPullParser.START_TAG) {
Log.i("Start tag", ""+xpp.getName());
if(xpp.getName().equals("param2")) {
xpp.next();
String name = xpp.getText();
textview.setText("이름 : "+name);
break;
}
} else if(eventType == XmlPullParser.END_TAG) {
Log.i("End tag", ""+xpp.getName());
} else if(eventType == XmlPullParser.TEXT) {
Log.i("TEXT", ""+xpp.getText());
}
eventType = xpp.next();
}
} catch (Exception e) {
Log.e("오류", ""+e.getMessage());
}
Log.e("종료", "프로그램 종료");
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.android.hello"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".AndroidWeb"
android:label="@string/app_name" >
<!-- set my class to main-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>