xml parser 사용
안드로이드 <----------> 컨테이너 ( JSP )
InsertActivity insert.jsp
DeleteActivity delete.jsp
EmpDTO |
<< 아래 예제 소스 프로젝트 압축파일입니다. 찾으시는 분들이 꽤 계셔서 파일로 올려드려요~ >>
<< 지극히 초보적인 코딩이므로 참고만 하시기 바랍니다. >>
적용하시는데 워낙 어려워하시는 분들이 많으신 것 같아서 차근차근 스샷으로 설명드립니다.
우선 다운로드 받으신 ZIP 파일을 압축 푸시면 다음과 같은 폴더 2개가 보이실겁니다.
안드로이드 프로젝트 하나와 웹 프로젝트 2개인데요..
35EmpTest - 안드로이드 프로젝트
: ADT, Android Studio 등의 개발툴에서 import 함
99JSP_myEMP - 웹프로젝트
: eclipse 등의 개발툴에서 import 함.
웹프로젝트부터 import 하여 정상적으로 작동하는지 살펴봅시다.
대부분 아래처럼 에러화면이 나올듯 한데요.. 이는 jre 버전이 안맞아서 그런것이니 걍 맞춰주면 되지요 ㅎ
프로젝트 우클릭스로 properties > Libraries > JRE System Library Edit...
자 이제 에러표시가 다 사라졌네요 프로젝트이름 옆에 x표시는 걍 냅둬셔유..
그럼 이제 DB 데이터를 select 해 올 수 있는지 테스트 해봐야 겠지요...
일단 저는 로컬에서 테스트 하는거구요 로컬에는 ORACLE이 설치되어 있으므로 오라클 DB 기준으로 설명드립니다.
EmpDAO 클래스 찾아서 보시면 아래처럼 DB정보 입력하는 곳이 있는데요 설치된 정보대로 넣어주시면 됩니다.
※ 현업에서는 보통 was서버에 datasource 등록해 놓고 사용하지요...
이렇게 직접 소스에 DB 정보를 입력해서 접속하는 경우는 거의 없겠지만 이건 테스트이므로...ㅎ
※ 아참 보통 오라클 설치를 하면 기본적으로 scott 계정이 있을텐데요 저는 11g 버전 설치했는데 계정이 비활성화 되어 있더군요.
이런경우는 아래처럼 활성화 시켜 놓은 상태에서 select을 해야 데이터 조회가 가능하겠죠?
자 이렇게 조회되는것까지 확인했으니 다시 진행해봅시다.ㅎ
사실 이제 웹프로젝트에서는 할 게 없어요.. DB 연결 끝났으니 제대로 select 가 되는지 확인만 해 보면 됩니다.
이클립스 톰캣 서버에 add 하시고 서버 실행하고 조회 페이지로 접속해 봅시다. 데이터가 제대로 나오는지..ㅎ
페이지 형식을 XML 로 안해놔서 데이터가 그냥 다 붙어 나오네요.ㅋㅋ
실제 들어가 있는 데이터를 확인해보면 저렇게 XML 형태로 출력된 모습을 볼 수 있습니다.
저 조회 페이지를 안드로이드에서 호출해서 이 XML 데이터를 파싱해서 가져올겁니다.
자 그럼 이제 2단계! 안드로이드 프로젝트를 import 해 봅시다!
아래 스샷은 android studio에서 import 한 모습인데요. 기존 ADT에서 내보내기한 프로젝트도 이렇게 import 가 가능합니다.
헌데.. gradle 을 이용한 빌드 시스템이 멘붕오게 하더군요...
에뮬레이터에서 실행시키려고 하니까 자꾸 빌드 오류가 나던데... 메모리 설정 관련되서 오류나는 경우가 많다고 합니다.
저는 실행중인 프로그램이랑 불필요한 서비스 다 끄고 다시 켜서 하니까 되던데..
암튼 저처럼 non-zero exit value 1 에러 뜨는 분들은 구글 선생에게 좀 더 정확한 답을 얻으시기 바랍니다.
자 암튼 이제 빌드가 완료되고 에뮬레이터에서 작동이 됩니다~!! 두둥두둥~
근데 요런 에러 뜨시는 분들이 참 많으셨죠???
이게 바로 아래처럼 requestURL 을 localhost로 설정하거나 아니면 에뮬레이터(또는 스마트폰)에서 직접 접근을 할 수 없는 URL 로 설정이 되서 그런겁니다.
저 URL로 연결이 안되니까 inputstream을 생성을 못해서 에러가 나는거에요.. 일단 localhost 는 절대 불가함!!!!
자 다시한번 한마디로 정리하자면..
접근 불가능하면 에러납니다!!
고로.. 같은 네트워크 망 안에 있으면 ip 로 접근 가능하다는 거구요..
( 에뮬레이터 - PC, 같은 와이파이망 내의 스마트폰 - PC )
이런 상황인 경우에는 테스트하신다면 cmd > ipconfig > ipv4 아이피주소를 확인해서 입력해주시구요. 요렇게..
웹프로젝트를 띄워놓은 PC와 접근하려는 안드로이드 기기가 다른 네트워크에 있는경우
( 3G핸드폰 - PC ) 이런 경우 테스트하시는 분들은 보통 외부에서 접근할 수 있는 도메인이나 고정IP로 설정하셔야 합니다.
서버를 보유하고 계시지 않으신 분들은 각 인터넷 단말기의 포트포워딩을 통한 고정 IP 사용 방법을 검색하셔서 세팅 하셔야 합니다.
보통 우리가 흔히 쓰는 브로드밴드, 올레, 유플러스 등등 요런 인터넷은 선 연결 하면 자동으로 ip 주소를 할당해주는 유동 ip거든요..
아무리 ipconfig에서 IP주소 써넣는다고 해도 다른 망에 있는 기기에서는 접근할 수 없겠죠?
암튼 전 모두 로컬 PC에서 테스트구성한거라 포트포워딩 설정까지는 안했구요 그냥 에뮬레이터에서 접근했습니다.
이렇게 나오면 성공입니다!
※ 혹시 안드로이드 3.0(허니콤) 이상 쓰시는 분들중에 에러나는 경우에는 아래를 참고하여 주시기 바랍니다.
유현석님의 댓글 중...
저도 같은 에러로 한참 찾아봤는데
http://gochul.tistory.com/3 참고하시면 될거같습니다.
Log.i("xxx", "requestGet start"); 여기 다음줄에...
===================================
if(android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
===================================
추가 하시면 될겁니다.
안드로이드 3.0부터는 android.os.NetworkOnMainThreadException 이라는 에러가 발생한다고 해요
감사합니다!.
* MainActivity 예제 소스
public class EmpMainActivity extends Activity { Button btn; ListView lv; CustomAdapter adapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lv = (ListView)findViewById(R.id.listView1); btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), InsertActivity.class); startActivity(intent); } });//end onClick() }//end onCreate public InputStream requestGet(String requestURL) { Log.i("xxx", "requestGet start"); try { //1. HttpClient client = new DefaultHttpClient(); /////////////////////////////////////////// // requestURL = requestURL + "?key=aaa&key2=홍길동"; // //폼데이터 저장 Listlist = new ArrayList (); // list.add(new BasicNameValuePair("key", "aaa")); // list.add(new BasicNameValuePair("key1", "bbb")); // list.add(new BasicNameValuePair("key2", "홍길동")); // list.add(new BasicNameValuePair("key3", "ddd")); // list.add(new BasicNameValuePair("key4", "eee")); // requestURL = requestURL + "?" + URLEncodedUtils.format(list, "UTF-8"); /////////////////////////////////////////// HttpGet get = new HttpGet(requestURL); //2. 요청 HttpResponse response = client.execute(get); //3. 결과 받기 HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); return is; } catch (Exception e) { e.printStackTrace(); return null; } }//end requestGet() public String streamToString(InputStream is) { StringBuffer buffer = new StringBuffer(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8")); String str = reader.readLine(); while(str != null) { buffer.append(str+"\n"); str = reader.readLine(); } reader.close(); } catch (Exception e) { e.printStackTrace(); } return buffer.toString(); }//end streamToString() public ArrayList getXML(InputStream is) { ArrayList list = new ArrayList (); Log.i("xxx", "getXML start!"); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(is, "UTF-8"); int eventType = parser.getEventType(); EmpDTO dto = null; while( eventType != XmlPullParser.END_DOCUMENT) { switch(eventType) { case XmlPullParser.START_TAG: String startTag = parser.getName(); if(startTag.equals("record")){ dto = new EmpDTO(); } if(dto !=null ) { if(startTag.equals("deptno")) { dto.setDeptno(Integer.parseInt(parser.nextText())); } if(startTag.equals("dname")) { dto.setDname(parser.nextText()); } if(startTag.equals("loc")) { dto.setLoc(parser.nextText()); } } else { Log.i("xxx", "dto = null"); } break; case XmlPullParser.END_TAG: String endTag = parser.getName(); if(endTag.equals("record")){ list.add(dto); } }//end switch eventType = parser.next(); }//end while for( EmpDTO xx : list){ Log.i("xxx",xx.getDeptno()+" "+xx.getDname()+" "+xx.getLoc()); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException ie) { // TODO Auto-generated catch block ie.printStackTrace(); } return list; } @Override protected void onResume() { super.onResume(); String requestURL = "http://IP주소/99JSP_myEMP/select2.jsp"; InputStream is = requestGet(requestURL); // String data = streamToString(is); // Log.i("xxx", data); ArrayList list = getXML(is); adapter = new CustomAdapter(getApplicationContext(),list,R.layout.custom_list); lv.setAdapter(adapter); } }//end class
* InsertActivity 예제 소스
public class InsertActivity extends Activity { EditText edit_deptno,edit_dname,edit_loc; Button btn_insert; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.insert_layout); edit_deptno = (EditText)findViewById(R.id.edit_deptno); edit_dname = (EditText)findViewById(R.id.edit_dname); edit_loc = (EditText)findViewById(R.id.edit_loc); btn_insert = (Button)findViewById(R.id.btn_insert); btn_insert.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String deptno = edit_deptno.getText().toString(); String dname = edit_dname.getText().toString(); String loc = edit_loc.getText().toString(); String requestURL = "http://IP주소/99JSP_myEMP/insertdo2.jsp"; InputStream is= requestGet(requestURL,deptno,dname,loc); finish(); } });//end onClick() }//end onCreate public InputStream requestGet(String requestURL, String deptno, String dname, String loc) { Log.i("xxx", "requestGet start"); try { //1. HttpClient client = new DefaultHttpClient(); //폼데이터 저장 ListdataList = new ArrayList (); dataList.add(new BasicNameValuePair("deptno", deptno)); dataList.add(new BasicNameValuePair("dname", dname)); dataList.add(new BasicNameValuePair("loc", loc)); requestURL = requestURL + "?" + URLEncodedUtils.format(dataList, "UTF-8"); HttpGet get = new HttpGet(requestURL); //2. 요청 HttpResponse response = client.execute(get); //3. 결과 받기 HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); return is; } catch (Exception e) { e.printStackTrace(); return null; } }//end requestGet() }//end class
* select.jsp 예제 소스
<%@page import="test.com.jsp.EmpDTO"%> <%@page import="java.util.ArrayList"%> <%@page import="test.com.jsp.EmpDAO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% EmpDAO dao = new EmpDAO(); ArrayListlist = dao.select(); StringBuffer buffer = new StringBuffer(); buffer.append(" "); for(EmpDTO dto : list) { int deptno = dto.getDeptno(); String dname = dto.getDname(); String loc = dto.getLoc(); buffer.append(" "); %> <%= buffer.toString()%>"); buffer.append(" "); } buffer.append(""+deptno+" "); buffer.append(""+dname+" "); buffer.append(""+loc+" "); buffer.append("
* insert.jsp 예제 소스
<%@page import="test.com.jsp.EmpDAO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% //한글처리 request.setCharacterEncoding("UTF-8"); // 폼데이터 얻기 String deptno2 = request.getParameter("deptno"); String dname2 = request.getParameter("dname"); String loc2 = request.getParameter("loc"); // 오라클로 저장 EmpDAO dao = new EmpDAO(); dao.insert(deptno2,dname2,loc2); %>
* EmpDAO 예제 소스
public class EmpDAO { ArrayListlist; String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@IP주소:1521:orcl"; String userid = "scott"; String passwd = "tiger"; public EmpDAO() { try { list = new ArrayList (); Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); }//end try~catch }//end 생성자 public ArrayList select() { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { //3. Connection 맺기 con = DriverManager.getConnection(url, userid, passwd); //4. sql 문 작성 String query = "SELECT deptno, dname, loc FROM dept ORDER BY deptno "; //5. Statement 생성 stmt = con.prepareStatement(query); //6. sql 문 전송 rs = stmt.executeQuery(); //7. Data 얻기 // boolean b = rs.next(); while ( rs.next() ) { int deptno = rs.getInt("deptno"); String dname = rs.getString("dname"); String loc = rs.getString("loc"); list.add(new EmpDTO(deptno,dname,loc)); }//end while } catch (Exception e) { e.printStackTrace(); } //end try~catch finally { //8. 자원 반납 try { rs.close(); stmt.close(); con.close(); } catch (SQLException se) { se.printStackTrace(); } } //db 연동 끝 return list; }//end select() public void insert(String deptno, String dname, String loc) { Connection con = null; PreparedStatement stmt = null; try { //3. Connection 맺기 con = DriverManager.getConnection(url, userid, passwd); //4. sql 문 작성 String insert = "insert into dept (deptno,dname,loc) values ( ?,?,? )"; //5. Statement 생성 stmt = con.prepareStatement(insert); //6. 내용 입력 stmt.setInt(1, Integer.parseInt(deptno)); stmt.setString(2,dname); stmt.setString(3,loc); //7. sql 문 전송 int n = stmt.executeUpdate(); } catch (Exception e) {e.printStackTrace();} //end try~catch finally { //8. 자원 반납 try { stmt.close(); con.close(); } catch (SQLException se) { se.printStackTrace(); } } //db 연동 끝 }//end insert() public EmpDTO retrieve(String deptno) { EmpDTO dto = new EmpDTO(); Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try { con = DriverManager.getConnection(url,userid,passwd); String sql = "select * from dept where deptno = ?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(deptno)); rs = pstmt.executeQuery(); if(rs.next()) { dto.setDeptno(rs.getInt("deptno")); dto.setDname(rs.getString("dname")); dto.setLoc(rs.getString("loc")); } } catch (Exception e) { e.printStackTrace(); } finally { try { rs.close(); pstmt.close(); con.close(); } catch (SQLException se) { // TODO Auto-generated catch block se.printStackTrace(); } } return dto; }//end retrieve() public void delete(String deptno) { EmpDTO dto = new EmpDTO(); Connection con = null; PreparedStatement pstmt = null; try { con = DriverManager.getConnection(url,userid,passwd); String sql = "delete from dept where deptno=?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(deptno)); int n = pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { try { pstmt.close(); con.close(); } catch (SQLException se) { // TODO Auto-generated catch block se.printStackTrace(); } } }//end delete public void update(String deptno, String dname, String loc) { Connection con = null; PreparedStatement pstmt = null; try { con = DriverManager.getConnection(url,userid,passwd); String sql = "update dept set dname = ?, loc = ? where deptno = ?"; pstmt = con.prepareStatement(sql); pstmt.setString(1, dname); pstmt.setString(2, loc); pstmt.setInt(3, Integer.parseInt(deptno)); int n = pstmt.executeUpdate(); }catch(Exception e) { e.printStackTrace(); }finally{ try { pstmt.close(); con.close(); } catch (SQLException se) { se.printStackTrace(); } } }//end update() }
* EmpDTO 예제 소스
public class EmpDTO { private int deptno; private String dname; private String loc; public EmpDTO(int deptno, String dname, String loc) { super(); this.deptno = deptno; this.dname = dname; this.loc = loc; } public EmpDTO() { super(); } public void setDeptno(int deptno) { this.deptno = deptno; } public void setDname(String dname) { this.dname = dname; } public void setLoc(String loc) { this.loc = loc; } public int getDeptno() { return deptno; } public String getDname() { return dname; } public String getLoc() { return loc; } }
'Dev. 안드로이드 > 참고소스' 카테고리의 다른 글
안드로이드 인터넷 연결관리자 ConnectivityManager (0) | 2012.03.21 |
---|---|
TextView ( EditText ) 의 속성 xml 예제 소스 (0) | 2012.03.21 |
toast 메세지 연속 출력 및 커스텀 뷰 토스트 표시하기 (0) | 2012.03.16 |
안드로이드 어플 종료시 back 키 두번 눌러서 끄기 참고 소스 (0) | 2012.03.16 |
안드로이드 XmlPullParser 사용 예제 (0) | 2012.03.16 |