728x90
반응형

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는 예제를 올려놓은 게시물이 있으니 그걸 참조 하면 될듯 ^^

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,