충분히 쌓여가는
HTTP 요청과 응답1 본문
클래스 생성(YoilTeller)
년 월 일을 입력하면 해당 날짜가 어떤 요일인지 알려주는 프로그램
YoilTeller 클래스
package com.fastcampus.ch2;
import java.util.Calendar;
// 년월일을 입력하면 요일을 알려주는 프로그램
public class YoilTeller {
public static void main(String[] args) {
// 1. 입력
String year = args[0];
String month = args[1];
String day = args[2];
// 문자열이라서 숫자로 바꿈
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 2. 작업
// 날짜 세팅
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm - 1, dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1: 일요일, 2: 월요일 ...
char yoil = " 일월화수목금토".charAt(dayOfWeek);
// 3. 출력
System.out.println(year + "년 " + month + "월 " + day + "일은 ");
System.out.println(yoil + "요일입니다.");
}
}
Console에서 실행
target -> Show in -> Terminal
열린 Terminal 창에
cd classes 입력: classes 폴더로 이동
실행
java.(패키지 이름).(클래스 이름) 매개변수 값(년 월 일)
java 인터프리터가 com.fastcampus.ch2.YoilTeller 클래스의 main을 호출하는데
2023 5 18과 같은 것들을 java 인터프리터가 문자열 배열에 넣는다
args[0]: 2023
args[1]: 5
args[2]: 18
이렇게 넣은 문자열을 main 메서드에 넣어주고 args[]는 만들어진 문자열 배열을 가리키게 된다(main 메서드 안에서 문자열 배열을 사용할 수 있다)
위 내용과 같이
브라우저 창에 url 주소로 요청을 하면 tomcat이 객체를 만들어주고 main 메서드한테 줌
필요한 것을 매개변수로 선언해주면 tomcat이 알아서 넣어준다
새로운 클래스 생성(RequestInfo)
url: reqeustInfo
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class RequestInfo {
@RequestMapping("/requestInfo")
public void main(HttpServletRequest request) {
System.out.println("request.getCharacterEncoding()="+request.getCharacterEncoding()); // 요청 내용의 인코딩
System.out.println("request.getContentLength()="+request.getContentLength()); // 요청 내용의 길이. 알수 없을 때는 -1
System.out.println("request.getContentType()="+request.getContentType()); // 요청 내용의 타입. 알 수 없을 때는 null
System.out.println("request.getMethod()="+request.getMethod()); // 요청 방법
System.out.println("request.getProtocol()="+request.getProtocol()); // 프로토콜의 종류와 버젼 HTTP/1.1
System.out.println("request.getScheme()="+request.getScheme()); // 프로토콜
System.out.println("request.getServerName()="+request.getServerName()); // 서버 이름 또는 ip주소
System.out.println("request.getServerPort()="+request.getServerPort()); // 서버 포트
System.out.println("request.getRequestURL()="+request.getRequestURL()); // 요청 URL
System.out.println("request.getRequestURI()="+request.getRequestURI()); // 요청 URI
System.out.println("request.getContextPath()="+request.getContextPath()); // context path
System.out.println("request.getServletPath()="+request.getServletPath()); // servlet path
System.out.println("request.getQueryString()="+request.getQueryString()); // 쿼리 스트링
System.out.println("request.getLocalName()="+request.getLocalName()); // 로컬 이름
System.out.println("request.getLocalPort()="+request.getLocalPort()); // 로컬 포트
System.out.println("request.getRemoteAddr()="+request.getRemoteAddr()); // 원격 ip주소
System.out.println("request.getRemoteHost()="+request.getRemoteHost()); // 원격 호스트 또는 ip주소
System.out.println("request.getRemotePort()="+request.getRemotePort()); // 원격 포트
}
}
tomcat 실행
0:0:0:0:0:0:0:1로 출력되는 것은 로컬에서 실행했기 때문
AWS에서 실행하면 제대로된 ip주소 나옴
0:0:0:0:0:0:0:1
YoilTeller를 로컬에서 원격 호출 가능하게 만들기
Main.java 클래스 이름 바꾸기 -> PrivateMethodCall.java
package com.fastcampus.ch2;
import java.lang.reflect.Method;
public class PrivateMethodCall {
public static void main(String[] args) throws Exception{
// Hello hello = new Hello();
// hello.main(); // private 이기 때문에 외부 호출 불가
// Reflection API를 사용 - 클래스 정보를 얻고 다룰 수 있는 강력한 기능 제공
// java.lang.reflect 패키지를 제공
// class 정보 가져오기
// forName("")에 class 이름을 패키지와 같이 입력
// Hello 클래스의 Class 객체(클래스의 정보를 담고있는객체)를 얻어옴
Class helloClass = Class.forName("com.fastcampus.ch2.Hello"); // Class 정보를 이용해 객체를 만들 수 있다
Hello hello = (Hello)helloClass.newInstance(); // Class 객체가 가진 정보로 객체 생성
Method main = helloClass.getDeclaredMethod("main"); // "main" 이라는 메서드의 정보를 가져온 것
main.setAccessible(true); // private인 main()을 호출가능하게
main.invoke(hello); // hello.main() 호출한 것과 같다
}
}
YoilTeller 수정
static 제거
String[] args -> HttpServletRequest reuqest
프로그램 등록: @Controller 애노테이션
URL 연결: @RequestMapping 애노테이션
애노테이션 해준 것들 import 해주기(HttpServeltRequest 도 import)
URL 값: getYoil
package com.fastcampus.ch2;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 년월일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTeller { // http://localhost:8080/ch2/getYoil?year=2023&month=5&day=18
// public static void main(String[] args) {
@RequestMapping("/getYoil")
public void main(HttpServletRequest request) {
// 1. 입력
String year = request.getParameter("year");
String month = request.getParameter("month");
String day = request.getParameter("day");
// 문자열이라서 숫자로 바꿈
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 2. 작업
// 날짜 세팅
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm - 1, dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1: 일요일, 2: 월요일 ...
char yoil = " 일월화수목금토".charAt(dayOfWeek);
// 3. 출력
System.out.println(year + "년 " + month + "월 " + day + "일은 ");
System.out.println(yoil + "요일입니다.");
}
}
tomcat 실행
URL 값: getYoil
에러 발생 이유: 뒤에 값을 안줬기 때문
URL 값
http://localhost:8080/ch2/getYoil?year=2023&month=5&day=18
로컬 프로그램에서 원격 프로그램으로 바꾼 것
브라우저에 결과나오게 바꿈
reponse 객체를 매개변수로 적어줘야 한다(HttpServletResponse response)
response.getWriter: (response객체에서 브라우저로의 출력 스트림을 얻는다 )
출력을 System.out이 아닌 out에 해줌: (콘솔말고 브라우저에 출력해주기 때문)
예외처리 해주기(throws IOException)
출력하기 전 type 작성: 브라우저는 보내는 내용이 text인지 binary인지 모르기 때문
response.setContentType("text/html");
response.setCharacterEncoding("utf-8"); : (없으면 한글 깨짐, 보내는 text의 인코딩이 무엇인지 정확히 알려줘야 한글 안깨짐)
package com.fastcampus.ch2;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 년월일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTeller { // http://localhost:8080/ch2/getYoil?year=2023&month=5&day=18
// public static void main(String[] args) {
@RequestMapping("/getYoil")
public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1. 입력
String year = request.getParameter("year");
String month = request.getParameter("month");
String day = request.getParameter("day");
// 문자열이라서 숫자로 바꿈
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 2. 작업
// 날짜 세팅
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm - 1, dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1: 일요일, 2: 월요일 ...
char yoil = " 일월화수목금토".charAt(dayOfWeek);
// 3. 출력
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter(); // response객체에서 브라우저로의 출력 스트림을 얻는다
out.println(year + "년 " + month + "월 " + day + "일은 ");
out.println(yoil + "요일입니다.");
}
}
이제 브라우저에서도 나옴
'Spring > Spring' 카테고리의 다른 글
원격 프로그램 실행 (0) | 2023.05.16 |
---|---|
Spring으로 개발하기 위해 필요한 도구들 (0) | 2023.05.12 |