EX)
<%@ 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>
<%
int total = 0;
for(int i = 1; i <= 10; i++){
total = total + i;
}
%>
1부터 10까지의 합 : <%=total %>
</body>
</html>
Java코드는 <% %> 안에 집어넣는다. 그리고 <% %>안에 있던 코드들의 값들을 HTML에 포함시켜 전송하기 위해서는 <%=변수명 %>을 사용한다. <%=변수명 %>은 println(변수명)과 동일한 의미이다.
WAS는 웹 브라우저로부터 JSP에 대한 요청을 받게 되면, JSP코드를 서블릿 소스코드로 변환한 후 컴파일하여 실행되게 된다. 서블릿으로 컴파일되어 실행될 때 상황에 따라서 어떤 메소드들이 실행되는지 잘알아야, JSP를 알맞게 작성할 수 있다.JSP파일은 컴파일 시 Servlet코드로 변환된다. 변환된 파일은 아래 경로를 통해 찾을 수 있다.
.metadata
-> .plugins
-> org.eclipse.wst.server.core
-> tmp0
-> work
-> Catalina
-> localhost
-> 프로젝트명
-> org
-> apache
-> jsp
경로에 들어가면 class파일과 java파일을 확인할 수 있다.
java파일
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
int total = 0;
for(int i = 1; i <= 10; i++){
total = total + i;
}
out.write("\r\n");
out.write("\r\n");
out.write("1부터 10까지의 합 : ");
out.print(total );
out.write("\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
HTML문서의 각 줄을 out.writer()를 통해 변환된 것을 알 수 있다.
<%
for(int i = 1; i <= 5; i++){
%>
<H<%=i %>> 아름다운 한글 </H<%=i %>>
<%
}
%>
위와 같은 방식을 수행했을 때, for문 안에있는 HTML코드가 반복되어 실행된다.
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
EX)
response.sendRedirect("redirect02.jsp");
EX)
Servlet1.java
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int diceValue = (int)(Math.random() * 6) + 1;
request.setAttribute("dice", diceValue);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
requestDispatcher.forward(request, response);
}
request.setAttribute("dice", diceValue);
: request 객체에 "dice"라는 속성값으로 diveValue를 저장한다.이때 diveValue는 Object로 저장된다. 왜냐하면 다양한 type의 데이터가 저장될 수 있기 때문이다.
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
:
파라미터는 forward할 servlet의 경로이다.파라미터 값에 "/"를 가장 앞단에 두면 relative path로 작동한다. 본 servlet이 위치하던 폴더를 기준으로 servlet을 검색할 것이다.RequstDispathcer 클래스는 현재 request에 담긴 정보를 저장하고 있다가 그 다음 페이지에도 해당 정보를 볼 수 있게하는 클래스이다.
requestDispatcher.forward(request, response);
: request, response객체를 resquestDispatcher가 가지고 있는 경로의 servlet으로 이동한다.
Servlet2.java
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
// getAttribute는 Object를 리턴하기 때문에
// Interger로 형변환해줘야 한다.
int dice = (Integer)request.getAttribute("dice");
out.println("dice: " + dice + "<br>");
for(int i = 0; i < dice; i++) {
out.print("hello<br>");
}
out.println("</body>");
out.println("</html>");
}
int dice = (Integer)request.getAttribute("dice");
: request에 저장된 attribute는 기본적으로 Object type이다.따라서 이를 알맞은 type으로 형변환해줘야 한다.
EX)
<%
int v1 = (int)request.getAttribute("v1");
int v2 = (int)request.getAttribute("v2");
int result = (int)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
forward()를 실행하는 Servlet에서의 코드는 서블릿과 서블릿과의 forward()와 동일하다.다만, JSP의 경우 forward()를 받는 서블릿의 코드를 JSP문법에 맞게 작성하면된다.이때 request는 JSP코드가 서블릿코드로 변환되면서 초기화되는 내장객체이기 때문에 사용가능하다.
JSP를 서블릿으로 변환한 코드 중 일부
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
forward()를 수행하는 서블릿
request.setAttribute("v1", v1);
...
requestDispatcher.forward(request,response);
forward() 당하는 서블릿
int v1 = (int)request.getAttribute("v1");
Servlet1
ServletContext application = getServletContext();
int value = 1;
application.setAttribute("value", value);
Servlet2
ServletContext application = getServletContext();
int value = (int)application.getAttribute("value");
value++;
application.setAttribute("value", value);
위에서 application 객체에 집어넣은 value값은 다른 클라이언트에서 접속할 때도 공유되는 값이다.만약, getAttribute(공유자원이름)에서 공유자원이름에 해당하는 것이 없을 경우NullPointerException을 발생시킨다.