Jsp & Servelt : WEB-INF 하위 폴더 및 페이지 이동

지환·2023년 12월 6일
0

Jsp & Servlet

목록 보기
12/21
post-thumbnail

페이지 이동에 대한 간단한 설명

a.jsp -> b.jsp

1) SendRedirect인 경우
2) Forward인 경우

  • response.sendRedirect("./b.jsp") - 페이지 존재하지 않으면 404 나온다. (주소창이 변하는 부분)
    • isRedirect : boolean(boolean)
    • 기존에 요청은 끊어지고 새로운(req,res 새로 생성) 요청이 일어난다.
  • RequestDispatcher view = req.getRequestDispatcher("./b.jsp");
    : view(req,res);
    : select일 때 사용한다.
    : url매핑
    : 주소는 /auth/login.do[서블릿] -> index.jsp이였다.
  • refresh : 새로고침(F5)
    : 새로운 요청이 발동한다.(주소창이 안 바뀐다)
    : 안 바뀌는데 Session이나 Cookies 값을 가져온다.
    : 새로고침이 일어나면 Session이나 Cookies를 가져온다.
    : 브라우저와 Tomcat에 처리되는 결과를 동기화한다.
  • location.href = "./index.jsp"
    : location.href = "/auth/login.do"
    : 두 개의 공통점은 http - 비상태프로토콜 - stateless - 상태가 유지되지 않는다.

location을 사용하면 브라우저에서 사용하지만, jsp를 이용하면 톰캣에서 제어한다.


WEB-INF 아래 파일 실행

다음과 같은 .jsp파일이 2개 있다.
하나는 WEB-INF 하위에 있고 하나는 webapp 하위에 있다.

톰캣을 구동시킨 뒤, 각 파일을 URL을 통해 접근해보자.
우선 webapp 하위에 있는 파일에 접근해보자

접근이 잘 된다.

그럼 이번에는 WEB-INF하위에 있는 .jsp에 접근해보자

접근이 안된다. 왜 접근이 안될까? 대충 설명하면 아래와 같다.

webapp 폴더에 있는 녀석들은 따로 비즈니스 로직이 없어도 가상의 결과물을 만들어 직접적으로 뷰를 살펴 볼 수 있다
=> Controller를 통하지 않아도 바로 결과물을 볼 수 있지만, 서버에 올릴 시 보안에는 취약하다.

WEB-INF 폴더의 경우에는 브라우저에서 직접적으로 접근이 불가한 경로이다.
=> Controller를 통해야만 접근이 가능하며, 사용자가 직접 접근이 불가하여 보안성이 높다.

이건 jsp뿐만이 아니라, html, js, css와 같은 정적파일들도 포함된다.

그래서 WEB-INF안에 있는 js나 css에는 접근을 할 수 없다. 만약 WEB-INF 하위에 .js나 .css를 생성하고

호출을 하면 404에러가 뜰 것이다.

그래서 .js나 .css는 webapp하위에 생성하는 게 가장 베스트이다. (출처)

이 원리를 이용해서 실습해보자.


WEB-INF/jsp/notice/noticeList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>공지사항{WEB-INF}</title>
</head>
<body>
	<h2>공지사항 게시판</h2>
</body>
</html>

일반적인 호출과 차이점은 무엇인가?
http://localhost:8000/notice/noticeList.jsp
에선 잘 작동이 되는데 FullName을 작성하면 왜 접근이 안 되는 것일까?
http://localhost:8000/WEB-INF/jsp/notice/noticeList.jsp

아래에 있는 부분은 왜 실행되지 않을까?

실행 시키려면 어떻게 해야될까?

forward를 이용해보자.

webapp/move/c.jsp

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

 <% 
 	RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/notice/noticeList.jsp");
	rd.forward(request, response);
 %>
 
 <!-- 테스트 케이스 
 	localhost:8000/move/c.jsp
  -->


(2번예제) - 뷰리졸버 역할 따라해보기


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Map, com.google.gson.Gson" %>    
<%!

%>    
<%
	//스크립틀릿 - 지변 - service()코드가 생성되니까 메소드 안에서 선언한 변수이니까
	Map<String,Object> rmap = (Map)request.getAttribute("pMap");
	Gson g = new Gson();
	String temp = g.toJson(rmap);
	//out.print(rmap);//out은 내장객체 - PrintWriter
	out.print(temp);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사원목록 - 프로시저(webapp)</title>
</head>
<body>

</body>
</html>

테스트 케이스 : http://localhost:8000/test/testList

이렇게 나오지만 WEB-INF밑에 있는 Test는 출력되지 않는다. 그렇다면 이 부분을 설정하는 파일이 어디에 있는가?

  • prefix : 접두어
  • suffix : 접미어

