리스트는 동적 자원
http://localhost:8080/board/list
localhost <- IP Address
www.000.com <- 도메인명
포트 번호를 지정하지 않으면 디폴트가 8080
컴파일된 클래스 파일을 다시 메모리에 올린다
새로운 서블릿을 추가할 때나 제거할 때는 다시 시작해야 됨
정적 파일을 추가한 경우에도 다시 시작 안 해도 됨
http://localhost:8080/board/add
자바스크립트로 요청하는 게 아니라 브라우저가 요청한다
같은 url에 보내겠다는 거
같은 url인 경우에는 action을 지정하지 않아도 된다
단, 같은 url인데
list에서 '새 게시글' 클릭하면 GET 요청이 들어온다
스프링 프레임워크를 안 쓰니까 불편하다..
자주 짜는 코드를 캡슐화시켜서 감춰버린 거
애노테이션이랑 클래스 몇 개 쓰면 자동으로 처리됨
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Board board = new Board();
board.setTitle(req.getParameter("title"));
board.setContent(req.getParameter("content"));
boardService.add(board);
resp.sendRedirect("list");
}
302 Location: list
현재 경로에서 list
웹 브라우저는 이걸 보고 응답을 받자마자 board/list를 다시 요청한다
하나의 서블릿에서 GET 요청과 POST 요청 동시 처리
POST 한글 깨짐
session 리스너가 자동으로 실행 안 된다
4개의 서블릿이 웹페이지 결과를 만든다
BoardListServlet
HeaderServlet
SidebarServlet
FooterServlet
서블릿 재사용 -> 중복 코딩을 줄일 수 있다
다른 서블릿의 작업을 포함시킬 수 있다.
resp.setContentType("text/html;charset=UTF-8");
include 하는 쪽에서 설정해줘야 됨
① including (포함)
S1 -> S2 -> S1 -> S3 -> S1
S1 + S2 + S3
여러 서블릿이 출력한 것은 합친다
일부 작업을 다른 서블릿에게 맡긴다
② forwarding (위임)
S1 -> S2
S1이 출력한 콘텐트는 버린다.
다른 서블릿에게 요청 처리 책임을 위임한다
상담 요청 -> 담당자에게 연결 -> 상담 수행
req.getRequestDispatcher("/error").forward(req, resp);
forward 할 때는 setContentType 해줄 필요 없음
포워드 하기 전에 출력한 콘텐트가 있다면 모두 버리고 다른 서블릿에게 책임을 위임한다
언제 forward를 해야 되는지 언제 include를 해야 되는지
아예 작업 수행에 대한 책임을 위임할 때는 forward
https://docs.oracle.com/javaee/7/api/javax/servlet/Servlet.html
https://javadoc.io/doc/javax.servlet/javax.servlet-api/latest/index.html
package com.eomcs.mylist.web.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.eomcs.mylist.domain.Member;
// 역할:
// - HttpSession 객체를 생성할 때, 기능 테스트를 위해 자동으로 로그인 시킨다.
//
@WebListener
public class AutoLoginListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("AutoLoginListener.sessionCreated() 호출됨!");
Member loginUser = new Member();
loginUser.setNo(2);
loginUser.setName("user2");
HttpSession session = se.getSession();
session.setAttribute("loginUser", loginUser);
}
}
package com.eomcs.mylist.web.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import com.eomcs.mylist.domain.Member;
// 역할:
// - HttpSession 객체를 생성할 때, 기능 테스트를 위해 자동으로 로그인 시킨다.
//
@WebListener
public class AutoLoginListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("AutoLoginListener.sessionCreated() 호출됨!");
Member loginUser = new Member();
loginUser.setNo(2);
loginUser.setName("user2");
HttpServletRequest httpRequest = (HttpServletRequest) sre.getServletRequest();
HttpSession session = httpRequest.getSession();
session.setAttribute("loginUser", loginUser);
}
}