서블릿은 기본적으로 lazy-init 이지만 loadOnStartup으로 인해 처음에 초기화 가능

그리고 아래는 호출을 할때 우선순위이다.

 

아래와 같이 /hello.do 로 오면 default가 처리한다 (정적 리소스)

 

 

 

 

 

 

el을 실습해 볼 것이다.

 

Car 클래스를 만들고

 

package com.fastcampus.ch2;

public class Car    { 
	private String color = "red"; 
	public String getColor() { return color; }
}

 

 

Person 클래스를 하나 만든다.

package com.fastcampus.ch2;

public class Person { 
	private Car car = new Car(); 
	public  Car getCar() { return car; }
}

 

 

 

src - main - webapp - new - other -jsp 

 

 

<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="com.fastcampus.ch2.*" %>
<%
	Person person = new Person();
	request.setAttribute("person", person);
	request.setAttribute("name", "남궁성");   
	request.setAttribute("list", new java.util.ArrayList());	
%>
<html>  
<head>   
	<title>EL</title>   
</head>  
<body>   
person.getCar().getColor()=<%=person.getCar().getColor()%> <br>
person.getCar().getColor()=${person.getCar().getColor()} <br>
person.getCar().getColor()=${person.car.color} <br>    
name=<%=request.getAttribute("name")%> <br>   
name=${requestScope.name} <br>
name=${name} <br>
id=<%=request.getParameter("id")%> <br>
id=${pageContext.request.getParameter("id")} <br>
id=${param.id} <br>
"1"+1 = ${"1"+1} <br>
"1"+="1" = ${"1"+="1"} <br>
"2">1 = ${"2">1} <br>   
null = ${null}<br>
null+1 = ${null+1} <br>
null+null = ${null+null} <br>
"" + null = ${""+null} <br>   
""-1 = ${""-1} <br> 
empty null=${empty null} <br>
empty list=${empty list} <br>
null==0 = ${null==0} <br>
null eq 0 = ${null eq 0} <br>
name == "남궁성"=${name=="남궁성"} <br>
name != "남궁성"=${name!="남궁성"} <br>
name eq "남궁성"=${name eq "남궁성"} <br>  
name ne "남궁성"=${name ne "남궁성"} <br>  
name.equals("남궁성")=${name.equals("남궁성")} <br>   
</body>
</html>

 

실행을 해보면 결과물

이제 변환되는 과정을 볼 것이다.

 

deploy 경로를 복사 후 Don't Save

 

 

탐색기로 이동 후 뒤로가기 한번 한 후 - work - Catalina - localhost - app -org - apache - jsp

 

위에 폴더를 타고 들어가면 스프링이 변환 된 뷰 이고

 

el_jsp.java 서블릿 소스 파일

위에 class는 컴파일 된 것이다.

 

 

만약에 실행이 잘 되지 않아서 지우고 싶으면 여기서 맨 위 폴더를 지우고 제외하거나

이러한 방식으로 지울 수 있다.

 

jsp를 변경 시 적용 안될 때 사용하고 다시 실행하면 만들어진다.

 

request에 map형태로 저장하는 과정

 

 

 

위에 처럼 저장을 하지 않으면

아래 방법으로는 el에서 표시할 수 없다.

 

el에서 "1" + 1 = 11가 아닌 문자열이 숫자로 바뀌어서 2로 출력됨.

 

저장소는 총 4가지가 있다.

1.pageContext

2. application

3. session

4. request

 

같은 페이지 안에섬나 접근 가능

요청할때마다 초기화 됨

 

 

어플리케이션 저장소를 모두 저장하기에 id를 저장하기엔 좋지 않다.

 

 

세션은 1대1이기에 사용자 수 만큼 개수가 생긴다.

따라서 최소한의 데이터만 저장해야 한다.

 

 

request 저장소는 첫번째 jsp에서받지 않고 두번째로 받을 수 있다.

 

요약

 

 

package com.fastcampus.ch2;

import java.io.IOException;

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

public class HelloServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
	}

	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
	}

}

 

 

호출이 언제 되는지 확인

package com.fastcampus.ch2;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet{

	@Override
	public void init() throws ServletException {
		// 서블릿이 초기화 될 때 자동 호출되는 메서드
		// 1. 서블릿의 초기화 작업 담당
		System.out.println("[HelloServlet] init() is called");
	}
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("[HelloServlet] service() is called");
	}

	@Override
	public void destroy() {
		System.out.println("[HelloServlet] destroy() is called");
	}

	

}

 

