ProjectDetailServlet을 복사해서 이름을 바ㅣ꾼다.
projectDetail에서 taskList를 include하여 출력할거라 캐릭터인코딩과 html코드가 필요 없다.
프로젝트에 관련된 출력문구를 모두 지우고 작업목록만 출력할 수 있게 한다.
TaskList에서ㅏ 상태값 지정하는 것 메서드로 분리하기
ProjectDetail에서 ` request.getRequestDispatcher(“/task/list”).include(request, response);` 로 include시킨다.
TaskList서블릿으로 위임한다.
package com.eomcs.pms.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.eomcs.pms.domain.Task;
import com.eomcs.pms.service.TaskService;
@WebServlet("/task/list")
public class TaskListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext ctx = request.getServletContext();
TaskService taskService = (TaskService) ctx.getAttribute("taskService");
PrintWriter out = response.getWriter();
try {
int projectNo = Integer.parseInt(request.getParameter("no"));
List<Task> tasks = taskService.listByProject(projectNo);
out.printf("<a href='../task/add?projectNo=%d'>새 작업</a><br>\n", projectNo);
out.println("<table border='1'>");
out.println("<thead><tr>"
+ "<th>번호</th>"
+ "<th>작업</th>"
+ "<th>마감일</th>"
+ "<th>작업자</th>"
+ "<th>상태</th>"
+ "<th></th>"
+ "</tr></thead>");
out.println("<tbody>");
for (Task task : tasks) {
out.printf("<tr>"
+ "<td>%d</td>"
+ "<td><a href='../task/detail?no=%1$d'>%s</a></td>"
+ "<td>%s</td>"
+ "<td>%s</td>"
+ "<td>%s</td>"
+ "<td><a href='../task/delete?no=%1$d&projectNo=%d'>[삭제]</a></td>"
+ "</tr>\n",
task.getNo(),
task.getContent(),
task.getDeadline(),
task.getOwner().getName(),
getStatusLabel(task.getStatus()),
projectNo);
}
out.println("</tbody>");
out.println("</table>");
} catch (Exception e) {
out.println("<p>작업 목록 조회 오류!</p>");
e.printStackTrace();
return;
}
}
private String getStatusLabel(int status) {
switch (status) {
case 1:
return "진행중";
case 2:
return "완료";
default:
return "준비";
}
}
}
div태그 추가하여 index의 li태그 다 들고오기
앞의 li를 다 지우고 어디서 쓰일지 모르므로 contextPath를 지정해주었다.
String contextPath = getServletContext().getContextPath();
out.println("<div>");
out.printf("<a href='%s/board/list'>게시글</a>\n", contextPath);
out.printf("<a href='%s/member/list'>회원</a>\n", contextPath);
out.printf("<a href='%s/project/list'>프로젝트</a>\n", contextPath);
out.printf("<a href='%s/auth/login.html'>로그인</a>\n", contextPath);
out.printf("<a href='%s/auth/logout'>로그아웃</a>\n", contextPath);
out.println("</div>");
이 url은 웹 브라우저가 바라보는 url이라 정확하게 적어주어야 한다.(사실 아직도 컨텍스트와 서버 루트가 넘나 헷갈린다..)
현업에는 html 모두 서블릿으로 만든다. 왜냐? html로 만들면 고정이 되어버려서 중간에 광고삽입이 안돼기 때문이다!!!!!!!!!!
실무에서는 그래서 다 jsp로 만든다는 것이다!!
include를 통해 navi, header, footer를 추가할 수 있다.
세션아이디가 브라우저 입장에서 계속 있으니까 다시 로그인해야하는 그런 상황. 차라리 request로 해결하면 자동로그인이 개선됐을지도???
-> 개선했는데 이건 톰캣서버만의 문제인것같음.
세션이 생성되었는데 autologin에게 보고를 안해서 우리는 요청이 들어올 때 마다 로그인하도록 코드를 바꿨음
bitcamp-web-project ex10
쿠키란? 웹서버에서 웹브라우저쪽으로 보내는 data
쿠키를 받은 웹브라우저는 웹서버에 요청할 때 마다 서버에서 받은 쿠키를 요청헤더에 첨부하여 보낸다.
웹서버가 먼저 쿠키를 보내고 그 다음부터 웹브라우저가 웹서버에게 쿠키를 보낸다는 것.
그래서 쿠키란 무엇인가. 브라우저에 저장하는 데이터를 쿠키라고 부르는 것이다.
Cookie c5 = new Cookie("name3", URLEncoder.encode("홍길동", "UTF-8"));
// 프로토콜 예 => Set-Cookie: name3=%ED%99%8D%EA%B8%B8%EB%8F%99
요즘 웹브라우저/서버는 성능이 좋아서 한글 인코딩을 잘 해주지만 최신컴퓨터를 쓰지 않는/ 네트워크 장비가 떨어지는 곳에서 우리 서버를 사용할 경우를 대비하여 한글을 아래의 방법처럼 하는 걸 추천한다.
쿠키를 통해 최종방문일을 구현할 수 있을것이다………찾아보기
=> 최종 방문일 기준을 크롬 브라우저를 완전히 종료하는 것으로 잡아야 할 것 같다.
쿠키의 유효기간을 설정하지 않으면 쿠키는 웹브라우저를 닫는 순간 다 날아간다.
브라우저를 닫고 컴퓨터를 꺼도 내일 그 쿠기를 꺼내고싶다면 유효기간을 설정해주어야 한다.
그럼 브라우저는 메모리에 저장하지 않고 hdd에 쿠키를 저장해둔다.
보안에 관련된 것은 쿠키로 보내면 안됀다. 특히 비밀번호!!!!! 이메일은 상관 없음.
암호 조직화시키기…
정승제 50일수학 ebs
ex10 Servlet21
쿠키의 사용 범위를 지정하지 않으면 쿠키를 발행한 URL 범위에 한정된다. 즉 같은 URL로 요청할 때만 쿠키를 보낸다.
// 사용 범위 지정
// => 쿠키를 발급한 서블릿의 경로에 상관없이 지정된 경로의 서블릿을 요청할 때
// 웹 브라우저가 서버에 쿠키를 보낸다.
Cookie c2 = new Cookie("v2", "bbb");
c2.setPath("/bitcamp-web-project/ex10/a");
Cookie c3 = new Cookie("v3", "ccc");
c3.setPath("/bitcamp-web-project");
브라우저는 기본적으로 2개의 핵심 부품이 있는데 html을 css에따라 뿌리는 html렌더러,자바스크립트를 뿌리는 자바스크립트 렌더러라는 심장 2개를 들고 있다.
기존 로그인폼 html을 모두 긁어 loginServlet에 오버라이딩한 doget메소드 안에 둔다.
out.println("<input type='checkbox' name='saveEmail' value='%s'> 이메일 저장<br>");
체크박스인 경우 체크를 하지 않으면 파라미터 값이 넘어오지 않는다.
쿠키에서 이메일을 꺼내는 로직 - 안타깝게도 단일로 꺼내오는 메서드가 없어서 배열로 받아야함
// 웹 브라우저가 쿠키로 이메일을 보냈으면 꺼낸다.
String email = "";
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
if(cookie.getName().equals("email")) {
email = cookie.getValue();
break;
}
}
}
/auth/login
얘가 소속된 방 까지를 url로 본다?? 그니까 auth만 요청해도 쿠키는 보낸다는거?..
web-project ex09
request에서 forward, include는 값을 공유한다.
세션 => 클라이언트를 식별하는 기술이다. => HTTP 프로토콜은 Stateless 방식으로 통신을 한다. 즉 연결한 후 요청하고 응답을 받으면 연결을 끊는다. 그래서 서버는 클라이언트가 요청할 때 마다 누구인지 알 수 없다. => 이를 해결하기 위해 클라이언트가 접속하면 웹 서버는 그 클라이언트를 위한 고유 번호를 발급(쿠키 이용)한다. 이 고유 번호를 ‘세션 아이디’라 부른다. => 웹 브라우저는 세션 아이디를 쿠키에 보관해 두었다가 그 서버에 요청할 때 마다 세션 아이디를 보낸다. 왜? 세션 아이디는 쿠키이다. => 세션 아이디를 쿠키로 보낼 때 유효기간을 설정하지 않았기 때문에 웹 브라우저를 종료하면 세션 아이디 쿠키는 삭제된다. => 세션 아이디 쿠키의 사용 범위는 웹 애플리케이션이다. 예) /eomcs-java-web 따라서 같은 웹 애플리케이션의 서블릿을 실행할 때는 무조건 세션 아이디를 보낸다. 세션 아이디는 언제 발급하는가? => 새 세션을 생성할 때 세션 아이디를 발급한다.
세션 생성하기 : getSession() 호출
1) 클라이언트가 세션 아이디를 쿠키로 전송
세션아이디는 쿠키로 넘어온다.
Interaction diagram
1. collaborator
2. sequence
jsp는 실행하는게 아니다. JSPServlet이다!
jsp에서 작성하면 java코드로 변환되어 servletContainer가 컴파일된 .class파일을 실행하는것임.
jsp엔진은 jsp파일을 가지고 자바 소스코드를 만들때 반드시 서블릿을 만들도록 되어있다.
jsp파일자체가 실행되는게 아니라 그게 자바소스로 컴파일되어서 실행된다는 것 명심하기
왜 jsp가 등장했다? 출력문 작성하는게 너무 번거롭기때문에!! 개발자 대신 출력문을 작성해준다!
jsp문법은 암기가 아니고 이 코드가 자바코드로 어떻게 바뀌는지 아는게 중요하다.
에러를 제외한 나머지는 모두 include해준다.
include할 경우 include의 주최자가 text/html;charset=UTF-8을 해준다.
무조건 서블릿 실행 후에 jsp를 실행하도록 할 것!
jsp에 메서드를 추가하고싶다면?
<%! %> 안에 추가한다.
=> %는 엘리먼트
=> 데클로레이션 엘리먼트라고 부른다.
jsp el -> 자바코드를 제로상태로 만든다. 월요일날 배움a멭