STS 툴을 켜보자. 만든 dynamic web project를 보면,

이 두 가지의 폴더가 보인다. 이 두 폴더가 설정폴더이고, WebContent에 들어있어도 외부에서 접근이 불가능하다. 대신 설정폴더이기 때문에 약속된 형태의 파일만 폴더 내부로 들어갈 수 있다. 이제 jsp 파일을 만들어보자. 그러나 jsp 파일을 그냥 만들어버리면 오류가 발생한다.
jsp 파일에 있는 자바 코드는 변환을 해야한다. 이 변환을 알려주는 기호가 <% %>이다. 그러나 일반적으로 이 코드를 알아듣지 못하고, 특정 라이브러리가 있어야만 이 코드를 알아들을 수 있다. 그렇기 때문에 이 코드를 알아들을 수 있는 라이브러리를 빌드패스 해야한다. 이 라이브러리는 자바 내부에 존재한다.



다음과 같이 add library 로 들어가서 서버 런타임을 설정해주면 된다. apache/tomcat을 설치했다면 설치한 버전으로 라이브러리를 발견할 수 있을 것이다.
이제 jsp를 만들어보자.
다음이 간단한 jsp 코드이다.
<%@ 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>
<h1>JSP 파일</h1>
<hr/>
<%
int a=10;
%>
<h2>결과는 : <%=a %></h2>
</body>
</html>
언뜻 보기에는 html코드이다 중간중간 <%이 보인다.
처음 <% %> 코드 내부의 값은 보이지 않는다. 여기 내부에 자바 코드를 입력하면 tomcat 등의 웹 컨테이너들이 컴파일 해줄 것이다. 이 a=10을 웹페이지에 out 시키려면 <%= %>로 입력하면 변수를 출력할 수 있다.
이 코드의 결과물을 다음과 같다.
(<hr>에 굳이 /를 붙이지 않아도 된다. 그러나, 정부 표준 html코드에는 반드시 사용한 코드를 닫도록 권고하고 있으므로, 하나만 있어도 되는 코드도 /를 이용해 닫아두는 것이 좋다.)

다음은 jsp의 조상(?) 격인 서블릿이다.
서블릿을 만드는 방법은 다음과 같다.



서블릿은 자바와 유사하기 때문에 webcontent에 만드는 것이 아닌 java resource에 만들어야 한다.
package는 대체로 사용하는 도메인의 반대로 친다. 도메인은 유일한 값이기 때문에 반대로 치면 유일한 값이 되기 때문이다.
url mapping은 이 식별자를 가지고 서블릿에 접근할 수 있게 해주는 식별자를 설정하는 값이다.
package com.cos.test;
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;
/**
* Servlet implementation class Hello
*/
@WebServlet("/hello")
public class Hello extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Hello() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request Get");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request Post");
}
}
다음이 서블릿 코드이다. 이것도 언뜻 보기에는 자바 코드와 같다.
앞서 설정한 식별자를 웹서블릿 어노테이션에 넣으면 이 값을 바탕으로 다음 서블릿에 접근할 수 있게 해준다.
이를 한번 작동시켜보자.

주소창에 식별자를 적으면 다음과 같이 자바 콘솔 창에 출력되는 것을 확인할 수 있다.
이 때 주의할 점은 서블릿 창은 내가 값을 수정할 때 마다 변하는 값을 리로드 해야 웹페이지에 수정된 값이 적용된다는 점이다. 콘솔 창에 보이는 >>컨텍스트를 다시 로드하는 것을 완료했습니다.<< 라는 문구가 보일 것이다.
어노테이션을 사용하기 전에는 xml 파일을 이용해 다음 서버를 작동시킬 때 사용할 정보를 모두 넣어둔 파일을 수정하는 형태로 사용했다. 그 xml 파일은 이 곳에 있다.

<servlet>
<servlet-name> </servlet-name>
<servlet-class> </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> </servlet-name>
<url-pattern> </url-pattern>
</servlet-mapping>
이 파일에 서블릿 이름을 설정하고, 서블릿이 있는 위치, 서블릿을 호출할 때 사용할 식별자를 입력하면 식별자에 따라 서블릿을 호출할 수 있다.
그러나 서블릿이 늘어나면 날수록 일일히 xml을 수정해줘야한다는 단점이 있다. 그래서 어노테이션이 나오기 전에는 FrontController을 이용해서 서블릿을 컨트롤 했다. FrontController은 단지 한 번만 xml을 수정하기만 하면 된다는 점이 큰 장점이다.
<servlet>
<servlet-name>FrontController</servlet-name>
<servlet-class>com.cos.test.FrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
이 코드는 입력받는 모든 식별자(/*)를 com.cos.test에 있는 FrontController로 보내준다.
서블릿 코드를 보자.
package com.cos.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FrontController
*/
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FrontController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String address=request.getRequestURI();
System.out.println(address);
String temp[]=address.split("/");
System.out.println("temp[0] : "+temp[0]);
System.out.println("temp[1] : "+temp[1]);
System.out.println("temp[2] : "+temp[2]);
String page=temp[2];
if(page.equals("user")) {
System.out.println("user page move");
}else if(page.equals("admin")) {
System.out.println("admin page move");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
맨 아래의 doPost 코드를 보면 무조건 doGet 코드로 연결된다. 이렇게 무슨 호출을 받던 간에 doGet 클래스로 보낼 수 있다. doGet 코드에서는 받은 주소에 따라 다른 서블릿으로 연결 받도록 설정할 수 있다.
'JSP' 카테고리의 다른 글
| 1. JSP지시어 (0) | 2020.05.27 |
|---|---|
| Forwarding (0) | 2020.05.27 |
| 서블릿 기초, 한글 인코딩 하기 (0) | 2020.05.26 |
| 웹페이지 서버 요청 방식과 웹 기초 (0) | 2020.05.25 |
| JSP 기초와 STS에서 JSP 환경 설정하기 (0) | 2020.05.22 |