package com.example.yaejunshin_finalproject;

public class Car {
    private int id;
    private String name;
    private int price;
    private String owner;
    private int year;

    public Car(int id, String name, int price, String owner, int year) {
        this.id = id;

        //차량 이름 검증(공백금지)
        if(name == null || name.isEmpty()){
            throw new IllegalArgumentException("차량 이름은 필수이며, 공백일 수 없습니다.");
        }
        this.name = name;

        //차량 가격 검증(0보다 커야 함)
        if(price <= 0){
            throw new IllegalArgumentException("차량 가격은 0 보다 커야 합니다.");
        }
        this.price = price;

        //차량 소유자 검증(null 또는 빈 문자열은 허용하지 않습니다.)
        if(owner == null || owner.isEmpty()){
            throw new IllegalArgumentException("차량 소유자는 필수이며, 공백일 수 없습니다.");
        }
        this.owner = owner;

        //차량 연식 검증(1950보다 커야함)
        if(year <= 1950){
            throw new IllegalArgumentException("차량 연식은 1950 보다 커야 합니다.");
        }
        this.year = year;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    public String getOwner() {
        return owner;
    }

    public int getYear() {
        return year;
    }

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price='" + price + '\'' +
                ", owner='" + owner + '\'' +
                ", year=" + year +
                '}';
    }
}

 

 

package com.example.yaejunshin_finalproject;

public class User {
    private int id;
    private String name;
    private String email;

    public User(int id, String name, String email) {
        this.id = id;

        //유저 이름 검증(공백금지)
        if(name == null || name.isEmpty()){
            throw new IllegalArgumentException("null 또는 빈 문자열은 허용하지 않습니다.");
        }
        this.name = name;

        //유저 이메일 검증(필수이며 공백금지)
        if(email == null || email.isEmpty()){
            throw new IllegalArgumentException("유저 이메일은 필수이며, 공백일 수 없습니다.");
        }
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}

 

 

package com.example.yaejunshin_finalproject;

import java.time.LocalDate;
import java.time.LocalTime;

public class Reservation {
    private int id;
    private String name;
    private User user;
    private Car car;
    private LocalDate date;
    private LocalTime time;

    public Reservation(int id, String name, User user, Car car, LocalDate date, LocalTime time) {
        this.id = id;
        this.name = name;
        this.user = user;
        this.car = car;
        this.date = date;
        this.time = time;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public User getUser() {
        return user;
    }

    public Car getCar() {
        return car;
    }

    public LocalDate getDate() {
        return date;
    }

    public LocalTime getTime() {
        return time;
    }

    @Override
    public String toString() {
        return "Reservation{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", user=" + user +
                ", car=" + car +
                ", date=" + date +
                ", time=" + time +
                '}';
    }
}

src - 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" %>
<html>
<head>
	<title>JSTL</title>
</head>
<body>
<c:set var="to"   value="10"/>
<c:set var="arr"  value="10,20,30,40,50,60,70"/> 
<c:forEach var="i" begin="1" end="${to}">
	${i}
</c:forEach>
<br>
<c:if test="${not empty arr}">
	<c:forEach var="elem" items="${arr}" varStatus="status">
		${status.count}. arr[${status.index}]=${elem}<BR>
	</c:forEach>
</c:if>	
<c:if test="${param.msg != null}">
	msg=${param.msg} 
	msg=<c:out value="${param.msg}"/>
</c:if>
<br>
<c:if test="${param.msg == null}">메시지가 없습니다.<br></c:if>
<c:set var="age" value="${param.age}"/>
<c:choose>
	<c:when test="${age >= 19}">성인입니다.</c:when>
	<c:when test="${0 <= age && age < 19}">성인이 아닙니다.</c:when>
	<c:otherwise>값이 유효하지 않습니다.</c:otherwise>
</c:choose>
<br>
<c:set var="now" value="<%=new java.util.Date() %>"/>
Server time is <fmt:formatDate value="${now}" type="both" pattern="yyyy/MM/dd HH:mm:ss"/>	
</body>
</html>

 

 

 

 

 

필터를 만들어서 jsp에 적용되는지 확인

package com.fastcampus.ch2;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

// 필터를 적용할 요청의 패턴 지정 - 모든 요청에 필터를 적용.
@WebFilter(urlPatterns="/*")
public class PerformanceFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 초기화 작업
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 1. 전처리 작업
		long startTime = System.currentTimeMillis();

		// 2. 서블릿 또는 다음 필터를 호출
		chain.doFilter(request, response); 
		
		// 3. 후처리 작업
		System.out.print("["+((HttpServletRequest)request).getRequestURI()+"]");
		System.out.println(" 소요시간="+(System.currentTimeMillis()-startTime)+"ms");
	}

	@Override
	public void destroy() {
		// 정리 작업
	}

}

 

첫 호출에 시간이 오래걸린다.

+ 여러개에 적용가능하고 전처리, 후처리 코드는 사실 없어도 된다.

 

 

서블릿은 기본적으로 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 클릭

 

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

 

 

여기서 포트번호가 8080인데 80으로 바꾸면 다음부터는 포트 번호를 붙이지 않아도 된다.

Http는 기본 포트가 80이기 때문

 

Server(Tomcat) -> Service(Catalina) -> Engine -> Host(www.fastcampus.com) ->Context(ch2)

webapps 안에 war파일로 배포하면 자동으로 압축 해제

 

서버에 있는 web.xml은 모든 webapp의 공통 설정이고

 

Maven Depencies에 있는 web.xml은 개별설정이다.

 

원격 프로그램에서 서블릿 등록하고 url 연결하는 부분

이게 불편해서 어노테이션으로 바뀜

@Controller, @RequestMapping

 

매핑

둘중 하나 선택하는데 요즘은 어노테이션을 사용하는 추세

 

원격프로그램 등록과 url 매핑

 

+ Recent posts