xml parser 사용
안드로이드 <----------> 컨테이너 ( JSP )
InsertActivity insert.jsp
DeleteActivity delete.jsp
EmpDTO |
<< 아래 예제 소스 프로젝트 압축파일입니다. 찾으시는 분들이 꽤 계셔서 파일로 올려드려요~ >>
<< 지극히 초보적인 코딩이므로 참고만 하시기 바랍니다. >>
EmpTest_.zip적용하시는데 워낙 어려워하시는 분들이 많으신 것 같아서 차근차근 스샷으로 설명드립니다.
우선 다운로드 받으신 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; } }