[필기정리]Day76-2 - ServletMapping, cookie 등

Web/JSP

2020. 10. 14. 18:12

#Servlet Mapping

 

서블릿 매핑 방법

※ 서블릿 매핑 방법 2가지 1. web.xml에 맵핑하는 방법 2. 어노테이션을 이용한 서블릿 맵핑하는 방법 - 자바파일에 직접 매핑하는 방법이다. 1. 프로젝트 생성 ( New Dynamic Web Project ) 2. servlet파일 생.

chrismare.tistory.com

- ServletMapping.java

package com.superman.ex;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//@WebServlet("/ServletMapping")
public class ServletMapping extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ServletMapping() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Servlet Test</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("Servlet Mapping Test!");
		out.println("</body>");
		out.println("</html>");
	}
}

① web.xml에 맵핑하는 방법

ex) web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ServletMapping</display-name> 
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
  <servlet>
  	<servlet-name>ServletMapping</servlet-name>
  	<servlet-class>com.superman.ex.ServletMapping</servlet-class> // 패키지 전체 이름 적어주기
  </servlet>
  <servlet-mapping> // url 매핑
  	<servlet-name>ServletMapping</servlet-name>
  	<url-pattern>/ServletMapping</url-pattern>
  </servlet-mapping>
 
</web-app>

② 어노테이션을 이용한 서블릿 맵핑하는 방법(java 클래스 코드 안에 직접 정의하는 것)

@WebServlet("/mappingName")

 

# Page Directive

   JSP 페이지 관련 정보 설정

   JSP 페이지를 Servlet으로 파싱 시 page 디렉티브 정보 참조함

- 사용형식

<%@ page 속성="속성값" 속성="속성값"... %>

 

- Page 디렉티브 속성 및 설명

속성 설명 기본값
import 사용될 클래스의 패키지를 지정해줄 때 사용
ex) <%@page import="java.util.Date" %>
 
session 세션 사용 여부 결정 true
contentType JSP 페이지 실행 후 출력될 문서 MIME 타입 및 charset인코딩 지정
ex) <%@page contentType="text/html; charset=UTF-8" %>
MIME - text/html
encoding-ISO-8859-1
(한글 미포함)
errorPage 에러가 발생했을 떼 보여줄 페이지 지정  
isErrorPage 현재 JSP페이지가 에러 발생 시 보여줄 페이지인지 여부 결정 false
pageEncoding JSP 소스 파일이 저장될 때 사용될 인코딩을 지정
ex) <%@page pageEncoding="UTF-8" %>
 
deferredSyntaxAllowedAsLiteral #{를 단순 문자열로 인식할 지 여부 지정 false
trimDirectiveWhitespaces JSP 실행 후 클라이언트 처리결과 출력 시 첫 줄 공백 제거 여부 지정 false
buffer 출력 버퍼 사이즈 지정
(none의 경우 버퍼를 거치치 않고 바로 출력됨)
최소 8KB
autoFlush 출력 버퍼가 꽉 찬 경우
버퍼데이터를 출력스트림으로 내보내고 비울지 여부 지정
(false의 경우 출력 버퍼가 꽉 차면 에러 발생)
true
usELlgnored 표현 언어를 단순 문자열로 인식할지 여부 지정
(true의 경우 단순 문자열로 인식)
false
info JSP 페이지 관련 설명 입력  
isThreadSafe SingleThreadModel의 추가 상속 여부 결정
false - SingleThreadModel 상속
true
language 페이지에서 사용되는 스크립트 언어 지정
WAS제품에 따라 JSP 컨테이너에서 다른 언어 지원할 수 있음
java
extends JSP 페이지가 Servlet으로 파싱될 때 상속할 부모클래스 지정
속성값으로 사용될 클래스는 
javax.servlet.jsp.HttpJspPage 혹은 javax.servlet.jsp.JspPage 클래스를
상속해 구현한 클래스여야 함
톰캣의 경우 org.apache.jasper.runtime.HttpJspBase를 상속받게 됨
 

 

- JSP 태그 종류

구분 JSP 태그 용도
지시자 <%@ %> JSP 페이지가 컨테이너에게 필요한 메시지를 보내기 위한 태그
클래스를 import할 경우 파일 내 어디서든 접근 가능
① page : JSP 페이지의 전체적인 속성 지정
② include : 다른 페이지의 소스코드를 현재 페이지에 삽입
 ㄴ ex) <% include file="hello.jsp" %> 