init은 처음에만 호출되고 새로고침하면 service는 계속 호출된다.

 

 

코드를 수정하고 저장하면 재시작 되므로

destroy가 호출됨

 

 

 

JSP

 

 

 

<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.util.Random" %>
<%-- <%! 클래스 영역 %> --%>
<%!  
	int getRandomInt(int range){
		return new Random().nextInt(range)+1;
	}
%>
<%-- <%  메서드 영역 - service()의 내부 %> --%>
<%
	int idx1 = getRandomInt(6);
	int idx2 = getRandomInt(6);
%>
<html>
<head>
	<title>twoDice.jsp</title>
</head>
<body>
	<img src='resources/img/dice<%=idx1%>.jpg'>
	<img src='resources/img/dice<%=idx2%>.jpg'>
</body>
</html>

 

별도로 매핑해주지 않아도 jsp는 자동으로 매핑이 된다.

 

 

 

 

서블릿 : lazy-init

spring : early-init

 

 

서비스 메서드에 기본으로 생성되어 있는 것들은 사용가능

package com.fastcampus.ch2;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.StringJoiner;

public class MethodInfo {
	public static void main(String[] args) throws Exception{

		// 1. YoilTeller 클래스의 객체를 생성
		Class clazz = Class.forName("com.fastcampus.ch2.YoilTeller");
		Object obj = clazz.newInstance();
		
		// 2. 모든 메서드 정보를 가져와서 배열에 저장
		Method[] methodArr = clazz.getDeclaredMethods();
		
		for(Method m : methodArr) {
			String name = m.getName(); // 메서드의 이름
			Parameter[] paramArr = m.getParameters(); // 매개변수 목록
//			Class[] paramTypeArr = m.getParameterTypes(); // 반환 타입
			Class returnType = m.getReturnType();
			
			StringJoiner paramList = new StringJoiner(", ", "(", ")"); // 구분자, 접두사, 접미사
			
			for(Parameter param : paramArr) {
				String paramName = param.getName();
				Class  paramType = param.getType();
				
				paramList.add(paramType.getName() + " " + paramName);
			}
			
			System.out.printf("%s %s%s%n", returnType.getName(), name, paramList);
		}
	} // main
}

 

 

 

 

 

매개변수의 이름을 저장하지 않아서 arg0으로 출력됌

 

메서드의 매개변수 이름이 필요하기 때문에 컴파일러 옵션에 parameters를 준다.(매개변수 이름을 저장)

JDK 1.8부터 추가되었다.

 

Window - Preferences

 

 

다시 실행해도 파라미터가 나오지 않는 것은 1.6버전이기 때문이다.

 

자바의 버전을 변경하기 위해 pom.xml 로 들어가서 수정

버전 복사

 

아래로 내려서 plugin도 변경해준다.

${java-version} 대신에 직접 11버전이면 11을 입력해줘도 되지만 위에 프로퍼티에 버전이 언제든지 바뀌면

따로 수정하지 않아도 되므로 문자열로 이렇게 받도록 수정해주는 것이다.

 

 

메이븐을 사용중이므로 업데이트 프로젝트를 해주어야 한다.

 

 

재실행을 해보면 이제 매개변수의 이름이 출력되었다.

 

 

Window - Show View - Other

탐색기라고 생각하면 된다.

 

이번엔 YolilTellerMVC이 매개변수를 출력해보았다.

 

메서드의 진행 방향과 인스턴스의 생성과정

 

다른 예제를 가져왔다.

 

package com.fastcampus.ch2;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

class ModelController {
	public String main(HashMap map) {
		// 작업 결과를 map에 저장
		map.put("id", "asdf");
		map.put("pwd", "1111");
		
		return "txtView2"; // 뷰이름을 반환
	}
}

public class MethodCall {
	public static void main(String[] args) throws Exception{
		HashMap map = new HashMap();
		System.out.println("before:"+map);

		ModelController mc = new ModelController();
		String viewName = mc.main(map);
		
		System.out.println("after :"+map);
		
		render(map, viewName);
	}
	
