- 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 age를 0 으로 설정하면 삭제가 된다.
마지막에 이 변동사항을 다시 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>");
}
}
'Web > JSP' 카테고리의 다른 글
[필기정리]Day77 - include(), forward() 등 (0) | 2020.10.17 |
---|---|
[필기정리]Day76-3 - 저장영역(page, request, session, application) (0) | 2020.10.14 |
[필기정리]Day76-1 - doGet, doPost, service, 회원가입 구현 예시 등 (0) | 2020.10.14 |
[필기정리]Day75 - Servlet 생명주기, session 등 (0) | 2020.10.13 |
[필기정리] Day73 - include file, submit, Servlet, RequestDispatcher 등 (0) | 2020.10.08 |