③ taglib : 태그라이브러리의 태그 사용
주석 <%-- --%> 주석 처리
선언 <%! %> 변수, 메소드의 선언
페이지 내 어디서나 접근할 수 있는 전역 변수 및 메소드
표현식 <%= %> 변수 또는 메소드의 결과값 출력
변수나 메소드를 사용할 때 ;을 사용하지 않음
코드를 줄여 가시성, 편리성이 증가한다
스크립트릿 <% %> JAVA 코드 삽입
기존 자바 언어를 동일하게 사용할 수 있음
액션태그 <jsp:action></jsp:action> 페이지 삽입, 공유, 자바빈 사용 등
① <jsp:include> : 다른 페이지의 실행 결과를 현재 페이지에 포함시킴
<jsp:forward> : 페이지 간의 제어를 이동시킴
<jsp:useBean> : Java Bean을 페이지에서 사용할 수 있게 함
<jsp:setProperty> : Property값을 세팅할 때 사용
<jsp:getProperty> : Property값을 가져올 때 사용 
<jsp:param> : include, forward 안에서 사용되며, 인자를 추가할 때 사용

// Tip - Java Bean(자바빈) : 간단히 DTO와 같이 필드, getter, setter로만 이루어진 자바 클래스

 

# out 기본 객체

브라우저에 jsp 출력되는 형태로 변환하는 것

 

- out 객체의 출력 메소드

메소드 리턴 타입 설명
print(String text) void html태그나 단순 텍스트 등의 문자열 출력
println(String text) void html태그나 단순 텍스트 등의 문자열 출력
마지막에 줄바꿈 문자(\r\n)을 추가해 출력
<br>태그 출력이 아니므로 주의할 것!
newLine() void 줄바꿈 문자(\r\n) 출력
<br>태그 출력이 아니므로 주의할 것!

- out 객체의 버퍼 관련 메소드

메소드 리턴 타입 설명
getBufferSize() int 버퍼의 크기 구하는 메소드
getRemaining() int 현재 버퍼의 남은 공간 크리를 구하는 메소드
clear() void 버퍼의 내용을 비우는 메소드
버퍼를 flush()한 이후에 사용하면 IOException 발생
clearBuffer() void 버퍼의 내용을 비우는 메소드
버퍼를 flush()한 이후에 사용해도 IOException 발생하지 않음
flush() void 현재 버퍼에 출력된 내용들을 클라이언트로 전송
isAutoFlush() boolean 버퍼가 가득 찬 경우 자동으로 flush() 할지 여부 리턴
자동 flush인 경우 true 리턴

//Tip: response.getWriter()로 얻은 출력 스트림과 out 객체의 차이점(참고사항)

        버퍼의 사용 여부 차이로

        PrintWriter로 출력한 내용이 먼저 출력되고,

        out 기본 객체로 출력한 내용이 나중에 출력된다.

 

- PageContext 객체(javax.servlet.jsp.PageContext)

  (페이지 영역에 해당하는 부분)

메소드 반환타입 설명
getRequest() ServletRequest request 기본 객체 반환
getResponse() ServletResponse response 기본 객체 반환
getSession() HttpSession session 기본 객체 반환
getServletContext() ServletContext application 기본 객체 반환
getServletConfig() ServletConfig config 기본 객체 반환
getOut() JspWriter out 기본 객체 반환
getException() Exception exception 기본 객체 반환
getPage() Object page 기본 객체 반환

// PageContext 객체는 JSP 기본 객체로 따로 선언하지 않아도 참조해 사용 가능하다.

 

- 흐름제어 기능

메소드 반환타입 설명
forward(String relativeUrlPath) void 지정한 상대경로 페이지로 이동
include(String relativeUrlPath) void 지정한 상대경로 페이지를 현재 JSP 페이지에 포함시킴

 

# JSP 출력 버퍼(buffer)

  페이지 처리결과를 곧바로 출력하여 응답하지 않고 버퍼에 모아두었다가 한꺼번에 응답

  기본적으로 8kb의 버퍼를 사용하도록 되어 있다.

