안드로이드 #4 Servlet랑 안드로이드 연동하기

0

안드로이드

목록 보기
7/19

저번주에 이어서 JSP 연동에 대해 설명하겠다. 안드로이드 초짜인 내가 Map 좌표를 찍으면 X, Y 좌표를 DB에다 넣는 업무를 맡게되었다.

<uses-permission android:name="android.permission.INTERNET"/>

일단 인터넷 사용이 허가되어 있어야한다.

이제 공통적인 AnyncTask를 보자. 일단 AnyncTask 설명은 이곳에 정말 자세히 나와있다.
https://coding-factory.tistory.com/31

HTTPClient

public class HttpClient {
    private static final String WWW_FORM = "application/x-www-form-urlencoded";
    private int httpStatusCode; //연결하고 난후 상태값(200이면 정상적으로 처리된거다.)
    private String body;
    public int getHttpStatusCode() {
        return httpStatusCode;
    }
    public String getBody() {
        return body;
    }
    private Builder builder;
    private void setBuilder(Builder builder) {
        this.builder = builder;
    }
    public void request() {
        HttpURLConnection conn = getConnection();
        setHeader(conn);
        setBody(conn);
        httpStatusCode = getStatusCode(conn);
        body = readStream(conn);
        conn.disconnect(); //커넥션 객체를 세팅해준다.
    }
    private HttpURLConnection getConnection() {
        try {
            URL url = new URL(builder.getUrl());
            return (HttpURLConnection) url.openConnection();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    private void setHeader(HttpURLConnection connection) {
        setContentType(connection);
        setRequestMethod(connection);
        connection.setConnectTimeout(5000);
        connection.setDoOutput(true);
        connection.setDoInput(true);
    }
    private void setContentType(HttpURLConnection connection) {
        connection.setRequestProperty("Content-Type", WWW_FORM);
    }
    private void setRequestMethod(HttpURLConnection connection) {
        try {
           connection.setRequestMethod(builder.getMethod());
        } catch (ProtocolException e) {
            e.printStackTrace();
        }
    }
    private void setBody(HttpURLConnection connection) {
        String parameter = builder.getParameters();
        if (parameter != null && parameter.length() > 0) {
            OutputStream outputStream = null;
            try {
                outputStream = connection.getOutputStream();
                outputStream.write(parameter.getBytes("UTF-8"));
                outputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (outputStream != null)
                        outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private int getStatusCode(HttpURLConnection connection) {
        try {
            return connection.getResponseCode();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return -10;
    }
    private String readStream(HttpURLConnection connection) {
        String result = "";
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                result += line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null)
                    reader.close();
            } catch (IOException e) {
            }
        }
        return result;
    }
    public static class Builder {
        private Map<String, String> parameters;
        private String method;
        private String url;
        public String getMethod() {
            return method;
        }
        public String getUrl() {
            return url;
        }
        public Builder(String method, String url) {
            if (method == null) {
                method = "GET";
            }
            this.method = method;
            this.url = url;
            this.parameters = new HashMap<String, String>();
        }
        public void addOrReplace(String key, String value) {
            this.parameters.put(key, value);
        }
        public void addAllParameters(Map<String, String> param) {
            this.parameters.putAll(param);
        }
        public String getParameters() {
            return generateParameters();
        }
        public String getParameter(String key) {
            return this.parameters.get(key);
        }
        private String generateParameters() {
            StringBuffer parameters = new StringBuffer();
            Iterator<String> keys = getKeys();
            String key = "";
            while (keys.hasNext()) {
                key = keys.next();
                parameters.append(String.format("%s=%s", key, this.parameters.get(key)));
                parameters.append("&");
            }
            String params = parameters.toString();
            if (params.length() > 0) {
                params = params.substring(0, params.length() - 1);
            }
            return params;
        }
        private Iterator<String> getKeys() {
            return this.parameters.keySet().iterator();
        }
        public HttpClient create() {
            HttpClient client = new HttpClient();
            client.setBuilder(this);
            return client;
        }
    }

이코드는 바꾸지 않을것같다. 나중에 꼼꼼히 해석하며 좀더 나은 코드를 만들수는 있어도..

이것은 http랑 연결하는 작업이고 이제 AnyncTask로 처리하는부분을 보자
안드로이드상 Main에서 네트워크 작업을 할경우, 오류가 뜬다.

Task

public class Task extends AsyncTask<Map<String, String>, Integer, String> {
  public static String ip = "183.xxx.xxx."; // 자신의 IP주소를 쓰시면 됩니다.
  private Context mctx; //이부분은 toast를 쓰려고 Task를 사용하는 activity의 Context를 받기위해 만들어짐.
  public Task(Context ctx) { //Context의 생성자.
      this.mctx = ctx;
  }
  @Override
  protected String doInBackground(Map<String, String>... maps) { // 내가 전송하고 싶은 파라미터
      // Http 요청 준비 작업
      HttpClient.Builder http = new HttpClient.Builder
              ("POST", "http://" + ip + "/gisAndroid.do"); //포트번호,서블릿주소
      // Parameter 를 전송한다.
      http.addAllParameters(maps[0]);
      //Http 요청 전송
      HttpClient post = http.create();
      post.request();
      // 응답 상태코드 가져오기
      int statusCode = post.getHttpStatusCode();
      // 응답 본문 가져오기
      String body = post.getBody();
      return body;
  }
  @Override
  protected void onPostExecute(String s) { //서블릿으로부터 값을 받을 함수
      Gson gson = new Gson();
      MsgVO Msg = gson.fromJson(s,MsgVO.class);
      Toast myToast = Toast.makeText(mctx,Msg.getMsg(), Toast.LENGTH_SHORT);
      myToast.show();
  }

그럼 activity에서 Task를 실행시켜야한다.

activity

try{
                  Task networkTask = new Task(getContext());
                  Map<String, String> params = new HashMap<String, String>();
                  params.put("tpX", String.valueOf(latLng.longitude));
                  params.put("tpY", String.valueOf(latLng.latitude));
                  networkTask.execute(params);
              }catch (Exception e){
                  e.printStackTrace();
              }

WEB부분

SEVLET에 해당하는 코드이다.

@RequestMapping("/gisAndroid.do")
	@ResponseBody
	public Map<String, String> androidTestWithRequestAndResponse(HttpServletRequest request){
	    System.out.println("하하 왔습니다");
		String Msg = "";
		Map<String, String> result = new HashMap<String, String>();
		GisVO selectAddressResult = new GisVO();
		GisVO ParamVO = new GisVO();
		ParamVO.setTpX(Float.parseFloat(request.getParameter("tpX")));
ParamVO.setTpY(Float.parseFloat(request.getParameter("tpY")));
		int insertreult = -1;
		//X, Y 좌표를 가지고 공간정보 조회
		selectAddressResult = GisService.selectaddress(ParamVO);
		selectAddressResult.setTpX(ParamVO.getTpX());
		selectAddressResult.setTpY(ParamVO.getTpY());
		// 조회된 결과를 위치정보에 저장.
		insertreult = GisService.insertGis(selectAddressResult);
		if(insertreult == 1) {
			Msg = "저장 완료하였습니다." ;
		}else if (insertreult ==0) {
			Msg = "조회된 결과가 없습니다." ;
		}else {
			 Msg = "저장 실패하였습니다." ;
		}
		result.put("Msg", Msg); //저장된 결과String을 안드로이드에 던진다.
		return result;
	}

이런식으로 코드를 작성하면 값이 잘들어가는것을 알수있다. 다음은 Firebase를 통한 위치관제를 해보겠다.

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글