	static void render(HashMap map, String viewName) throws IOException {
		String result = "";
		
		// 1. 뷰의 내용을 한줄씩 읽어서 하나의 문자열로 만든다.
		Scanner sc = new Scanner(new File(viewName+".txt"));
		
		while(sc.hasNextLine())
			result += sc.nextLine()+ System.lineSeparator();
		
		// 2. map에 담긴 key를 하나씩 읽어서 template의 ${key}를 value바꾼다.
		Iterator it = map.keySet().iterator();
		
		while(it.hasNext()) {
			String key = (String)it.next();

			// 3. replace()로 key를 value 치환한다.
			result = result.replace("${"+key+"}", (String)map.get(key));
		}
		
		// 4.렌더링 결과를 출력한다.
		System.out.println(result);
	}
}

 

 

실행을 해봤는 txtView2.txt 가 없어서 에러가 났다.

 

ch2우 클릭후 new - file

 

viewTxt1.txt

 

viewTxt2.txt

 

다시 MethodCall을 실행

현재 view2를 출력하여서 이렇게 출력된 것이고 view1로 바꾼다면 이렇게 출력된다.

기존에 있던 YoilTeller를 복붙하고 이름 변경

 

 

 

입력부분을 주석처리 그리고 직접 입력받게 할 것이다.

 

작업 부분도 직업 int형으로 받으면 되기 때문에 주석처리

 

url매핑도 중복되면 안되므로

getYoil 에서 getYoilMVC로 변경

 

관심사 분리전이랑 똑같은 결과

 

출력부분도 별도의 jsp파일로 빼낼 수 있으므로 주석처리

대신 별도의 jsp를 만들어야한다.

기존에 있던 home.jsp를 복사한 후 이름을 변경해서 yoil.jsp 와 yoilError.jsp생성

 

바디 부분을 수정하고 저장하려니 오류가 났다.

인코딩 문제라 첫줄에 인코딩 방식추가

혹은 에러가 난 부분을 지우고 다시 붙여넣기 한 후 저장하면 에러가 해결되는 경우도 있다고 한다.

 

yoil.jsp

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

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<P> ${year }년 ${month }월 ${day }일은 ${yoil }입니다. </P>
</body>
</html>

 

혹은 Save as UTF-8 클릭

 

yoilError.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	잘못된 요청입니다. 년, 월, 일을 모두 올바르게 입력해주세요.
</h1>


</body>
</html>

 

 

다시 yoilTellerMVC로 돌아감.

 

입력같이 틀린경우 yoilError를 출력해야하니 유효성 검사에 추가

 

 

별도의 메서드로 뽑아낼 수 있다.

드래그 후 우클릭 Refactor - Extract Method

 

메서드의 이름은 getYoil

private으로 메서드가 생겼는데 좀 수정해야 한다.

 

 

 

isVaild도 클릭후 자동으로 메서드 생성 클릭

 

 

위에 valid메서드에 false라고 되어있기에 이렇게 나오는데 true로 변경

 

컨트롤러가 작업한 것이 뷰에 잘 적용되지 않아서 숫자가 입력되지 않음.

 

모델로 변경

그후 모델에 저장하면 잘 출력됌

 

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.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class YoilTellerMVC { // http://localhost:8080/app/getYoilMVC?year=2024&month=11&day=1
	@RequestMapping("/getYoilMVC")
//	public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
	public String main(int year, int month, int day, Model model) throws IOException {
		// TODO Auto-generated method stub
		
		// 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);
		
		// 1. 유효성 검사
		if(!isValid(year, month, day))
			return "yoilError";
		
		// 2. 요일 계산
		char yoil = getYoil(year, month, day);
		
		
		//3. 계산한 결과를 model에 저장
		model.addAttribute("year", year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);
		model.addAttribute("yoil", yoil);
		
		return "yoil";// WEB-INF/views/yoil.jsp
		// 3. 출력
//		response.setContentType("text/html");//텍스트 인지 알려주고
//		response.setCharacterEncoding("utf-8"); //인코딩 방식을 알려주어야 한다.
//		PrintWriter out = response.getWriter(); // response객체에서 브라우저로 출력 스트림을 얻는다.
//		out.println(year + "년" + month + "월" + day + "일은");
//		out.println(yoil + "요일입니다");
		
	}

private boolean isValid(int year, int month, int day) {
	// TODO Auto-generated method stub
	return true;
}

private char getYoil(int year, int month, int day) {
	Calendar cal = Calendar.getInstance(); //날짜 셋팅
	cal.set(year, month-1, day);
	
	int dayOfweek = cal.get(Calendar.DAY_OF_WEEK); //1:일요일, 2:월요일 ...
	return " 일월화수목금토".charAt(dayOfweek); //다시 문자열로 변환
}

}

 

 

 