- 버퍼의 장점

① 성능 향상

② 최종 출력 이전에 처리 결과 수정 가능 

③ <jsp:forward> 기능이나 에러 처리에 용이

 

+ setCharacterEncoding, setContentType 차이점

// form 태그에서 입력한 값 전송 시

request.setCharacterEncoding("UTF-8");

// servlet에서 화면에 데이터를 출력할 때 브라우저에게 사용할 문자코드와 메시지 전달하는 것

request.setCharacterEncoding("UTF-8"), response.setContentType("text/html; charset=UTF-8");

 

# JSP와 Servlet의 관계

JSP → JSP컨테이너에 의해 Servlet으로 변환 → Servlet컨테이너에서 초기화 → Servlet객체가 되어 클라이언트 요청처리

 

- JSP가 Servlet으로 변환되는 규칙

① 최초의 클라이언트 요청이 들어올 때 (url 치고 들어왔을 때)

② 스크립트릿에 작성된 소스 : 변환된 Servlet의 service() 안에 들어감

③ 표현식 : 변환된 Servlet의 service() 안에서 out.println()으로 변환됨

④ 선언문 : 변환된 Servlet의 멤버메소드로 변환됨

⑤ html 태그들 : 변환된 Servlet의 service() 안에서 out.write()로 변환됨

⑥ page 디렉티브 속성값 : Servlet으로 변환 시 참고할 정보로 활용됨

 

 

① 순서도

# Cookie(쿠키)

  클라이언트 측에서 서버에 데이터를 요청하고 난 후 연결이 끊어졌을 때, 정보를 지속적으로 유지하기 위한 수단

  서버에서 생성되며, 클라이언트 측에 특정 정보를 저장시킨다.

  4KB 정도의 크기로, 300개까지의 데이터 정보를 가질 수 있다.

  로컬에 물리적으로 text file 을 저장하는 방식이기 때문에,

  해킹 등 보안의 문제가 일어날 수 있는 단점이 있다.

 

- cookie 생성과정

  쿠키 생성 -> 속성 설정 -> response 객체에 쿠키 탑재

 

1. 쿠키의 문법

  메소드 종류
Set setMaxAge(), setPath(), setValue(), setVersion()
Get getMaxAge(), getName(), getPath(), getValue(), getVersion()

 

ex) setCookie.jsp

<%
Cookie cookie = new Cookie("id", "hong");
cookie.setMaxAge(60*60); // 1시간
response.addCookie(cookie); // 쿠키 추가
%>

ex) getCookie.jsp

<%
Cookie[] cookies = request.getCookies(); //쿠키 배열 타입으로 가지고 옴
for(int i = 0 ; cookies !=null && i < cookies.length; i++){
String str = cookies[i].getName(); // 배열 지정
if(str.equals("id"){
	out.println("cookies[" + i + "] name = " + cookies[i].getName()); // 결과 : id
	out.println("cookies[" + i + "] value = " + cookies[i].getValue());  // 결과 : hong
}
}
%>

// 쿠키를 받아오고, 쿠키의 길이만큼 이름값을 검사해 줄 수도 있다.

 

ex) delCookie.jsp

<%
Cookie[] cookies = request.getCookies();
for(int i = 0 ; cookies !=null && i < cookies.length; i++){
String str = cookies[i].getName();
if(str.equals("id"){
	cookies[i].setMaxAge(0); // 쿠키저장시간을 0으로 max age를 설정해줘서 삭제해준다. 쿠키 만료시키는 것
	response.addCookie(cookies[i]); 
}
}
%>

 

// 쿠키의 max age0 으로 설정하면 삭제가 된다.

   마지막에 이 변동사항을 다시 response객체를 통해 갱신해줘야 한다.

 

- 쿠키 관련 자주 쓰이는 메소드들

메소드 설명
setValue(String value) 쿠키 값 설정
setMaxAge(int second) 쿠키 만료 기간 지정
getValue() 쿠키 값 불러오기
getMaxAge() 쿠키 만료 기간 얻어 옴
getName() 쿠키이름 얻어 옴

 

// Tip : 크롬에 저장된 쿠키 보는 방법 

          브라우저 url에 chrome://settings/siteData 입력!

 

ex)

- setCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie cookie = new Cookie("id", "hong");
	cookie.setMaxAge(60*60); //  1시간
	response.addCookie(cookie); // 쿠키 추가
%>

- getCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<%
    Cookie[] cookies = request.getCookies(); //쿠키를 받아온다.
    for(int i = 0 ; i < cookies.length; i++){
        String str = cookies[i].getName();
        if(str.equals("id")){
            out.println("cookies[" + i  + "] name = " + cookies[i].getName());
            out.println("cookies[" + i  + "] value = " + cookies[i].getValue());
            break;
        }
    }
%>
</body>
</html>

- delCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] cookies = request.getCookies();
	    for(int i = 0 ; i < cookies.length; i++){
	        String str = cookies[i].getName();
	        if(str.equals("id")){
	            cookies[i].setMaxAge(0); //0으로 max age를 설정해줘서 삭제해준다. 쿠키의 유효기간을 0으로 설정하는 것 = 삭제하는 것
	            response.addCookie(cookies[i]);
	            break;
	        }
	}
%>

 

Q.  CookieTest01 서블릿을 만들고 이 안에서 아이디, 비밀번호, 그리고 아이디 기억하기 체크박스를 만든다.

     로그인 버튼을 누르면 CookieTest02로 이동하게끔 파일을 만들자.

     그리고 CookieTest02 에서 다음과 같이 출력하도록 하고

     "hong님 환영합니다.(1234)" (request.getParameter 사용)

      CookieTest01 페이지로 갈 수 있는 링크도 같이 만들어주자.

      그리고 아이디 기억하기가 체크가 되어있으면 아이디를 쿠키에 저장하도록 하고

      쿠키의 유효기간은 1년으로 하자.

      아이디 기억하기 체크박스가 체크가 안되어 있으면 쿠키를 만료시키자.

      이미지(1_1.png, 1_2.png, 1_3.png) 참고.

      + 페이지 전체를 서블릿 만들기

A.

- CookieTest01.java

package come.superman.www;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/CookieTest01")
public class CookieTest01 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public CookieTest01() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		Cookie[] cookies = request.getCookies();
		
		
		boolean flag = false;
		String id = null;
		if(cookies != null)
		{
			for(int i=0;i<cookies.length;i++)
			{
				String cookieName = cookies[i].getName();
				if(cookieName.equals("id"))
				{
					flag = true;
					id = cookies[i].getValue();
					break;
				}
			}
		}
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Cookie Test</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<form method='post' action='CookieTest02'>");		
		out.println("<table>");	
		out.println("<tr><td>아이디</td><td><input type='text' name='id'");
		if(flag)
			out.println("value='" + id + "'");
		out.println("></td></tr>");
		out.println("<tr><td>비밀번호</td><td><input type='text' name='pw'></td></tr>");
		out.println("<tr><td colspan='2'><input type='checkbox' name='remID'");
		if(flag)
			out.println("checked");
		out.println("value='rememberID'> 아이디 기억하기</td></tr>");
		out.println("<tr><td colspan='2'><input type='submit' value='로그인'></td></tr>");
		out.println("</table>");		
		out.println("</form>");		
		out.println("</body>");
		out.println("</html>");
	}
}

- CookieTest02.java

package come.superman.www;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/CookieTest02")
public class CookieTest02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public CookieTest02() {
        super();
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();	
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String remID = request.getParameter("remID");	
		
		if(remID != null && remID.equals("rememberID"))
		{
			Cookie cookie = new Cookie("id", id);
			cookie.setMaxAge(60*60*24*365);
			response.addCookie(cookie);
		}
		else
		{
			Cookie[] cookies = request.getCookies();
			if(cookies !=null)
			{
				System.out.println("쿠키삭제");
				for(int i=0;i<cookies.length;i++)
				{
					String cookieName = cookies[i].getName();
					if(cookieName.equals("id"))
					{
						cookies[i].setMaxAge(0);
						response.addCookie(cookies[i]);
						break;
					}
				}				
			}
		}
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Cookie Test</title>");
		out.println("</head>");
		out.println("<body>");
		out.println(id +"님 " + "환영합니다. (" + pw + ")<br>");
		out.println("<a href='CookieTest01'>CookieTest01 페이지</a>");
		out.println("</body>");
		out.println("</html>");
	}
}

 

 

728x90