MVC1 디자인 패턴
: Model에 해당하는 데이터 처리 클래스만 분리되고, Controller와 View 가 함께 처리되는 디자인 패턴
단점1.
-역할 분담이 어렵다 ( Servlet이 자바 코드인 Controller와 HTML코드인 View를 함께 작성하므로 역할 분리가 안된다.)
단점2.
-Servlet에서 프론트 코드 작성은 너무나도 불편하다.
* 단점 2를 해결하기 위해 JSP가 등장함.
Servlet & JSP
- Servlet = 1세대
- JSP = (Java Server Page) Servlet을 개선해서 나온 2세대
-> 동일한 목적으로 만들어진 문서 양식
JSP ?
> 컴파일을 두 단계에 거쳐서 진행함
1단계 jsp->servlet
2단계 servlet->binary
html과 jsp 의 차이점
jsp 내에서는 자바를 사용할 수 있다.
자바로 실행된다고 했는데 화면과 같이 출력되는 이유
1차 컴파일 후 만들어진 servlet
1차 컴파일을 통해 작성된 소스
Scriptlet
<% %>
사이에 작성해주면 자바로 실행이 된다.
inputproc_jsp.java에서 코드 확인
> 자신을 포함하고 있는 매개변수를 사용할 수 있다.
request .을 찍고 getParameter 사용할 수 있다.
inputServlet의 역할을 inputproc.jsp가 다 하고 있는 상황
> servlet이 필요가 없는 상황이 됨
하지만 역할 분담이 어렵다는 단점은 해결되지 않은 상황임
( MVC1의 단점 )
JSP가 데이터 명령을 내리는 Controller 역할과 화면을 보여주는 View역할을 같이 하고 있음
역할분담이 어려운 단점을 해결하기 위해 MVC2가 등장
MVC2 디자인 패턴
: Model/View/Controller가 완벽하게 분리되는 구조의 디자인 패턴
:
forward의 역할은 무엇이며 왜 써야 하는지?
서블릿에서 클라이언트의 요청을 다른 서블릿이나 jsp로 전달하는 기능을 말함
> 서블릿이나 jsp 간에 데이터를 공유하고, 요청을 여러 단계로 나누어 처리할 수 있게 됨
> 서블릿에서 dao를 사용하여 데이터를 처리한 후에는 그 결과를 다른 리소스로 전달
> 이때, forward를 사용하여 처리 결과를 jsp등의 뷰로 전달할 수 있음
response를 jsp에 넘겨주는 이유? 응답을 담기 위해서
request 를 jsp에 또 넘겨주는 이유? 서블릿에서 발생한 내용을 jsp에 전달하기 위해서
servlet의 역할: 1. 처리, 2. 응답
1. dao야 값 넣어줘 , 받아온 값은 result에 저장
2. jsp야 화면 꾸며줘 , forward로 넘겨줌
EL( Expression Language )
: JSP내에서 java의 문법이 아닌 새로운 문법으로 자바 값을 사용하는 문법
jsp에서 서블릿에서 보내준 값을 어떻게 꺼내써야 할까?
=> $ { } > EL를 사용!
${키 값}
${int} => request.getAttribute("int");
서블릿)
List<MovieDTO> list = dao.getMovie();
String[] arr = new String[] {
"Orange", "Mango","Apple"
};
MovieDTO dto = new MovieDTO(9999,"Jack","EL 연습");
request.setAttribute("param1", 10);
request.setAttribute("param2", "Hello JSP");
request.setAttribute("fruits", arr);
request.setAttribute("dto", dto);
request.setAttribute("list", list);
jsp)
<body>
* EL( Expression Language ) : JSP내에서 java의 문법이 아닌 새로운 문법으로 자바 값을 사용하는 문법<br>
${param1}<br>
${param2 }<br>
<hr>
${fruits[0] }<br>
${fruits[1] }<br>
${fruits[2] }<br>
<hr>
${dto.id }<br>
${dto.title }<br>
${dto.genre }<br>
<hr>
${list[0].id}
${list[0].title }
${list[0].genre }
</body>
> toOutput 버튼 클릭 시 실행되는 화면
* 주의
${dto.writer} dto.getWriter(); 와 같다.
-- > dto안에 반드시 getWriter가 있어야 한다. (세터 게터가 있어야 jsp 에서 꺼내서 사용할 수 있다.)
EL의 기능의 한계
1. 조건문과 반복문의 제한
- EL은 주로 데이터의 값을 출력하거나 속성에 접근하는데 사용
따라서, EL내에서 조건문이나 반복문을 사용하여 로직을 제어할 수는 없
2. 복잡한 로직의 한계
- EL은 단순한 데이터 표현을 위한 언어이기 때문에 복잡한 로직이나 연산은 처리하기 어렵다.
JSTL (JSP Standard Tag Library)
: JSP 페이지에서 자주 사용되는 기능을 제공하는 라이브러리
> JSP페이지 에서 Java코드를 최소화하고, HTML과 더 가까운 형태로 웹 애플리케이션을 개발할 수 있도록 도와줌
https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
JSTL 1.2 jar 파일 다운로드 해서 lib 폴더 안에 넣어주기
<%@ taglib %> 디렉티브
: JSTL 라이브러리의 사용을 알리는 역할
<%@ taglib uri="라이브러리의 URI" prefix="태그 접두사" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- url : JSTL 코어 태그의 URL
- prefix : 해당 태그를 식별하기 위한 접두사를 정의, c는 코어 태그에 대한 접두사로 자주 사용됨
사용법
if문 - c:if
if else문- c:choose
when이 if에 해당
otherwise가 else에 해당함
* 주의 {} 안에 작성해야 한다.
for each문
var > 현재 요소를 참조할 변수의 이름을 지정
items > 반복할 요소들을 지정하는 속성 ( 리스트, 배열 등 )/ 각 요소를 순회하면서 반복문 내의 작업을 수행함.
Redirect 와 foward의 차이점
리다이렉트
- 기능 완료 후 기능에 대한 결과 값을 사용하지 않거나, 리퀘스트 파라미터가 필요 없는 곳으로 이동하고자 할 때 사용
- 클라이언트의 url을 다이렉트로 이동 시킴 ( 주소창에 값을 변경해서 Enter를 치는 효과 )
- * 클라이언트의 브라우저 주소 값이 변경된다.
포워드
- 기능 동작 완료 후 기능에 대한 결과 값을 사용하여 다른 동작을 수행해야 할 때 사용
- 클라이언트가 처음 도착한 url 동작 이후, 기능은 실행되나 포워드 된 곳의 url 주소가 남지 않음
( 클라이언트는 주소가 바뀐 것을 인지하지 못함 )
- * 클라이언트는 페이지가 전환되었음을 인지 할 수 없다.( 주소값 변경 無 )
'2024_풀스택학원 > Back-end' 카테고리의 다른 글
[JSP] 영화 목록 입력/ 출력/ 삭제/ 수정 기능 (0) | 2024.05.26 |
---|---|
[JSP] WAS, Tomcat 설치 , Servlet (0) | 2024.05.22 |
[JavaScript] Function함수 (0) | 2024.05.09 |
[Java] JDBC_03_Login (0) | 2024.05.02 |
[Java] JDBC_02_Contact (0) | 2024.05.02 |