상세 페이지 =>
<%@ page errorPage="exceptionNoProductId.jsp" %>
<!-- 우선 순위 높아서 오류 났을 때 web.xml 안 보게 함 -->
오류 페이지 =>
<p><%=request.getRequestURL()%>?<%=request.getQueryString() %></p>
<!-- ?productId=Z1234 => 잘못된 제품명은 요청파라미터/쿼리스트링임! -->
오류 페이지 생성 =>
<p><%=request.getRequestURL()%></p>
<!-- 받을 값 없으니까 ?~~~ 필요없! -->
우선순위 낮은 web.xml에 바로 경로 작성
<error-code>404</error-code>
<location>/exceptionNoPage.jsp</location>
요청
=> request / response
=> 응답
chrome(res, resp) == filter ==> server
public class AuthenFilter implements Filter {
// 초기화, 필터 시작
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter01 초기화 완료");
}
// 필터 기능 수행
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("Filter01 수행...");
// /ch12/filter01_process.jsp?name=개똥이
String name = request.getParameter("name"); // 개똥이
// 요청 파라미터가 없으면(/ch12/filter01_process.jsp?name=)
if(name == null || name.equals("")) {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTD-8"); // MIME 타입
PrintWriter writer = response.getWriter();
String message = "입력된 name 값은 null입니다."; // response에 이 값이 담김
writer.println(message);
return;
}
filterChain.doFilter(request, response);
}
// 필터 종료되기 전 마지막 호출
@Override
public void destroy() {
System.out.println("Filter01 해제...");
}
}
web.xml =>
<!-- Filter 인터페이스의 구현 클래스를 서블릿 필터로 등록 -->
<filter>
<filter-name>Filter01</filter-name> // 이거로 filter-mapping이랑 세트 됨
<filter-class>filter.AuthenFilter</filter-class> // 서블릿 등록
</filter>
<filter-mapping>
<filter-name>Filter01</filter-name>
<url-pattern>/chap12/filter01_process.jsp</url-pattern> // /* 쓰면 모든 페이지
</filter-mapping>
client <-- [web => request 객체 : 사용자 입력 값] -- filter[!비교!] --[{param1:..., param2:...}서블릿 값]--> server
public class InitParamFilter implements Filter {
private FilterConfig filterConfig = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter02 초기화...");
this.filterConfig = filterConfig; // filterConfig로 넘어온 파라미터 전달 받아서 담음
}
/*
요청URI : filter02_process.jsp
요청파라미터 : {id=admin, passwd=java}
요청방식 : post
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("Filter02 수행...");
// 사용자가 입력한 값
String id = request.getParameter("id"); // admin
String passwd = request.getParameter("passwd"); // java
// web.xml 필터 파라미터 값 -> filterConfig로 받음 => 그 값을 여기서 씀 => 블럭 밖이니까 vo같은 멤버변수 필요 => private FilterConfig...
String param1 = this.filterConfig.getInitParameter("param1"); // admin
String param2 = this.filterConfig.getInitParameter("param2");
String message;
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charser=UTF-8"); // MIME 타입
PrintWriter writer = response.getWriter();
if(id.equals(param1)&&passwd.equals(param2)){// 객체 아니고 문자열 비교니까 == 말고 equals 씀
message = "로그인 성공했습니다.";
} else {
message = "로그인 실패했습니다.";
}
// message값이 response객체에 들어감
writer.println(message);
// c <---> s 할 때 필터 여러개 있으면 다음 필터로 넘기기 되게 함
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("Filter02 해제...");
}
}
public class LogFilter implements Filter {
// 로그를 파일로 만들어야 하므로 파일 객체를 멤버변수로 선언
PrintWriter writer; // 객체 선언
// {filename=c:\\logs\\webmarket.log} => filterConfig
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// c:\\logs\\webmarket.log
String filename = filterConfig.getInitParameter("filename");
// FileWriter(String fileName, boolean true/false)
// 1) true : 기존 내용에 새로운 내용이 추가(append) - 누적됨
// 2) false : 기존 내용을 지우고 덮어쓰기(overwrite)
// PrintWriter(출력대상, boolean true/false)
// 1) true : Auto flush -> writer.flush()를 생략함(임시저장 공간 비움)
// 2) false : Auto flush 안함(임시저장 공간 비우지 않음)
// flush()는 현재 버퍼에 저장되어 있는 내용을 클라이언트로 전송하고 버퍼 비움(JSP)
// 파일 관련 => try catch 필수!!
try {
writer = new PrintWriter(new FileWriter(filename, true), true);
// webmarket.log 파일 없으면 자동 생성
// 이렇게 하겠다고 설계
File file = new File(filename);
if(!file.exists()) { // 설계상의 파일이 실제로 없다면
// 설계대로 파일 생성
file.createNewFile();
writer.println(file.getAbsolutePath() + " 파일이 생성되었습니다."); // 이 자체도 로그임
} else { // 이미 파일이 있으면
System.out.println(file.getAbsolutePath() + " 파일이 생성되어 있습니다.");
}
} catch (IOException e) {
throw new ServletException("로그 파일을 열 수 없습니다.");
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
writer.println("나는 윤하다.");
// filter가 연속적으로 있다면 다음 필터로 제어 및 요청(request)/응답(response) 객체들 전달
// 정보를 넘겨줌
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}