쇼핑몰, 블로그, 카페 이런 것들이 모두 웹 어플리케이션이다.
웹 어플리케이션은 WAS에 의해 동작한다
따라서 정해진 약속을 지켜서 만들어야 한다.
자바 웹 앱의 디렉토리 구조는 다음과 같다
web.xml은 웹 어플리케이션에 대한 정보를 전부 가지고 있는 중요한 파일이다. 하지만 서블렛 3.0 버전 이상에서는 어노테이션이 역할으 대신해준다.
lib 폴더에는 각종 jar 파일들, classes 폴더에는 java 패키지랑 class 파일들이 있다. 내가 작성하는 servlet도 classes 폴더에 들어있다.
필요한 리소스들(이미지 등)도 추가할 수 있다.
웹 브라우저가 톰캣 서버에 request를 보내면
톰캣에 의해 서블릿이 동작해서 서블릿이 실행되는 결과를 클라이언트가 웹브라우저로 확인할 수 있다.
위에서 web.xml이 중요 파일이고 서블릿 버전 3.0 이상에서는 그것을 어노테이션으로 대체한다고 했다.
즉 서블릿 작성방법은 버전에 따라 2가지로 나뉜다.
웹 프로젝트를 다시 하나 만들어 보자
버전은 3.1로 web.xml을 어노테이션으로 대체하는 버전이다.
source folders로 지정한 곳에 .java 소스파일이 생성되고, output folder로 지정한 곳에 소스코드를 컴파일 한 .class 파일이 생성된다.
밑줄 친 부분을 체크하면 web.xml 파일을 만들 수 있다.
버전이 3.1이어서 web.xml을 어노테이션 방식으로 대체하지만, 나중에 추가적으로 사용할 수 있어서 원한다면 체크해도 된다.(지금은 안함)
밑줄친 URL mappings 부분이 이 서블릿의 url 마지막 부분이다.
이름과 같게 설정되어 있는데 원하면 edit을 눌러서 바꿀 수 있다.
서블렛은 요청이 들어왔을 때 호출되면서 동적으로 응답할 코드를 만들어낸다. 그리고 만들어진 코드로 응답한다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
doGet의 매개변수 request와 response는 각각 요청과 응답에 대한 정보를 가진 객체이다. 응답할 때 관련 정보는 모두 response 객체에 넣어줘야 한다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<h1>1부터 10까지 출력</h1>");
for (int i=1;i<=10;i++)
{
out.println(i+"<br>");
}
out.close();
}
setContentType을 이용해서 response 객체의 타입을 설정해준다.
text/html 이고, 인코딩은 utf-8로 설정한다.
response 객체에 적기 위해 response.getWriter();로 PrintWriter 객체를 생성해줬다.
html 태그와 java 문법을 이용해서 내용을 작성하고 PrintWriter 객체는 close로 닫아주면 된다.
@WebServlet("/NewServlet")
public class NewServlet extends HttpServlet {
서블렛 클래스 맨 윗부분을 보면 어노테이션 부분이 있는데, 이 어노테이션 부분이 아까 서블렛을 생성할 때 정한 url을 의미한다.
이 부분을 수정해서 url을 바꿀 수 있다.
프로젝트를 만들 때 2.5 버전으로 만들면 위와 같이 web.xml파일이 생성된 것을 확인할 수 있다.
서블릿에게 전달된 request, response 객체는 doGet과 doPost의 인자로 사용된다.
웹 브라우저와 WAS(톰캣) 간에 객체를 주고받으며 소통하는데, 그 객체를 통해 서블렛이 정보를 얻을 수 있다.
package examples;
import java.io.IOException;
import java.util.Enumeration;
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 NewServlet
*/
@WebServlet("/NewServlet")
public class NewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NewServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response 객체의 contentType과 encoding 설정
response.setContentType("text/html;charset=utf-8");
//PrintWriter 객체를 얻는다
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
//request객체의 getHeaderNames로 request 메세지의 헤더네임을 얻는다
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
//getHeader 메소드의 인자로 headerName을 전달해서 headerValue를 얻는다
String headerValue = request.getHeader(headerName);
out.println(headerName + " : "+ headerValue + "<br>");
}
}
}
request 메소에서 header 정보를 얻어서 PrintWriter를 이용해 화면에 출력해준다.
Enumeration을 사용하기 위해 import java.util.Enumeration을 해줬다.
request 객체의 정보에는 파라미터 이름/값 정보도 있다.
getParameter 메소드를 이용해서 파라미터 이름으로 파라미터 값을 얻어올 수 있다. String 형태로 반환한다.
요청하려는 url 뒷부분에
?name=John&age=24&....
이런 식으로 파라미터를 전달할 수 있다.
또한 http form의 input 태그를 이용해서도 파라미터를 전달할 수 있다.
다양한 메소드로 request 객체에 있는 요청 정보를 얻어올 수 있다.
request.get~~ 형태의 메소드가 많다.
url에서 포트번호 이하가 uri이다.
contentPath는 사이트 만들 때 웹 에플리케이션이 여러 개 있을 수 있어서 해당 WAS와 매핑된 주소이다.
remoteAddr은 request를 보낸 클라이언트의 IP 주소이다.
위 값은 local host, 즉 내가 요청한 것이므로 내 IP이다.