반응형
반응형

📝body 데이터 받기 (Servlet)

@RequestMapping(value = "/post.do", method = RequestMethod.POST)
public void post(HttpServletRequest request, HttpServletResponse response) throws IOException {
	
    // 한번만 호출 가능 (분석 안 해서 왜 그런지는 모름)
	String body = getBody(request);
    System.out.println(body);
    JSONObject obj = new JSONObject(body);

    System.out.println(obj.get("searchWord"));
    System.out.println(obj.get("pageNum"));

    response.setContentType("application/json; charset=UTF-8");
    PrintWriter writer = null;

    writer = response.getWriter();
    writer.print(obj);
    writer.flush();
}

public static String getBody(HttpServletRequest request) throws IOException {

    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;

    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }

    body = stringBuilder.toString();
    return body;
}

출처 : https://kwonyang.tistory.com/2

 

📝body 데이터 받기 (requestBody) [HashMap]

package com.lsj.spring_study;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	final static Logger logger = LogManager.getLogger(HomeController.class);
	final static Logger APIParamLogger = LogManager.getLogger("AS_API_PARAM");
	
	@RequestMapping(value = "/getLogs.do", method = RequestMethod.GET)
	public void logs() {

		
		APIParamLogger.error("TRACE TEST");
        logger.info("INFO TEST");
        logger.debug("DEBUG TEST");
        logger.warn("WARN TEST");
        logger.error("ERROR TEST");
        logger.fatal("FATAL TEST");
        System.out.println(logger.getLevel());
        System.out.println(logger.getLevel().intLevel());		
//		Logger APIParamLogger = LogManager.getLogger("AS_API_PARAM");
//		APIParamLogger.info("abc");
		
		
	}
	
	
	/** params **/
	@RequestMapping(value = "/params.do", method = RequestMethod.POST)
	public void params(String code,String name) {

		// 호출 Url      : localhost:8080/jsonToObject.do?name=hello&age=20e
		// Content-Type : params
		// Header 		:  key → name, Value → hello 
		// Header 		:  key → age, Value → 20
		
		System.out.println(">>> " + code); // null
		System.out.println(">>> " + name); // Lee
		
		/** 일반적으로 POST 방식에 쿼리스트링을 붙히지 않지만 붙혀도 인식이 가능하다. **/
	}

	/** params **/
	@RequestMapping(value = "/paramsToObject.do", method = RequestMethod.POST)
	public void paramsToObject(BodyVO bodyVO) {

		// 호출 Url      : localhost:8080/jsonToObject.do?name=hello&age=20e
		// Content-Type : params
		// Header 		:  key → name, Value → hello 
		// Header 		:  key → age, Value → 20
		
		System.out.println(">>> " + bodyVO.getName()); // hello
		System.out.println(">>> " + bodyVO.getAge()); // 20
		
		/** 일반적으로 POST 방식에 쿼리스트링을 붙히지 않지만 붙혀도 인식이 가능하다. **/
	}
	

	
	
	/** application/x-www-form-urlencoded **/
	@RequestMapping(value = "/urlencoded.do", method = RequestMethod.POST)
	public void urlencoded(String code,String name) {

		// 호출 Url      : urlencoded.do?name=Lee
		// Content-Type : application/x-www-form-urlencoded
		// Body 		:  key → code, Value → ABC 
		//    			   key → name, Value → Lee
		
		System.out.println(">>> " + code); // ABC
		System.out.println(">>> " + name); // Lee 
		
		// 일반적으로 POST 방식에 쿼리스트링을 붙히지 않지만 붙혀도 인식이 가능함
		// x-www-form-urlencoded 의 경우 쿼리스트링처럼 code=ABC 인식을 한다.
	}
	
	/** application/x-www-form-urlencoded **/
	@RequestMapping(value = "/urlencodedToObject.do", method = RequestMethod.POST)
	public void urlencodedToObject(BodyVO bodyVO) {
		
		// 호출 Url      : urlencoded.do
		// Content-Type : application/x-www-form-urlencoded
		//    			   key → name, Value → Lee
		// Body 		:  key → age, Value → 20 
		
		System.out.println(">>> " + bodyVO.getName()); // Lee
		System.out.println(">>> " + bodyVO.getAge()); // 20
	}
	
	/** application/x-www-form-urlencoded의 경우 따로 RequestBody가 필요없다. 동작방식이 GET의 Header와 동일한 것 같다 **/
	
	
	/** 이 밑에의 MIME 타입은 반드시 RquestBody를 사용해서 값을 받을 수 있다. **/
	/** text **/
	@RequestMapping(value = "/text.do", method = RequestMethod.POST)
	public void text(@RequestBody String bodyContents) {

		// 호출 Url      : text.do
		// body 		: this is text
		// Content-Type : text 또는 text/html
		System.out.println(">>> " + bodyContents); // this is text
		
	}
	
	
	/** application/json **/
	@RequestMapping(value = "/json.do", method = RequestMethod.POST)
	public void json(@RequestBody String bodyContents) {

		// 호출 Url      : json.do
		// body 		: {"content" : "this is json"}
		// Content-Type : application/json
		System.out.println(">>> " + bodyContents); // {"content" : "this is json"}
		
	}
	
	/** application/json (Object Injection) **/
	@RequestMapping(value = "/jsonToHashMap.do", method = RequestMethod.POST)
	public @ResponseBody HashMap<String, Object> jsonToObject(@RequestBody HashMap<String, Object> bodyVO) {

		/** BodyVO (HashMap도 또한 Object이기 떄문에 동일하게 적용 된다. **/
		// String name
		// String age → int 형으로 값을 보내면 못 자동 Injection이 안 된다. "age" : 20 (X)
		
		/** 참고로 BodyVO에 default값이 설정되어 있어도 ReuqestBody에 넘어온 값이 없다면(body에 json을 안 보내면) null로 덮어씌워진다. **/
		/** 필요사항에서는 데이터를 까서 검증하는 작업을 직접해야할 거 같다. **/
		
		// 호출 Url      : jsonToObject.do
		// body 		: {"name" : "lee", "age":"20"}
		// Content-Type : application/json
		
		System.out.println(bodyVO); // {name=lee, age=20}
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("bodyVO", bodyVO);
		
		return map;
	}
	
	
	/** application/json (Object Injection) **/
	@RequestMapping(value = "/jsonToObject.do", method = RequestMethod.POST)
	public @ResponseBody HashMap<String, Object> jsonToObject(@RequestBody BodyVO bodyVO) {

		/** BodyVO (HashMap도 또한 Object이기 떄문에 동일하게 적용 된다. **/
		// String name
		// String age → int 형으로 값을 보내면 못 자동 Injection이 안 된다. "age" : 20 (X)
		
		/** 참고로 BodyVO에 default값이 설정되어 있어도 ReuqestBody에 넘어온 값이 없다면(body에 json을 안 보내면) null로 덮어씌워진다. **/
		/** 필요사항에서는 데이터를 까서 검증하는 작업을 직접해야할 거 같다. **/
		
		// 호출 Url      : jsonToObject.do
		// body 		: {"name" : "lee", "age":"20"}
		// Content-Type : application/json
		System.out.println(">>> " + bodyVO.getName()); // lee
		System.out.println(">>> " + bodyVO.getAge()); // 20
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("bodyVO", bodyVO);
		
		return map;
	}
	
	/**
	 * jsonToObject.do을 사용하기 위해서는 하기 라이브러리가 필요 (body 내용을 Object에 Injeciton)
	 * 없어도 주입이 되는 것처럼 보이지만 4번에 한번씩 에러를 뱉는 현상 발견
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.9.3</version>
	</dependency>
	
	<dependency>
		<groupId>org.codehaus.jackson</groupId>
		<artifactId>jackson-mapper-asl</artifactId>
		<version>1.9.13</version>
	</dependency>
	**/
	
	
	
	
	
	
	
	/** responseBody란 처리한 결과를 클라이언트에게 다시 돌려줘서 읽을 수 있게한다. (즉 return 값이 있어야한다.) **/
	// 미사용시 → 404 페이지를 찾을 수 없음
	// 사용시 → {"bodyVO" : {"name" : "lee", "age":"20"}}
	

}
  • RequestBody를 이용해 body에 내용을 읽을 수 있다.
  • 주의) 라이브러리 필요  → 전자정부의 경우 dispatcher에 추가 작업 해야함 

 

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.3</version>
</dependency>

 

