- 강의 소리가 너무 작아서 크롬 확장 프로그램 Volumn Control을 사용함.
Day 4-1
- 코드가 길고, 흐름이 나뉘어 게시글을 두 개로 분리
11. JSP 내장객체
- request, response 외 jsp에서 기본적으로 제공하는 객체에 대해서 학습
11.1. config 객체
-
일종의 환경설정 파일인 web.xml에서 getinitParameter()을 통해 JSP에 파라미터를 공유하는 형식.
-
web.xml
<init-param>
<param-name>adminId</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>adminPw</param-name>
<param-value>1234</param-value>
</init-param>
- jsp파일
<body>
<%!
String adminId;
String adminPw;
%>
<%
adminId = config.getInitParameter("adminId");
adminPw = config.getInitParameter("adminPw");
%>
<p>adminId : <%= adminId %></p>
<p>adminPw : <%= adminPw %></p>
</body>
getInitParameter()
: 초기화된 객체를 가져옴
11.2. applicatin 객체
- 하나의 서블릿이 아니라 어플리케이션 전체에 파라미터를 넘겨주어서 어떤 서블릿이든간에 해당 파라미터에 접근할 수 있도록 한다.
- web.xml에선
context-param
사용, jsp파일에선application.getInitParameter("{ParameterName}")
메소드로 받아온다. - 가령 어떤 서블릿에서도 이미지를 받아올 수 있도록, 이미지 폴더를 imgDir로 지정하는 형식. 혹은 real server와 dev server를 구분해서 사용할 때, testServerId를 받아 context param으로 사용
application.setAttribute({key},{value})
로 한 jsp파일에서 저장하고, 다른 jsp파일에서getAtrribute({key})
를 가져올 수 있다. (단, String으로 변환하여 가져와야함.)
11.3. out 객체
- out.print를 이용해 html 코딩하듯이 출력해줄 수 있다.
11.4. exception 객체
- 은근 많이 쓰인다. exception 발생 시 에러처리를 해주는 객체로,
<%@ page errorPage="errorPage.jsp"%>
요런 식으로 해당 jsp파일 내에서 exception 발생 시 어떻게 대처할 것인지 다룰 수 있음- exception 페이지로 활용하기 위해서는 페이지 태그를 이용해,
<%@ page isErrorPage=true%>
요런 식으로 넣어주면 된다. 디폴트 false
<%
response.setStatus(200);
String msg = exception.getMessage();
%>
<h1> error message : <%= msg %> </h1>
- 요런 식으로 exception을 잡고 찍어줄 수 있음
12. Servlet 데이터 공유
12.1. servlet parameter
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>servletDataTest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servletEx</servlet-name>
<servlet-class>com.servlet.ServletEx</servlet-class>
<init-param>
<param-name>adminId</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>adminPw</param-name>
<param-value>1234</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servletEx</servlet-name>
<url-pattern>/se</url-pattern>
</servlet-mapping>
</web-app>
- servletEx.java
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletEx extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String adminId = getServletConfig().getInitParameter("adminId");
String adminPw = getServletConfig().getInitParameter("adminPw");
PrintWriter out = response.getWriter();
out.print("<p>adminId : " + adminId + "</p>");
out.print("<p>adminPw : " + adminPw + "</p>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 위 코드처럼 web.xml에서 설정한 파라미터를 받아 servletEx.java servlet에서 사용해준다.
12.2. context parameter
- context parameter로 imgDir, testServerIP 넣고 servlet에서
String imgDir = getServletContext().getInitParameter("imgDir")
로 받아준다.
12.3. context attribute
- setAttribute(), getAttribute() 해서 context에서 받아온다.
- JSP와 서블릿이 매우 매우 매우 흡사하고 JSP가 더 큰 범주라고 생각되는데, 왜 서블릿도 같이 쓰는건지?
- 둘의 역할이 다르기 때문이다. 기능은 동일함. 관련 게시글
Servlet
- Servlet : 웹 기반의 요청에 대한 동적 처리가 가능한, 서버단에서 돌아가는 자바 프로그램.
- 자바 코드 안에 HTML 코드
- data processing에 좋음. 가령 DB와의 통신, 비즈니스 로직 호출 등.
- 수정된 경우 자바 코드를 컴파일한 후 동적 페이지 처리, 전체 코드 업데이트 후 다시 컴파일->재배포 해야함.
JSP
- JSP : 자바를 기반으로 하는 서버 사이트 스크립트 언어.
- HTML 코드 안에 자바 코드
- 서블릿 보완, 확장.
-
수정된 경우 재배포할 필요 없이 was에서 해준다.
- JSP만을 이용해 동적 페이지를 생성할 수도 있다. (Client <=> JSP <=> (java beans) <=> DB) 요런 구조.
- JSP에서 이제 막 view를 보여주고, 비즈니스 로직도 처리해준다.
- java beans는 DB와의 연결로 데이터를 주고받고 해준다.
- 그럼 왜 그렇게 안쓰냐? html스러운 jsp 페이지에서 보여주기도 해야하고 비즈니스 로직도 처리해야하고.. 규모가 작을 때는 버틸 수 있겠지만, 이제 나중에는 코드가 매우 복잡해질 것이다. 상상해보면 html 코드가 쭉 있고 그 안에 로직을 처리하는 자바 코드가 들어와서 request를 받고 보여주고 웅성웅성…
- 이를 해결하기 위해 MVC 아키텍처가 나온다. 뷰와 비즈니스 로직, DB와의 연결을 담당하는 놈들이 각자 따로따로다.
- Model : DB연결 담당 Java Beans
- Controller : 다른 자바 클래스에 데이터 넘겨주고 받고 모델인 자바빈즈한테 DB 데이터를 받아오고 요청하고.. 이 일은 서블릿이 한다. (서블릿은 data processing에 좋으니까.)
- View : 보여주는건 이제 jsp가 담당한다. html이 중심이 되니까.