view의 경로를 담당하는 부분 servlet-context.xml

 

 

반환타입을 void로 하면 매핑된 주소로 이동된다.

 

모델과 뷰를 한번에도 볼 수 있다.

 

 

결론

 

 

 

숫자를 문자열로 변경시 바이트가 작아질 수도 커질 수도 있다.

 

 

이번엔 POST로 텍스트와 이미지 파일 두 종류를 넣었다.

 

 

 

RequestHeader라는 클래스를 만든다.

 

package com.fastcampus.ch2;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RequestHeader {
	@RequestMapping("/requestHeader")
	public void main(HttpServletRequest request) {
		
		Enumeration<String> e = request.getHeaderNames();

		while (e.hasMoreElements()) {
			String name = e.nextElement();
			System.out.println(name + ":" + request.getHeader(name));
		}
	}
}

 

http://localhost/app/requestHeader

 

 

https://github.com/castello/spring_basic/blob/main/ch2/RequestMessage.java

 

spring_basic/ch2/RequestMessage.java at main · castello/spring_basic

남궁성의 스프링 기본 강의 @fastcampus.co.kr. Contribute to castello/spring_basic development by creating an account on GitHub.

github.com

 

GET에는 바디가 없지만 POST에는 바디가 있다.

 

 

바디가 있을 때

 

 

여기는 자주 사용하니 알아두자

 

Base64

 

 

 

총 2의 6제곱이므로 6비트이고

그에 따라 6글자 씩 끊어서 사용한다.

 

 

이미지를 base64로 변환할 것이다.

https://www.base64encode.net/

 

Base64 Encode - Online Tool

Encode and Decode Base64 data with this online base64 encoder.

www.base64encode.net

이미지를 넣고 변환

 

이제 Visual Studio Code를 킨다.

 

저걸 복사해서 , 뒤에 붙여넣기

 

우클릭 후 open in default browser

프로토콜이란?

서로간의 통신을 위한 약속 규칙

주고 받을 데이터에 대한 형식을 정의한 것

ex)야구에서 사인주기, 글의 서식

 

HTTP(Hyper Text Transfer Protocal) - 텍스트 기반의 프로토콜(단순하고 읽기 쉬움)

: 상태를 유지X(stateless) -> 클라이언트 정보를 저장X

 

100번대는 HTTP 1.1때 추가된것인데 정보교환을 위함

 

빈줄이 나오면 헤더 끝

 

Get이 Read 라면 Post는 Write

 

url에 들어가서

검사 -> Networkd -> Ctrl+R

 

 

 

 

포스트맨이라는 확장프로그램을 사용해서 GET 이나 POST 뿐 아닌 반복적인 요청에 편리함

 

https://chromewebstore.google.com/detail/tabbed-postman-rest-clien/coohjcphdfgbiolnekdpbcijmhambjff?hl=ko&gl=CZ

 

Tabbed Postman - REST Client - Chrome 웹 스토어

No separate window required! This is the legacy postman extension that can run in a Chrome tab. * Now runs in tab. * Does not…

chromewebstore.google.com

 

확장프로그램 누르고 고

파란색 아이콘 클릭 후 이동

url을 복사 한 후 send

url parameter을 주지 않아 내부 서버 오류가 났다.

 

 

파라미터를 추가하고 다시 send하면 잘 전송됌

 

 

이번엔 POST로 보낼 것인데 위에 썼던 것을 지우고 다시 입력

그 후 Preview 클릭

 

요청라인과 헤더 그리고 입력한 값이 바디로 전송됨을 확인할 수 있다.

새로운 클래스 만들기

 

다이스 이미지파일 다운로드 후 src - main - webapp - resources 안에 붙여넣기

 

 

package com.fastcampus.ch2;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller //ctrl + shift + o => 자동 import
public class TwoDice {
	@RequestMapping("/rollDice")
	public void main(HttpServletResponse response)throws IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("</head>");
		out.println("<body>");
		out.println("<img src = '/img/dice1.jpg'>");
		out.println("<img src = '/img/dice2.jpg'>");
		out.println("</body>");
		out.println("/html>");
	}

}

 

 

서버를 킨후 뒤에 /rollDice를 붙여 넣어준다.

 

이렇게 나올텐데 당황하지 말고 우클릭 후 페이지 소스보기

 

이번엔 검사를 했다.

경로가 잘못되어서 이미지가 나오지 않음.

