출처 : http://cafe.naver.com/sunschool/4400


HttpClient의 HttpPost 메서드를 사용하여 로그인을 처리한 예제.

[실행결과]

로그인이 성공한 경우 화면                     로그인이 실패한 경우 화면

   

 

[login_layout.xml]

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/layout01"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical"
     android:visibility="visible">
    <LinearLayout
         android:orientation="horizontal"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:gravity="center_horizontal">
        <TextView android:text="  아이디: "
             android:id="@+id/TextView02"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
        <EditText android:text=""
             android:id="@+id/id"
             android:layout_width="200px"
             android:layout_height="wrap_content"/>
     </LinearLayout> 
     <LinearLayout
             android:orientation="horizontal"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:gravity="center_horizontal">
        <TextView android:text="패스워드: "
             android:id="@+id/TextView01"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
       <EditText android:text=""
             android:id="@+id/passwd"
             android:layout_width="200px"
             android:layout_height="wrap_content"
             android:password="true"/>
      </LinearLayout> 
 <LinearLayout
      android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal">
 <Button android:text="로그인"
  android:id="@+id/loginButton"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:gravity="center_horizontal"/>
    </LinearLayout> 
</LinearLayout>

 

[LoginActivity.java]

 

  package kim.android.test;

  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.util.ArrayList;

  import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
  import org.apache.http.NameValuePair;
  import org.apache.http.client.ClientProtocolException;
  import org.apache.http.client.HttpClient;
  import org.apache.http.client.ResponseHandler;
  import org.apache.http.client.entity.UrlEncodedFormEntity;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.apache.http.message.BasicNameValuePair;
  import org.apache.http.params.HttpConnectionParams;
  import org.apache.http.params.HttpParams;
  import org.xmlpull.v1.XmlPullParser;
  import org.xmlpull.v1.XmlPullParserFactory;

  import android.app.Activity;
  import android.app.ProgressDialog;
  import android.graphics.Color;
  import android.os.Bundle;
  import android.os.Handler;
  import android.os.Message;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.LinearLayout;
  import android.widget.Toast;

 

  public class LoginActivity extends Activity implements OnClickListener {
    private EditText id;
    private EditText passwd;
    private ProgressDialog pDialog;
    private LinearLayout layout01;
    private Button button;
 
 
   @Override
    protected void onCreate(Bundle savedInstanceState) {
     // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.login_layout);
         id=(EditText)findViewById(R.id.id);
         passwd=(EditText)findViewById(R.id.passwd);
         button=(Button)findViewById(R.id.loginButton);
         button.setOnClickListener(this);
         layout01=(LinearLayout)findViewById(R.id.layout01); 
    }

 

   @Override
   public void onClick(View v) {
      // TODO Auto-generated method stub
      loginProcess();      //로그인 버튼이 클릭되면 로그인 처리를 시작한다.
    }
 

   // 네트웍 처리결과를 화면에 반영하기 위한 안드로이드 핸들러

   // responseHandler에 의해 처리된 결과가 success인 경우 바탕화면을 초록색으로 바꾸고

   // 로그인이 성공했다는 메시지를 토스트로 출력

   // 로그인이 실패한 경우 바탕화면을 빨강색으로 바꾸고 로그인실패 메시지를 토스트로 출력
   private final Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
            pDialog.dismiss();
            String result=msg.getData().getString("RESULT");
            if ( result.equals("success") ) {
                  layout01.setBackgroundColor(Color.GREEN);
                  Toast.makeText(LoginActivity.this, "성공적으로 로그인하였습니다.",
                                         Toast.LENGTH_LONG).show() ;     
            } else {
                  layout01.setBackgroundColor(Color.RED);
                  Toast.makeText(LoginActivity.this, "로그인 실패",
                                         Toast.LENGTH_LONG),show() ;    
             }
       } 
    };
 

    //서버에서 전송된 XML 데이터를 파싱하기 위한 메서드

    //이 예제에서는 서버에서 로그인이 성공하는 경우(id=kim&passwd=111)하는 경우 <result>success</result>

    //실패하는 경우 <result>failed</result>를 반환하도록 설정해 두었다. 
    public String parsingData(InputStream input){
        String result=null;
        try {
             XmlPullParserFactory factory= XmlPullParserFactory.newInstance();
             XmlPullParser parser = factory.newPullParser();
             parser.setInput(new InputStreamReader(input));
             while ( parser.next() != XmlPullParser.END_DOCUMENT) {
                 String name=parser.getName();
                  if ( name != null && name.equals("result"))
                         result=parser.nextText();
              }
         }catch(Exception e){e.printStackTrace();}
         return result;
     }
 

    //로그인 버튼이 클릭되면 수행되는 메서드

    //  responseHandler는 Http요청에 대한 HttpResponse가 반환되면 결과를 처리하기 위한

     //  콜백메서드를 정의하고 있는 객체이다.

     //  Response를 받게 되면 parsingData()메서드를 호출하여 서버로 부터 받은 XML 파일을 처리하여

     // 그결과를 result 문자열로 반환받는다.

     // 이렇게 반환받은 result문자열을 화면에 반영하기위해 안드로이드UI핸들러인 handler를 통해 값을 전달한다.
    public void loginProcess() {
          final ResponseHandler<String> responseHandler=
               new ResponseHandler<String>() {

                 @Override
                 public String handleResponse(HttpResponse response)
                                                  throws ClientProtocolException, IOException {
                         String result=null;
                         HttpEntity entity=response.getEntity(); 
                         result=parsingData(entity.getContent());
                         Message message=handler.obtainMessage();
                         Bundle bundle=new Bundle();
                         if ( result.equals("success") )
                                      bundle.putString("RESULT", "success");
                         else
                                      bundle.putString("RESULT", "failed");
                         message.setData(bundle);
                         handler.sendMessage(message);
                         return result;
                 }
    };

 

     // 로그인이 처리되고 있다는 다이얼로그를 화면에 표시한다.
     pDialog=ProgressDialog.show(this, "", "로그인 처리중....");

 

     // 서버에 HTTP 처리 요청은 새로운 스레드를 생성하여 비동기식으로 처리하는것이 효율적이다.
     new Thread() {

           @Override
            public void run() {
                 String url = "http://192.168.10.2:8080/login.jsp";
                 HttpClient http = new DefaultHttpClient();
                 try { 
                     // 서버에 전달할 파라메터 세팅   
                     ArrayList<NameValuePair> nameValuePairs =
                                                              new ArrayList<NameValuePair>();
                     nameValuePairs.add(new BasicNameValuePair("id", id.getText().toString()));
                     nameValuePairs.add(new BasicNameValuePair("passwd", passwd.getText().toString()));
            

                   //     응답시간이 5초가 넘으면 timeout 처리하려면 아래 코드의 커맨트를 풀고 실행한다.
                   //     HttpParams params = http.getParams();
                   //     HttpConnectionParams.setConnectionTimeout(params, 5000);
                   //     HttpConnectionParams.setSoTimeout(params, 5000);

 

                  // HTTP를 통해 서버에 요청을 전달한다.

               // 요청에 대한결과는 responseHandler의 handleResponse()메서드가 호출되어 처리한다.

                  // 서버에 전달되는 파라메터값을 인코딩하기위해 UrlEncodedFormEntity() 메서드를 사용한다.

                  HttpPost httpPost = new HttpPost(url);
                  UrlEncodedFormEntity entityRequest =
                                       new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
                  httpPost.setEntity(entityRequest);
                  http.execute(httpPost,responseHandler); 
                }catch(Exception e){e.printStackTrace();}
           }
      }.start();    //스레드를 실행시킨다.
 }

}

 

 

LoginActivity를 실행하기 위해 테스트서버를 만들었고, 테스트서버에는  로그인을 처리하기위한 login.jsp, 결과로 반환될 success.xml, failed.xml,을 다음과 같이 만들어 테스트 하였다. ㅎㅎ

 

 

[login.jsp]

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
   <% System.out.println("login.jsp가 호출됨");  %>
   <c:if test="${param.id=='kim'}" >
       <c:if test="${param.passwd=='111'}" >
            <jsp:forward page="success.xml"/>
       </c:if>
   </c:if>
   <jsp:forward page="failed.xml"/>
</body>
</html>

[success.xml]

<?xml version="1.0" encoding="UTF-8"?>
<result>success</result>

 

[failed.xml]

<?xml version="1.0" encoding="UTF-8"?>
<result>failed</result>

 

 

웹요청에 대한 처리결과를 html 로 받아서 화면에 브라우저를 이용하여 출력하게 하려면 WebView 위젯을 사용하면 간단하게 처리할수 있다.

WebView는 예제를 올려놓은 게시물이 있으니 그걸 참조 하면 될듯 ^^


Posted by 모과이IT
,