이 부분에서 수정한다. 만약에 접근하려면, 이 부분을 수정해야된다.

server:
  port: 8000
  servlet:
    context-path: /
    encoding:
      charset: UTF-8
      enabled: true
      force: true
spring:
  output:
    ansi:
      enabled: always
  mvc:
    view:
      prefix: /WEB-INF/jsp/
      suffix: .jsp
      

server:
  port: 8000
  servlet:
    context-path: /
    encoding:
      charset: UTF-8
      enabled: true
      force: true
spring:
  output:
    ansi:
      enabled: always
  mvc:
    view:
      prefix: /WEB-INF/jsp/test/testList
      suffix: .jsp
      

----------------------------------------

    view:
      prefix: /WEB-INF/jsp/?????[변수적기]
      suffix: .jsp



이 부분을 스프링에서 처리해준다.

이렇게 앞에 / 를 붙이면 안 된다. 왜냐하면 야물 파일에서 설정을 이미 완료 했기 때문이다.

package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 관심사의 분리 - MVC 패턴
 * 입력 -> 처리 -> 출력
 */


@Controller
@RequestMapping("/test/*")
// 테스트 파일 밑에는 2가지가 있다. webapp 밑에 있는 test
// webapp -> WEB-INF 밑에 있는 test가 있는데 어떻게 결정하는가?
// @GetMapping에서 결정된다.

public class TestController {
	Logger logger = LoggerFactory.getLogger(TestController.class);
	@GetMapping("testList")
	public String testList(Model model)
	{
		logger.info("testList");
		return /;
				

>> 이렇게 적으면 안 된다.
		
		

		/**
		 * 모델객체가 파라미터자리이다.
		 * 주입해준다.
		 * 스프링컨테이너(주어-제어권-스프링이 쥐고있다.)
		 */
		
	}
	//IoC(Inversion Of Control) - 제어의 역전
	// - 객체에 대한 제어를 의미함.
	// - 유지보수나 결합도를 끌어올리기 위해서이다.
	// 
	// 결합도 : 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지 나타낸다.
	// 		: 속성객체결합, 로컬객체결합, 파라미터 객체결합, 반환객체결합(getConnetion():Connection)
	
	// 객체결합상황
	// - 속성객체결합, 파라미터객체결합(effectParam(Param p )),반환객체결합 (getConnection():Connection)
	// - 상속결합, 인터페이스결합()


}
package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 관심사의 분리 - MVC 패턴
 * 입력 -> 처리 -> 출력
 */


@Controller
@RequestMapping("/test/*")
// 테스트 파일 밑에는 2가지가 있다. webapp 밑에 있는 test
// webapp -> WEB-INF 밑에 있는 test가 있는데 어떻게 결정하는가?
// @GetMapping에서 결정된다.

public class TestController {
	Logger logger = LoggerFactory.getLogger(TestController.class);
	@GetMapping("testList")
	public String testList(Model model)
	{
		logger.info("testList");
		return "test/testList";
				
                
                
        //"sendRedirect : /test.jsp";
		// res.sendRedirect("test.jsp");
		// return "forward:./test.jsp";
		// 왜 여기는 리턴타입이 void가 아니라 String인가?
		// return 코드뒤에 redirect는 sendRedirect인건가?
		// 네 맞습니다람쥐
		// upmu[0] = "redirect" or "forward"
		// ActionForward로 설계 (클래스)
		// Action으로 
		
		

		/**
		 * 모델객체가 파라미터자리이다.
		 * 주입해준다.
		 * 스프링컨테이너(주어-제어권-스프링이 쥐고있다.)
		 */
		
	}
	//IoC(Inversion Of Control) - 제어의 역전
	// - 객체에 대한 제어를 의미함.
	// - 유지보수나 결합도를 끌어올리기 위해서이다.
	// 
	// 결합도 : 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지 나타낸다.
	// 		: 속성객체결합, 로컬객체결합, 파라미터 객체결합, 반환객체결합(getConnetion():Connection)
	
	// 객체결합상황
	// - 속성객체결합, 파라미터객체결합(effectParam(Param p )),반환객체결합 (getConnection():Connection)
	// - 상속결합, 인터페이스결합()


}

@RequestMapping("/test/*")

  • 테스트 파일 밑에는 2가지가 있다. webapp 밑에 있는 test

  • webapp -> WEB-INF 밑에 있는 test가 있는데 어떻게 결정하는가?

  • @GetMapping에서 결정된다.

  • 이후에 "test/testList"로 경로를 작성하면, 이 경로로 리턴해준다. 앞에 /을 작성하면 안 된다.

    • 이러한 부분이 트러블 슈팅 시 중요하다.
    • 이 경로는 앞에서 얘기했듯이

      이 부분에서 경로를 수정해주면 된다.
profile
아는만큼보인다.

0개의 댓글