Jasper
Jasper는 JSP를 Servlet으로 컴파일해주는 톰캣의 JSP 엔진이다.
Jasper를 사용하지 않는다면 아래와 같이 코드 작성하기가 불편해지는 것을 확인할 수 있다.
PrintWriter out = response.getWriter();
out.write("<!DOCTYPE html>");
out.write("<html>");
out.write("<head>");
out.write("<meta charset=\"UTF-8\">");
out.write("<title>Calc</title>");
out.write("</head>");
out.write("<body>");
// 자세한 코드 생략
out.write("</body>");
out.write("</html>");
Jasper에게 일을 시키기 위해서는 확장자에 .jsp만 붙이면 된다.
이 .jsp 파일을 톰캣(Web Server)은 Jasper에게 넘겨서 Servlet을 만들게 되는 것이다.
Jasper를 사용한다면 위의 코드처럼 out.write()를 사용하지 않고
아래의 코드처럼 더 편리하게 코드를 작성할 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="add.jsp" method="get">
<ul>
<li>
<label for="x"> X: </label><input name="x">
</li>
<li>
<label for="y">Y: </label><input name="y">
</li>
</ul>
<p><input type="submit" value="SUM"/></p>
</form>
</body>
</html>
만약에 이 코드에 int x = 1; int y=2;를 그대로 넣는다면 Servlet 코드에서는 초기값으로
1과 2의 값을 넣어주는 것이 아니라 out.write()를 이용해서 그냥 출력하게 된다.
그렇다면 어떻게 초기값으로 값을 넣어줄 수 있을까? 바로 <% %> 태그를 사용하면 된다.
아래의 코드와 같이 <% %> 태그를 사용하면 출력하는 것이 아니라 코드로 인식하게 되는 것이다.
1) <% %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int x = 1;
int y =2;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="add.jsp" method="get">
<ul>
<li>
<label for="x"> X: </label><input name="x">
</li>
<li>
<label for="y">Y: </label><input name="y">
</li>
</ul>
<p><input type="submit" value="SUM"/></p>
<p>sum : <%=(x+y) %></p>
</form>
</body>
</html>
x의 값은 x 혹은 y의 값은 y와 같이 그냥 출력되길 원하는 부분과
그냥 출력되는 것이 아니라 x, y 변수에 들어있는 값을 같이 출력하길 원하는 경우도 있을 수 있다.
그렇다면 아래와 같은 코드를 사용할 수 있을 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
x의 값은<% out.prinrtln(x) %>
y의 값은<% out.prinrtln(y) %>
// 생략
위와 같은 jsp 파일이 아래와 같은 형식의 java 파일에 있는 Service 함수로 전달된다.
out.write("x의 값은 ");
out.print(x);
out.write("y의 값은 ");
out.print(y);
이 방법보다 쉽게할 수 있는 방법이 있는데 <%= %> 태그를 사용하는 것이다.
2) <%= %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
x의 값은<%= x %>
y의 값은<%= y %>
// 생략
그렇다면 메소드는 어떻게 정의할 수 있을까?
<% %> 태그 안에서 메소드를 정의하면 Service 메소드 안에 메소드가 들어가는 형태가 된다.
이는 가능하지 않으므로 구문 에러가 발생한다.
메소드는 <%! %> 태그를 사용해서 정의해야 한다.
3) <%! %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
public int sum(int x, int y){
return x + y;
}
%>
// 생략
마지막으로 볼 태그는 jsp 파일을 작성할 때마다 보았던 <%@ %> 태그이다.
이는 페이지 지시자 블럭으로 이 페이지를 어떤 형태의 인코딩 방법을 사용할 것이며
어떤 contentType을 사용할 것인지 나타낸다.
4) <%@ %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
과거에는 <%@ %> 지시자를 사용하지 않고 아래와 같이 사용했다.
<%
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
%>
하지만 이 방법은 어떤 출력 문장보다도 위의 설정을 먼저 해줘야 한다는 점이 중요하다.
제일 먼저 위의 코드 블럭을 써줘도 이보다 먼저 실행되는 코드가 있기 때문에
java.lang.illegalstateexception getoutputstream() has already been called for this response와 같은
에러가 발생한다. 그래서 <%@ %> 지시자를 사용하는 것이다.
표로 보는 JSP 태그
JSP 태그 | 기능 | |
스크립트릿 | <% %> | JAVA 코드 삽입하기 |
표현식 | <%= %> | 결과값 출력하기 |
선언 | <%! %> | 메소드 선언하기 |
지시자 | <%@ %> | 페이지 속성 지정하기 |
이렇게 Jasper가 작성할 서블릿 코드에 코드 블록을 적절히 끼워 달라고 지시하는 방식을
JSP 프로그래밍이라고 한다. Jasper를 사용하면 확장자는 jsp이지만 결과물을 Servlet이라는 것을 기억하자.
'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
JSP MVC Model1과 Model2 (0) | 2023.07.09 |
---|---|
내장 객체 메소드 (0) | 2023.07.08 |
Service 함수의 GET 메소드와 POST 메소드 (0) | 2023.07.03 |
상태 유지를 위한 방법들의 차이점과 페이지 전환 (0) | 2023.03.30 |
상태 유지를 위한 방법 (0) | 2023.03.27 |