인프런 JSP MVC 모델2 ①

백엔드/JSP|2021. 4. 26. 22:55

MVC 모델2



Expression Language 사용법

화면에 뭔가 출력할 때 사용한다.


출력화면


request나 session객체같은 객체에 담아놓고 화면에 출력해야 한다.

출력화면


EL은 다이렉트로 변수이름을 출력하는게 아니라, 변수를 어느 객체에 담아놓고 화면에 출력할때 사용하는 게 좋다.

JSP에서 out.println("i = " + i > 4); 와 같이 사용할수 없다. out.println의 한계

<%= ia %> 같이 객체담긴 이름명을 다이렉트로 호출할 수 없다. 기호 연산자는 사용가능. 

${ia > 4} 객체 자체를 호출할 수 있으며, 기호 연산자 사용가능. 


 

EL에서는 string형식 3을 더하면 el은 Integer로 변환되어 7이 나온다.

<%= %>에서는 string과 int형 더하면 string형식으로 바뀌어 34가 나온다.


EL 표현식을 써보자.

원래는 위와 같이 사용하였으나. 아래와 같이 EL 표현식을 쓸 수 있다.

param이 request.getParametr()를 뜻한다.

실행결과


EL을 이용하여 계산기를 만들어 보자

아래와 같이, ELCulProc.jsp 파일을 작성해준다.

${exp1 exp2 exp3 } 사용할수 있을까?

사용하면 파싱할수 없는 오류가 발생한다. exp1, exp2, exp3을 사용할 수 없다.


예전방식이면 아래처럼 다 받아와줘야 한다.


${param.exp1} 을 사용하면 가능하나, exp2의 연산이 되지 않는다. 


그렇다면 연산을 하려면 어떻게 해야할까?

연산을 뜻하는 exp2 만 받아오면 된다.


응용을 더해서, 최초 기본창에서 결과를 띄우려면 어떻게 해야할까?


아래와 같이 action을 기본화면인 ELCul.jsp로 바꿔주고, input value에 param값을 넣어준다.

위와같이 실행하면 exp2에서 널포인트 오류가 발생한다. 널포인트만 처리하면 된다.

 


기본화면에 숫자 값을 유지하려면 input value에 param값을 다 뿌려주면 된다.


JSTL

코어태그를 제일 많이 사용한다. 서블릿에서 JSP쪽으로 값을 떠넘길때, request해서 setAttribute를 써서 벡터를 떠 넘길수 있는데, JSP에서 벡터의 내용을 출력해주려면 반드시 for문 반복문이 필요하다. 그렇다고 for문을 쓰려면 다시 스클립틀릿 태그를 써야하는데, 이러면 모델1으로 되기때문에 의미가 없어진다.

결론적으로, JSTL은 자바의 내용을 태그로 만들어놔서, 자바코드를 jsp에서 아예안쓸수 있도록 해주는 것이다. 



JSTL을 사용하기 위해서는 apache tomcat폴더의 lib폴더안에 jstl 알집파일을 넣어줘야 사용할 수 있다.

그리고 소스 상단에 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 을 작성한다.

만약에 인식을 하지 않으면 직접 파일을 붙여넣기 해준다.


jstl에서 조건문을 사용하려면 어떻게 해야할까?

아래와 같이, 조건문에 "4>3"이라고 적으면 작동되지 않는다. 조건으로 인식하지 않는다.


조건문에는 EL을 사용하면 가능하다.

실행결과


EL에 변수 i 를 사용하면 될까?

되지 않는다.

EL에서는 session, request, param 객체를 이용해서 데이터를 출력할 수 있지만, 변수를 다이렉트로 받을 수 없다.

그리고 <% %>을 사용해서 변수를 선언하면, 모델1이 되버린다.  


변수를 선언하려면 어떻게 해야할까?

<!-- 변수 선언 -->
<c:set var="i" value="4" />

위의 내용은 아래와 같다.

<%
	request.setAttribute("i", 4);
%>

그렇기 때문에, EL에서 i 변수를 사용할 수 있다.

 


jstl의 for문을 사용하려면 어떻게 해야할까?

forEach 태그가 자바의 for문과 같다.


forEach태그에서는 step과 변수를 사용하지 않아도 된다.

step을 사용하지 않으면 1씩 자동 증가한다. 

실행하면 


만약 1부터 10까지 더한다고 하면,  이럴 때 변수들이 필요하다.

<!-- 변수 선언 -->
<c:set var="sum" value="0" />

<!-- 반복문 for -->
<c:forEach var="i" begin="1" end="10"> // 1~10까지 더하려면 i 변수가 필요하다. 
	<c:set var="sum" value="${sum=sum+i}" />
</c:forEach>

${sum} //sum을 출력하면 55가 나온다. 


step을 사용하려면 ex) 2씩증가 ${i=i+2} 를 사용한다.

<!-- 변수 선언 -->
<c:set var="sum" value="0" />

<!-- 반복문 for -->
<c:forEach var="i" begin="1" end="10" step="${i=i+2}"> // 1에서 10까지 2씩 증가한다.
	<c:set var="sum" value="${sum=sum+i}" />
</c:forEach>

${sum} //sum을 출력하면 1,3,5,7,9를 더해서 25가 나온다. 


JSTL 문제> 아래 그림이 찍히도록 JSTL을 작성하시오


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


<!-- 

    *
   ***
  *****
 *******
*********
 -->

<c:forEach var="i" begin="1" end="5" >

<c:forEach var="j" begin="${i}" end="5" >
	&nbsp;
</c:forEach>

<c:forEach var="j" begin="1" end="${ i=2*i-1}" >
	*
</c:forEach>
<br>
</c:forEach>
</body>
</html>

다음 MemberList.jsp를 jstl로 바꿔보자


EL 자체가 일반변수를 못 뿌리기때문에, request에 vec를 넣어주고 그걸 받아온다. 

그러면 확장for문에서 vec에 있는만큼 뽑아와서 뿌려준다. 

실행하면 제대로 잘 나온다.


서블릿

모델이 DB의 결과를 서블릿에 넘긴다. 그러면 서블릿이 결과를 JSP에 넘긴다.

EL은 변수를 사용할 수 없기 때문에 request객체에 담았는데, 서블릿에서 JSP에 데이터를 넘길 때,

RequestDispatcher 클래스를 사용한다. 

그러면 JSP에서 코어태그 등을 이용해서 결과를 뿌려준다.


서블릿을 만드는 과정은 2가지이다.

1. Anotation 이용

2. web.xml 파일에서 지정


서블릿을 만들어보자


유즈빈은 서블릿에서 사용할 수 없다.

빈클래스를 만들어서 거기 담아서 그걸 jsp로 떠넘기자



회원가입을 누르면 서블릿으로 넘어간다. 서블릿을 만들어주자.

url 이름(annotation)을 action의 이름인 "/Mproc2" 로 해줘야한다.

사용자의 정보를 String id = request.getParametr("id")이런식으로 일일이 다 받아야하는데, 이걸 또 jsp에 넘겨주려면 request.setAttribute로 다 일일이 걸어줘야한다.

그래서 한꺼번에 처리하기 위해 bean클래스를 만들어 사용하자.

model이라는 패키지를만들고, MemberBean이라는 클래스를 하나 만들어준다.

(서블릿에서는 유즈빈을 사용할 수없다 doGet메소드와, doPost메소드는 request와 resposnse객체 밖에 못받는다.)

bean 클래스 객체를 생성해줘야한다.

다음 request 객체에 bean클래스를 추가해준다.




 

댓글()
구독