2022-04-13(수)

Jeongyun Heo·2022년 4월 12일
0

리스트는 동적 자원

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 리스너가 자동으로 실행 안 된다

서블릿 include/forward, 필터 활용

4개의 서블릿이 웹페이지 결과를 만든다

BoardListServlet
HeaderServlet
SidebarServlet
FooterServlet
서블릿 재사용 -> 중복 코딩을 줄일 수 있다

다른 서블릿의 작업을 포함시킬 수 있다.

resp.setContentType("text/html;charset=UTF-8");

include 하는 쪽에서 설정해줘야 됨

여러 서블릿이 협업하는 방법 - including, forwarding

① 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);
  }
}

0개의 댓글