Web Architecture
Web Architecture
- web browser : data를 발생시킴.(GET / POST)
- page 이동 방법
- url 입력
- link
- form : GET / POST
→ form에 POST를 입력하지 않는 나머지는 전부 GET 방식
eclipse setting
eclipse encoding 설정
- window 메뉴의 preferences에서 encoding 검색 후 UTF-8로 설정.
Dynamic Web project 생성
- New >> Dynamic Web Project 선택.
- project name 설정 후 target runtime 선택.
- context root와 content directory 확인(변경 가능)
- Dynamic web module의 버전이 3.0 이상이면 체크 박스에 체크 해제
project 구조
Servlet
Servlet
- 자바에서 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 사양.
- 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종.
- JSP와 비슷한 점이 있지만 JSP는 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있음.
Servlet 동작 흐름
Servlet API
Servlet 사용
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 추가해야 한글 출력이 깨지지 않음.
response.setContentType("text/html;charset=utf-8");
// printWriter을 통해 서버에서 html 출력
PrintWriter out = response.getWriter();
out.println("<html>");
out.println(" <body>");
out.println(" Hello Servlet !!!");
out.println(" 안녕 서블릿 !!!");
out.println(" </body>");
out.println("</html>");
}
}
- 일반적으로 웹에선 HttpServlet을 상속받아 사용.
- HttpServlet을 extends하면 기존의 GenericServlet을 사용했을 때보다 메소드를 더 세분화하여 구현 가능. (나누어진 메소드 중 적어도 하나를 구현하면 사용 가능)
- url mapping : servlet의 이름, 주소에 url mapping을 적어 servlet에 접근.
servlet 파일을 생성할 때나 파일 내에서 변경 가능.
- 서버에선 html을 출력할 수 없으므로 응답으로 보내서 출력을 해줄 출력 객체가 필요
→ PrintWriter
- 위 코드의 출력 결과
Servlet Life-cycle
Servlet Life-Cycle
- Servlet class는 javaSE에서의 class와는 다르게 main method가 없음.
- 즉, 객체의 생성부터 사용(method call)의 주체가 사용자가 아닌 Servlet Container에게 있음.
- Client가 요청(request)을 하게 되면 Servlet Container는 Servlet 객체를 생성(최초 1회)하고 초기화(최초 1회)하며 요청에 대한 처리(요청 시 마다 반복)를 하게 됨.
- 또한 Servlet 객체가 필요 없게 되면 제거하는 일까지 Container가 담당.
Servlet Life-Cycle의 주요 method
예시
@WebServlet("/life")
public class LifeCycle extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifeCycle() {
super();
System.out.println("Constructor call!!");
}
@Override
public void destroy() {
super.destroy();
System.out.println("destroy call!!");
}
@Override
public void init() throws ServletException {
super.init();
System.out.println("init call!!");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service call!!");
}
}
- 출력 결과에서 볼 수 있듯이 constructor와 init은 처음 페이지에 들어갔을 때만 호출되고 이후 다시 그 페이지를 들어갈 때는 service만 호출.
- destroy는 servlet 파일을 변경하고 저장하는 등의 일로 인해 reload될 때 호출.
Servlet Parameter 처리
Parameter 전송 방식
GET에서의 URL
GET 메소드 예시
// 입력 받은 값을 servlet에게 전달
<script>
document.querySelector("#btn-send").addEventListener("click", function () {
if (!document.querySelector("#username").value) {
alert("이름 입력!!");
return;
} else if (!document.querySelector("#userpwd").value) {
alert("비밀번호 입력!!");
return;
} else {
let form = document.querySelector("#form-param");
form.setAttribute("action", "/basic/param");
form.submit();
}
});
</script>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 넘어오는 값을 처리 -> request
// getParameter(name) : 값을 가져옴.
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
String fruit[] = request.getParameterValues("fruit");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println(" <body>");
out.println(" Hello Servlet !!!");
out.println(" 안녕 서블릿 !!!");
out.println(username + " 님 비번은 " + userpwd + "이고 좋아하는 과일은 " + Arrays.toString(fruit) + "입니다." );
out.println(" </body>");
out.println("</html>");
}
- getParameter() : 값 하나를 얻어옴.
- getParameterValues : 값을 여러 개 가져옴.
- servlet POST method
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST에서는 이거 해줘야 한글 안 깨짐
request.setCharacterEncoding("utf-8");
// doGet호출하여 출력
doGet(request, response);
}