📝POST방식 통신 (return JSONObject)

StringBuffer response;
// map은 body에 담아서 보낼 데이터가 존재할 때 사용 (일반적 json으로 많이 보내서 적음)
public JSONObject getConnection(String uri, HashMap<String,Object> map) {
    StringBuilder sb = null;

    HttpURLConnection conn = null;
    JSONObject responseJson = null;

    try {
        URL url = new URL(uri);

        conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(5000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "application/json");



        System.out.println(map);
/*			
        // body에 json 데이터 담아서 request 할때 사용
        JSONObject obj = new JSONObject(map);

        try (OutputStream os = conn.getOutputStream()){
            byte request_data[] = obj.toString().getBytes("utf-8");
            os.write(request_data);
            os.close();
        }			
*/

        int responseCode = conn.getResponseCode();
        if (responseCode == 400 || responseCode == 401 || responseCode == 500) {
            System.out.println(responseCode + " Error!");
        } else {
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
            sb = new StringBuilder();
            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            responseJson = new JSONObject(sb.toString());
            // System.out.println(responseJson);

            return responseJson;
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        System.out.println("not JSON Format response");
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return responseJson;
}

 

 

📝Get방식 통신 (return JSONObject)

public JSONObject getConnection(String uri) {
    StringBuilder sb = null;

    HttpURLConnection conn = null;
    JSONObject responseJson = null;

    try {
        URL url = new URL(uri);

        conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(5000);
        conn.setRequestMethod("GET");
        // conn.setDoOutput(true);

        JSONObject commands = new JSONObject();

        int responseCode = conn.getResponseCode();
        if (responseCode == 400 || responseCode == 401 || responseCode == 500) {
            System.out.println(responseCode + " Error!");
        } else {
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
            sb = new StringBuilder();
            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            responseJson = new JSONObject(sb.toString());
            // System.out.println(responseJson);

            return responseJson;
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        System.out.println("not JSON Format response");
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return responseJson;
}

 

📝Get방식 통신 (return String)

StringBuffer response;
public String callGetMethod(String url) {		


    try {

        // 통신 주소  등록
        URL obj = new URL(url);

        // 통신 방식 설정
        HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
        conn.setRequestProperty("Content-Type", "application/json; charset=utf-8" );
        conn.setDoOutput(true);
        conn.setRequestMethod("GET");

        // ---- 읽어온 데이터를 담기 ----
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

        String inputLine;
        response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    // ---- 읽어온 데이터를 반환 ----
    String responseData =response.toString();
    return responseData; 
}

conn.setRequestProperty만 주의해서 작성 나머진 그대로 활용 가능 → application/json; charset-utf-8

 

📝Delete 방식 통신

public void callDeleteMethod(String url) {

    URL obj;
    try {
        obj = new URL(url);

        HttpURLConnection httpCon = (HttpURLConnection) obj.openConnection();
        httpCon.setDoOutput(true);
        httpCon.setRequestMethod("DELETE");
        httpCon.connect();

        int responseCode = httpCon.getResponseCode();
        // connect만 해서 끝이 아니라 무조건 어떤 행동을 해야 위에 동작이 진행된다.

    } catch (Exception e) {
        e.printStackTrace();
    }
}
반응형
반응형
String encodeResult = URLEncoder.encode(String encodingString, String charsetName);
String decodeResult = URLDecoder.decode(String decodingString, String charsetName);

예) 
  String encodeResult = URLEncoder.encode("짜장면", "UTF-8");
  String encodeResult = URLEncoder.encode("짜장면", "EUC-KR");
  String decodeResult = URLDecoder.decode("라면","UTF-8");

이런식으로 사용 가능합니다. 

 

반응형
반응형

📝1. 톰켓설치경로/conf/server.xml 을 열고 URIEncoding 을 추가


<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />

📝2. 톰켓설치경로/binsetenv.sh 파일 생성 후 내용 추가.


  #!/bin/bash
  JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=\"utf-8\""

반응형
반응형

이 문제의 원인은 tomcat에서 호출한 경로를 제대로 인식하지 못해서 발생한다고 합니다.

 

Servers 탭 톰캣 더블클릭해서 열어주시고 Modules를 눌러주세요 그리고 Path를 /로 바꿔주세요

 

Project - Properties - Web Project Setting 에서 / 로 잡아주세요

반응형
반응형

 

📝Navigator

디렉토리 구조를 쉽게 볼 수 있습니다.

 

📝Project Explorer

오류를 쉽게 볼 수 있습니다. 둘다 띄어놓고 하시면 편합니다.

 

📝bin

바이트코드(JVM이 읽을 수 있는 언어)로 저장되어 있음

 

📝src

자바 소스코드가 들어가 있다

반응형
반응형

Project - Properties - Web Deploymeny Assembly 에서 경로를 볼 수 있습니다.

 

여기서 하나를 보자면 Source에는 /src/main/webapp 이렇게 적혀있고 Deploy path는 /로 되어있습니다. 그러면 /만 써주면 저 경로를 단축해서 보여주는 겁니다.

주의할 점이 있는데요 src/main ...과 target/ ...과 deploy Path는 동일하지만 그 안에 들어가 있는 폴더들 이름과 종류가 다르기 때문에 찾아갈 수 있습니다. 하지만 동일한 구조면 이상한 걸 참조하게 되겠죠

반응형
반응형

Maven repositoy 경로를 설정하기 위한 settings.xml 입니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
	
    <localRepository>F:\project\search_project\aa\maven\repository</localRepository>
	<interactiveMode>true</interactiveMode>
	<offline>true</offline>
</settings>

 

1. 메이븐 repository의 경로를 바꿔줍니다.

 

2. 이클립스에서 preference - maven - usersetting - setting.xml경로 해주시면됩니다.

반응형
반응형

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

이것을 미리 적고 jsp 확장자로 변경하면 안 깨집니다.

반응형
반응형

war파일tomcat/webapps 경로에 가져다 두면 알아서 deploy(배포)된다.

webapps 경로에 있는 war파일을 옮기면 deploy된 게 undeploy된다.

반응형