a.jsp -> b.jsp
1) SendRedirect인 경우
2) Forward인 경우
location을 사용하면 브라우저에서 사용하지만, jsp를 이용하면 톰캣에서 제어한다.
다음과 같은 .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는 출력되지 않는다. 그렇다면 이 부분을 설정하는 파일이 어디에 있는가?
이 부분에서 수정한다. 만약에 접근하려면, 이 부분을 수정해야된다.
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"로 경로를 작성하면, 이 경로로 리턴해준다. 앞에 /
을 작성하면 안 된다.