경로를 바꾸어서 입력하였다.

 

코드에서 경로를 바꿔야 한다.

경로에 resources를 한번 타고 들어가야하기 때문에 resources/ 를 추가

 

 

Math.random() * 6은 0~5까지라서 + 1

이 때 중요한 것은 문자열을 어떻게 붙이는지 이다. + " aaaa" + 가 아닌 "+aa+" 이다.

 

이제 새로고침할때 마다 주사위의 숫자가 다르게 나온다.

 

프로그램의 진행 순서로를 보기 위해 16째줄 우클릭 후 브레이크 포인트(중단점)

 

run as 가 아닌 debug as로 접속을 하면 화면이 멈춰지고 디버깅 내용이 찍힌다.

 

 

Http프로세서가 요청을 받아 요청정보를 Request 객체 담아서 보낸다.

스레드에서 프로세서 엔진 그리고 컨텍스트로 진행 중을 볼 수 있다.

엔진안에 호스트 그 안에 컨텍스트가 있기 때문

그리고 디스패처 서블릿이 받는다.

컨트롤러로 이동

 

프로그램의 실행결과를 톰캣이 아닌 브라우저에 출력할 것이다.

년월일을 말하면 요일을 출력할 것이다.

 

새로운 클래스를 만든다.

 

package com.fastcampus.ch2;

import java.util.Calendar;

public class YoilTeller {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 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 + "요일입니다");
		
	}

}

 

 

매개변수로 받아야해서 콘솔에서 실행해야 한다.

cd classes

java com.fastcampus.ch2.YoilTeller 2024 10 29

입력하면 요일이 출력됨

 

 

 

 

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()); // 원격 포트
    }
}

 

서버를 실행해서 url에 검색했다.

 

Main클래스의 이름을 PrivateMethodCall로 변경

 

 

다시 YoilTeller 클래스에 들어가서 원격으로 request받기 위해 코드 수정

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 {
	@RequestMapping("/getYoil")
	public void main(HttpServletRequest request) {
		// TODO Auto-generated method stub
		
		// 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 + "요일입니다");
		
	}

}

 

 

 

브라우저에 결과 나오기 위해 리스폰스 객체를 매개변수로 추가 해야한다.

 

또한 println으로 출력된 것을 브라우저로 맞춰서 변환 + 예외처리

 

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 {
	@RequestMapping("/getYoil")
	public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// TODO Auto-generated method stub
		
		// 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 + "요일입니다");
		
	}

}

 

utf-8로 인코딩 방식을 알려줌으로서 한글 깨짐 방지

 

다시 url 에 입력

같은 컴퓨터 안에 브라우저와 톰캣을 띄어봤으니

이제 본격적으로 AWS에 올려 볼 것이다.

 

그러기 위핸 우리가 만든 프로젝트를 export해야 한다.

 

war파일 선택 후

 

프로젝트이름과 경로를 저장하는데 이때 중요한 것은

확장자를 .war로 해야 한다.

압축파일로 만들어질 수도 있고 war자체로 만들어질 수 있는데 상관 없다.

 

 

 

 

aws에 들어가서 프리티어 서비스 사용량을 확인 할 수 있다.

오른쪽 상단에 본인 아이디 클릭 후 - 계정 - 프리티

인스턴스가 실행중이라면 사용하지 않을 경우 중지를 하자

 

원격을 다시 시작하려니 갑자기 만들었던 인스턴스가 보이지 않았다.

알고보니 지역선택이 바뀌어져 있으니 원래 지정했던 것으로 돌려놓으니 해결된다.

 

 

연결

 

 

중지했다 시작하면 ip가 바뀌므로 원격 데스크톱 다운로드를 다시 해주어야 한다.

 

기존의 만들었던 key를 가져오고 해독한 후 복붙

 

아까 만들었던 ch2.war 파일을 apache-tomcat - webapps에 복붙하면 자동으로 압축이 풀린다.

 

createshortcut 후 바탕화면으로 이동

 

실행을 하면 압축이 풀리면서 ch2 폴더가 만들어진다.

 

 

이제 로컬에서 원격 aws서버를 접속할 것인데

IPv4 퍼블릭 ip를 복사

 

로컬PC에서 localhost 대신 복사한 IPv4를 붙여 넣으면 이렇게 나오는데 

 

IPv4 + :8080/ch2/hello 하니 접속이 된 것을 확인할 수 있다.

+ Recent posts