지구정복

[JSP] 1/5 | JSP기본객체(page, request, session, application), 쿠키와 세션(로그인 구현하기), 서블릿(서블릿 만들기, 서블릿 메서드 get과 post, 구구단출력하기, 우편번호 검색기) 본문

데이터 엔지니어링 정복/JAVA & JSP

[JSP] 1/5 | JSP기본객체(page, request, session, application), 쿠키와 세션(로그인 구현하기), 서블릿(서블릿 만들기, 서블릿 메서드 get과 post, 구구단출력하기, 우편번호 검색기)

eeaarrtthh 2021. 1. 5. 17:45
728x90
반응형

5.6 JSP 기본 객체의 속성(Attribute) 사용하기

p132

기본객체
	내부저장공간(buffer => hashmap(key, value)로 구성되어있음
		데이터 저장하는 메서드 setAttribute
		데이터 불러오는 메서드 getAttribute
		데이터 삭제하는 메서드 removeAttribute
		
			사용 영역 / 존재 시간이 내려갈수록 큼
	page		한 페이지 내에서만 저장
	request		페이지 간에 하나의 요청 (많이 사용)
	session		하나의 접속( 브라우저 시작 - 끝 ) (많이 사용)
	application	어플리케이션 내부 전체(톰캣이 시작되고나서 끝날때까지 지속)
		메서드
		getRealPath(경로) 		절대경로 가져오기
		getResource(경로)		url경로 가져오기
		getResourceAsStream(경로)	지정한url경로에 inputstream을 리턴

 

-page

page 기본객체는 하나의 페이지 내에서만 사용가능하다

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String data = "value";

	//한 페이지 안에 저장공간에 데이터란 변수의 속성값을 설정
	pageContext.setAttribute( "data", data );
	out.println( (String)pageContext.getAttribute( "data" ) );
%>

 

-request

request 기본객체는 요청을 통해서 여러 jsp 페이지간의 데이터를 주고받을 수 있다.

sub.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	out.println( "Hello Include<br>" );
	out.println( "data1 : " + request.getParameter( "data1" ) + "<br>" );
	out.println( "data1 : " + request.getAttribute( "data2" ) + "<br>" );
%>

data02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	//request 기본 객체 사용
	request.setAttribute( "data2", "value2" );
%>

<!-- include page 사용  -->
<jsp:include page="sub.jsp">
	<jsp:param value="value1" name="data1"/>
</jsp:include>

</body>
</html>

 

form을 통해서 받아오기

form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- data02.jsp에 data3변수를 넘겨준다는 뜻  -->
<form action="data02.jsp" method="post">
data3 : <input type="text" name="data3">
<input type="submit" value="전송">

</form>
</body>
</html>

data02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	//form.jsp의 data3변수 받아오기
	request.setCharacterEncoding( "utf-8" );
	out.println( request.getParameter( "data3" ) + "<br>" );
	
	//request 기본 객체 사용
	request.setAttribute( "data2", "value2" );
%>

<!-- include page 사용  -->
<jsp:include page="sub.jsp">
	<jsp:param value="value1" name="data1"/>
</jsp:include>

</body>
</html>

 

-session

data03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	session.setAttribute( "data1", "value1" );
%>

data03_2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	out.println( "session : " + (String)session.getAttribute( "data1" ) );
%>

</body>
</html>

data03.jsp를 먼저 실행시키고 data03_2.jsp를 실행시키면 아래와 같이 데이터가 나온다.

이때 브라우저를 껐다가 다시 data03_2.jsp를 다시 키면 데이터가 사라진다. 즉 하나의 세션동안에만 데이터값은 살아있다.

 

-application

p121

 

data04.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	application.setAttribute( "data1", "value1" );

%>

data04_2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	out.println( "application : " + (String)application.getAttribute( "data1" ) );
%>
</body>
</html>

이때도 data04.jsp를 먼저실행하고 data04_2.jsp를 실행해야된다.

또한 브라우저를 껐다가 다시 켜도 데이터는 남아있다. application은 톰캣을 꺼야지만 데이터값이 사라진다.

 

 

새로운 다이나믹웹프로젝트를 만들때 아래와 같이 체크를 해준다.

아래 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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ApplicationEx01</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>
  
  <context-param>
  	<description>설명글</description>
  	<param-name>logEnabled</param-name>
  	<param-value>true</param-value>
  </context-param>
  <context-param>
  	<description>설명글</description>
  	<param-name>debugLevel</param-name>
  	<param-value>5</param-value>
  </context-param>
  
</web-app>

그리고 새로운 jsp페이지를 만들고 위 데이터를 읽어오자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%	
	//이름만 가져오기
	Enumeration<String> params = application.getInitParameterNames();
	while( params.hasMoreElements() ) {
		//out.println( params.nextElement() + "<br>" );
		String param = params.nextElement();
		
		//이름과 값 둘 다 가져오기
		out.println( param + "/" + application.getInitParameter(param) + "<br>" );
	}

%>

</body>
</html>

 

 

application을 이용해서 서버에 대한 정보 얻어오기

p124

아파치톰캣에 대한 버전이 나온다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	out.println( application.getServerInfo() + "<br>" );
	out.println( application.getMajorVersion() + "<br>" );
	out.println( application.getMinorVersion() + "<br>" );
%>

</body>
</html>

 

9. 클라이언트와의 대화1: 쿠키

p205

상태의 저장 - 로그인 상태의 저장
쿠키	- 브라우저에 저장
	* 이름과 값만 있으면 된다.
	* 유효시간이 있다.(브라우저가 켜져있을 때만 존재한다.)
	* 특정 도메인에서 사용한다.
	* 경로가 있다.

세션	- 서버에 저장

쿠키는 웹 브라우저가 보관하는 데이터이다. 웹 브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송하며, 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해서 필요한 데이터를 읽을 수 있다. 쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성할 수 있는데, JSP에서 생성하는 쿠키는 웹 서버에서 생성하는 쿠키이다. 또한 쿠키를 이용하면 웹 서버와 웹 브라우저는 필요한 값을 공유하고 상태를 유지할 수 있다.

 

새로운 웹프로젝트를 만들고 아래와 같이 setCookies.jsp를 작성한다.

setCookies.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	//쿠키생성 및 저장
	Cookie cookie1 = new Cookie( "data1", "value1" );

	//쿠키전송
	response.addCookie( cookie1 );
	
	//2번 쿠키 전송
	Cookie cookie2 = new Cookie( "data2", "value2" );
	response.addCookie( cookie2 );
	
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

쿠키 출력
<br><hr>
<%
	out.println( "쿠키명 : " + cookie1.getName() + "<br>" );
	out.println( "쿠키값 : " + cookie1.getValue() + "<br>" );
	
	out.println( "쿠키명 : " + cookie2.getName() + "<br>" );
	out.println( "쿠키값 : " + cookie2.getValue() + "<br>" );
%>

</body>
</html>

브라우저 개발자도구 Application - Cookie에 쿠키가 저장되어 있는 것을 확인할 수 있다.

 

 

쿠키생성이 없이 현재 브라우저에 생성되어있는 쿠키값 가져오기

getCookies.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	//브라우저에 있는 쿠키를 가져오기
	Cookie[] cookies = request.getCookies();

	//쿠키존재여부 조건문
	if ( cookies != null && cookies.length > 0 ) {
		for ( int i=0; i<cookies.length; i++ ) {
			//쿠키값 가져오기
			out.println( cookies[i].getValue() + "<br>" );
		}
	} else{
		out.println( "쿠키 없음" );
	}
%>

</body>
</html>

만약 브라우저를 껐다가 다시 getCookies.jsp를 실행하면 쿠키가 없다고 나온다.

 

 

ㅇ쿠키를 이용해서 로그인 구현하기

로그인
	로그인폼(loginForm.jsp)	- ID와 PW를 입력
		* 로그인확인(loginCheck.jsp)
		성공(loginComplete.jsp	- 로그인이 된 페이지로 이동(로그인정보에 대한 쿠키값의 존재여부 확인)
						로그아웃기능(logOut.jsp)
		실패	- 로그인 폼으로 다시 이동

곧바로 로그인된 페이지로 이동할경우 로그인폼으로 이동될 수 있도록 해야한다.

아래와 같이 jsp파일을 만든다.

-loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="loginCheck.jsp" method="post" >
아이디 <input type="text" name="id" size="20" maxlength="4" />
비밀번호 <input type="password" name="password" size="20" maxlength="6">
<input type="submit" value="전송" >
</form>

</body>
</html>

-loginCheck.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding( "utf-8" );
	
	String id = request.getParameter( "id" );
	String password = request.getParameter( "password" );
	
	//편의상 id와 password 고정
	String save_id = "test";
	String save_password = "1234";
	
	int flag = 2;
	if ( id.equals(save_id) && password.equals(save_password) ) {
		// 로그인 성공
		flag = 0;
		
		//쿠키에는 절대로 개인정보( 비밀번호, 주민번호, 폰번호 등)를 집어넣으면 안된다.
		Cookie cookie1 = new Cookie( "login_id", id );
		Cookie cookie2 = new Cookie( "login_grade", "A" );
		
		response.addCookie( cookie1 );
		response.addCookie( cookie2 );
		
	} else {
		// 로그인 실패
		flag = 1;
	}
	
	
	out.println( "<script type='text/javascript'> " );
	if ( flag == 0 ) {
		out.println( "alert('로그인성공');" );
		out.println( "location.href='loginComplete.jsp';" );
	} else if (flag == 1 ) {
		out.println( "alert('ID나 Password가 틀렸습니다.');" );
		out.println( "history.back();" );
	} else {
		out.println( "alert('기타 에러');" );
		out.println( "history.back();" );
	}
	out.println( "</script> " );
%>

-loginComplete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	int flag = 1;
	Cookie[] cookies = request.getCookies();
	if ( cookies != null && cookies.length > 0 ) {
		for ( int i=0; i<cookies.length; i++ ) {
			//아이디값이 있고 값이 공백이 아니면
			if ( cookies[i].getName().equals( "login_id" ) && !cookies[i].getValue().equals( "" ) ) {
				//로그인 되어있음
				flag = 0;
				break;
			}
		}
	}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	if ( flag == 1 ) {
		out.println( "<script type='text/javascript'> " );
		out.println( "alert('로그인해야 합니다.');" );
		out.println( "location.href='loginForm.jsp';" );
		out.println( "</script> " );
	} else {
		out.println( "로그인 되었습니다.<br>" );
		out.println( "<a href='logOut.jsp'>로그아웃</a>" );
	}
%>

</body>
</html>

-logOut.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//쿠키를 제거하려면 쿠키의 유효시간을 0으로 만드는 방법밖에 없다.
	Cookie cookie1 = new Cookie( "login_id", "" );
	Cookie cookie2 = new Cookie( "login_grade", "" );
	cookie1.setMaxAge(0);
	cookie2.setMaxAge(0);
	
	//없애진 쿠키를 다시 보내준다.
	response.addCookie(cookie1);
	response.addCookie(cookie2);
	
	out.println( "<script type='text/javascript'> " );
	out.println( "alert('로그아웃 되었습니다.');" );
	out.println( "location.href='loginForm.jsp';" );
	out.println( "</script> " );
%>

-실행결과

 

loginForm.jsp에서 바로 loginComplete.jsp로 이동하면 아래와 같이 뜬다.

 

 

10. 클라이언트와의 대화2: 세션

p232

서버세션을 사용하면클라이언트의 상태를 서버에 저장할 수 있다.

웹 컨테이너는 기본적으로 한 웹 브라우저마다 한 세션을 생성한다.

 

세션은 쿠키처럼 만드는 개념이 아니라 값을 집어넣는 개념이다.

-session01.jsp

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	out.println( session.getId() + "<br>" );
	out.println( session.getCreationTime() + "<br>" );	//생성시간
	out.println( session.getLastAccessedTime() + "<br>" );	//접속시간
	
	java.util.Date date = new Date( session.getCreationTime() );
	out.println( date.toLocaleString() + "<br>" );
%>

</body>
</html>

 

세션의 종료 메서드는 session.invalidate()를 사용한다.

세션의 유효시간은 특정시간이 지나면 꺼진다. 이를 설정하는 것은 WEB-INF/web.xml에서 

<session-config>태그를 이용해서 설정할 수 있다.

 


*쿠키와 세션 차이점

쿠키 대신에 세션을 사용하는 가장 큰 이유는 세션이 쿠키보다 보안에서 앞선다.

쿠키의 이름이나 데이터는 네트워크를 통해 전달되기 때문에 HTTP프로토콜을 사용하는 경우 중간에 누군가 쿠키의 값을 읽어올 수 있다. 하지만 세션의 값은 오직 서버에만 저장되기 때문에 중요한 데이터를 저장하기에 알맞은 장소이다.

 

두번째 이유는 웹 브라우저가 쿠키를 지원하지 않을 경우 또는 쿠키를 막는 경우 쿠키를 사용할 수 없지만 세션은 이와 상관없이 사용할 수 있다. 

 

하지만 세션은 여러 서버에서 공유할 수 없다. 반면에 쿠키는 도메인을 이용해서 쿠키를 여러 도메인 주소에 공유할 수 있다. 


 

ㅇ세션을 이용해서 로그인 구현하기

아래와 같이 jsp파일을 만든다.

-loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="loginCheck.jsp" method="post" >
아이디 <input type="text" name="id" size="20" maxlength="4" />
비밀번호 <input type="password" name="password" size="20" maxlength="6">
<input type="submit" value="전송" >
</form>

</body>
</html>

-loginCheck.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding( "utf-8" );
	
	String id = request.getParameter( "id" );
	String password = request.getParameter( "password" );
	
	//편의상 id와 password 고정
	String save_id = "test";
	String save_password = "1234";
	
	int flag = 2;
	if ( id.equals(save_id) && password.equals(save_password) ) {
		// 로그인 성공
		flag = 0;
		
		//세션을 집어넣는다.
		session.setAttribute( "login_id", id );
		session.setAttribute( "login_grade", "A" );
		
	} else {
		// 로그인 실패
		flag = 1;
	}
	
	
	out.println( "<script type='text/javascript'> " );
	if ( flag == 0 ) {
		out.println( "alert('로그인성공');" );
		out.println( "location.href='loginComplete.jsp';" );
	} else if (flag == 1 ) {
		out.println( "alert('ID나 Password가 틀렸습니다.');" );
		out.println( "history.back();" );
	} else {
		out.println( "alert('기타 에러');" );
		out.println( "history.back();" );
	}
	out.println( "</script> " );
%>

-loginComplete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	int flag = 1;
	if ( session.getAttribute( "login_id" ) != null && !session.getAttribute( "login_id" ).equals("") ) {
		flag = 0;
	}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	if ( flag == 1 ) {
		out.println( "<script type='text/javascript'> " );
		out.println( "alert('로그인해야 합니다.');" );
		out.println( "location.href='loginForm.jsp';" );
		out.println( "</script> " );
	} else {
		out.println( "로그인 되었습니다.<br>" );
		out.println( "<a href='logOut.jsp'>로그아웃</a>" );
	}
%>

</body>
</html>

-logOut.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	session.invalidate();
	
	out.println( "<script type='text/javascript'> " );
	out.println( "alert('로그아웃 되었습니다.');" );
	out.println( "location.href='loginForm.jsp';" );
	out.println( "</script> " );
%>

실행결과는 위에 쿠키때와 같다.

 

또한 로그인기능에서 관리자와 일반회원 로그인기능으로 나누는데 이때 관리자의 경우 등급을 검사해야하고

일반회원인경우 존재여부를 검사해야한다.

로그인
	회원로그인
		* 존재여부 검사
	관리자로그인
		* 특정값(등급)을 검사

 

17. 서블릿 기초

p497

서블릿의 개발 과정

 

1. 서블릿 규약에 따라 자바 코드를 작성한다.

2. 자바 코드를 컴파일해서 클래스 파일을 생성한다.

3. 클래스 파일을 /WEB-INF/classes 폴더에 패키지에 알맞게 위치시킨다.

4. web.xml 파일에 서블릿 클래스를 설정한다.

5. 톰캣 등의 컨테이너를 실행한다.

6. 웹 브라우저에서 확인한다.

서블릿 클래스의 위치

-개발버전(이클립스)
C:\Java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost
=> 배포(deployment)

* 프로젝트와 동일한 디렉터리가 하나 있다. (jsp가 실제로 실행되는 디렉토리이다.)
C:\Java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
	* 파일이 upload를하면 새로고침이 하게 되고 위 디렉터리에 upload가 된다.
	 반면 서비스버전은 하나의 디렉터리에서만 upload 및 실행이된다.


-서비스버전
C:\Java\apache-tomcat-9.0.41\work\Catalina\localhost

 

먼저 다이나믹웹프로젝트를 새로 만들 때 web.xml을 포함해서 만들고 자바리소스 디렉터리에 아래와 같이 만든다.

-servletEx01.java

package servlet;

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

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

public class ServletEx01 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//쓰고 싶은 html 문서를 작성한다.
		
		//html로 보낼것이고 문자는 utf8
		resp.setContentType( "text/html;charset=utf-8" );
		PrintWriter out = resp.getWriter();
		out.println( "<!doctype html>" );
		out.println( "<head>" );
		out.println( "<meta charset='utf-8'/>" );
		out.println( "</head>" );
		out.println( "<body>" );
		out.println( "Hello Servlet" );
		out.println( "</body>" );
		out.println( "</html>" );
		
		out.close();
	}
}

-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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletEx01</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>servlet01</servlet-name>
  	<servlet-class>servlet.ServletEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name>
  	<url-pattern>/servlet01</url-pattern>
  </servlet-mapping>
  
</web-app>

 

web.xml에서 url-pattern을 아래와 같이 바꾸면 /servlet01/ 아래 어떤 경로를 부르든 servlet01을 부른다는 의미이다.

<?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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletEx01</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>servlet01</servlet-name>
  	<servlet-class>servlet.ServletEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name>
  	<url-pattern>/servlet01/*</url-pattern>
  </servlet-mapping>
  
</web-app>

 

17.2.4 서블릿의 메서드

p505

서블릿 메서드

init()		초기화
destroy()		소멸
service()		
	get
	poset
package servlet;

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

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

public class ServletEx01 extends HttpServlet {
	
	@Override
	public void init() throws ServletException {
		//처음 톰캣 켜질때만 작동
		System.out.println( "init(ServletConfig config) 호출" );
	}
	
	@Override
	public void destroy() {
		//톰캣이 꺼질때만 작동
		System.out.println( "destroy() 호출");
	}
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//쓰고 싶은 html 문서를 작성한다.
		
		//html로 보낼것이고 문자는 utf8
		resp.setContentType( "text/html;charset=utf-8" );
		PrintWriter out = resp.getWriter();
		out.println( "<!doctype html>" );
		out.println( "<head>" );
		out.println( "<meta charset='utf-8'/>" );
		out.println( "</head>" );
		out.println( "<body>" );
		out.println( "Hello Servlet" );
		out.println( "</body>" );
		out.println( "</html>" );
		
		out.close();
	}
}

 

 

이번에는 get과 post방식을 이용해서 서블릿클래스 만들고 jsp를 실행해보자.

-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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletEx01</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>servlet01</servlet-name>
  	<servlet-class>servlet.ServletEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name>
  	<url-pattern>/servlet01/*</url-pattern>
  </servlet-mapping>
  <!-- 여기서부터 -->
  <servlet>
  	<servlet-name>servlet02</servlet-name>
  	<servlet-class>servlet.ServletEx02</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet02</servlet-name>
  	<url-pattern>/servlet02</url-pattern>
  </servlet-mapping>
  
</web-app>

-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="./servlet02" method="get">
<input type="submit" value="get 전송"/>
</form>

<form action="./servlet02" method="post">
<input type="submit" value="post 전송"/>
</form>

</body>
</html>

-ServletEx02.java

package servlet;

import java.io.IOException;

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

public class ServletEx02 extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println( "doGet() 호출" );
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println( "doPost() 호출" );
	}
}

 

get과 post방식이 아니라 통합방식으로 만들어보자.

-ServletEx02.java

package servlet;

import java.io.IOException;

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

public class ServletEx02 extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println( "doGet() 호출" );
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println( "doPost() 호출" );
	}
	
	private void doProcess( HttpServletRequest req, HttpServletResponse resp) {
		try {
			System.out.println( "doProcess() 호출" );
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

데이터도 넘겨보자.

-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="./servlet02" method="get">
data1 <input type="text" name="data1"/>
<input type="submit" value="get 전송"/>
</form>

<form action="./servlet02" method="post">
data2 <input type="text" name="data2"/>
<input type="submit" value="post 전송"/>
</form>

</body>
</html>

-ServletEx02.java

package servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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

public class ServletEx02 extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println( "doGet() 호출" );
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println( "doPost() 호출" );
	}
	
	private void doProcess( HttpServletRequest req, HttpServletResponse resp) {
		try {
			req.setCharacterEncoding( "utf-8" );
			String data1 = req.getParameter( "data1" );
			String data2 = req.getParameter( "data2" );
			
			System.out.println( "doProcess() 호출" );
			System.out.println( "data1 : " + data1 );
			System.out.println( "data2 : " + data2 );
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

 

 

실습) 구구단 출력하기

localhost:8080/ServletEx01/gugudan01을하면

그 창에 구구단 테이블이 만들어지도록 해보자.

결과는 아래와 같다.

코드

-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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletEx01</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>servlet01</servlet-name>
  	<servlet-class>servlet.ServletEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name>
  	<url-pattern>/servlet01/*</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>servlet02</servlet-name>
  	<servlet-class>servlet.ServletEx02</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet02</servlet-name>
  	<url-pattern>/servlet02</url-pattern>
  </servlet-mapping>
  <!-- 아래 부분만 -->
  <servlet>
  	<servlet-name>servlet03</servlet-name>
  	<servlet-class>servlet.GugudanEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet03</servlet-name>
  	<url-pattern>/servlet03</url-pattern>
  </servlet-mapping>
  
</web-app>

-GugudanEx01.java

package servlet;

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

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

public class GugudanEx01 extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	private void doProcess( HttpServletRequest req, HttpServletResponse resp) {
		try {
			req.setCharacterEncoding( "utf-8" );
			
			String startDan = req.getParameter( "startDan" ) == null ? "" : req.getParameter( "startDan" );
			String endDan = req.getParameter( "endDan" ) == null ? "" : req.getParameter( "endDan" );
			
			resp.setContentType( "text/html;charset=utf-8" );
			
			StringBuffer html = new StringBuffer();
			html.append( "<!doctype html>" );
			html.append( "<head>" );
			html.append( "<meta charset='utf-8'/>" );
			html.append( "</head>" );
			html.append( "<body>" );
			html.append( "<form action='./servlet03' method='post'>" );
			html.append( "시작단 : <input type='text' name='startDan' />" );
			html.append( "-" );
			html.append( "끝단 : <input type='text' name='endDan' />" );
			html.append( "&nbsp&nbsp <input type='submit' value='구구단 출력'/>" );
			html.append( "</form>" );
			html.append( "<br><br>" );
			
			if( !startDan.equals("") && !endDan.equals("") ) {
				int iStartDan = Integer.parseInt( startDan );
				int iendDan = Integer.parseInt( endDan );
				
				html.append( "<table border='1' width='800'>" );
				for( int i=iStartDan; i<=iendDan; i++ ) {
					html.append( "<tr>" );
					for( int j=1; j<=9; j++ ) {
						html.append( "<td>" + i + "X" + j + "=" + (i*j) + "</td>" );
					}
					html.append( "</tr>" );
				}
				html.append( "</table>" );
			}
			
			html.append( "</body>" );
			html.append( "</html>" );
			
			PrintWriter out = resp.getWriter();
			out.println( html );
			out.close();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

실습) 우편번호 검색후 출력하기

먼저 서블릿 이름은 zipsearch01이라고 하고 서블릿 클래스 이름은 servlet패키지에 ZipcodeSearchEx01이라한다.

또한 get과 post방식이 아닌 통합방식으로 구현을하고

데이터베이스 연결은 커넥션풀로 연결한다.

결과는 아래와 같이 나오게 하면된다.

 

내코드

-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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletEx01</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>zipsearch01</servlet-name>
  	<servlet-class>servlet.ZipcodeSearchEx01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>zipsearch01</servlet-name>
  	<url-pattern>/zipsearch01</url-pattern>
  </servlet-mapping>
  
</web-app>

-ZipcodeSearchEx01.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ZipcodeSearchEx01 extends HttpServlet {
	private DataSource dataSource = null;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doProcess(req, resp);
	}
	
	private void doProcess( HttpServletRequest req, HttpServletResponse resp) {
		try {
			//입력부분
			req.setCharacterEncoding( "utf-8" );
			String dong = req.getParameter( "dong" ) == null ? "" : req.getParameter( "dong" );
			
			//출력부분
			resp.setContentType( "text/html;charset=utf-8" );
			StringBuffer html = new StringBuffer();
			
			html.append( "<!doctype html>" );
			html.append( "<head>" );
			html.append( "<meta charset='utf-8'>" );
			html.append( "</head>" );
			html.append( "<body>" );
			
			html.append( "<form action='' method='post'>" );
			html.append( "동이름 <input type='text' name='dong' />" );
			html.append( "<input type='submit' value='우편번호 검색' />" );
			html.append( "</form>" );
			html.append( "<br><br><hr>" );
			
			//데이터베이스 연결후 우편번호 검색 (커넥션 풀 이용)	
			//dong이 ""가 아니면 조건문 안에 코드 실행
			if ( !dong.equals("") ) {
				Context initCtx = new InitialContext();
				Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
				this.dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb1" );
				
				Connection conn = null;
				PreparedStatement pstmt = null;
				ResultSet rs = null;
				
				try {
					conn = dataSource.getConnection();
					
					String sql = "select * from zipcode where dong like ?";
					pstmt = conn.prepareStatement(sql);
					pstmt.setString(1, dong+"%");
					rs = pstmt.executeQuery();
					
					html.append( "<table border='1' width='900' >" );
					while ( rs.next() ) {
						html.append( "<tr width='100'>" );
						html.append( "<td>"+ rs.getNString(1)+"</td>" );
						html.append( "<td>"+ rs.getNString(2)+"</td>" );
						html.append( "<td>"+ rs.getNString(3)+"</td>" );
						html.append( "<td>"+ rs.getNString(4)+"</td>" );
						html.append( "<td>"+ rs.getNString(5)+"</td>" );
						html.append( "<td>"+ rs.getNString(6)+"</td>" );
						html.append( "<td>"+ rs.getNString(7)+"</td>" );
						html.append( "</tr>" );
					}
					html.append( "</table>" );
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					if ( rs != null ) try { rs.close(); } catch ( SQLException e ) {}
					if ( pstmt != null ) try { pstmt.close(); } catch ( SQLException e ) {}
					if ( conn != null ) try { conn.close(); } catch ( SQLException e ) {}
				}
			}
			
			html.append( "</body>" );
			html.append( "</html>" );
			
			PrintWriter out = resp.getWriter();
			out.println( html );
			out.close();
			
		} catch (UnsupportedEncodingException e) {
			System.out.println( "[error]: " + e.getMessage() );
		} catch (IOException e) {
			System.out.println( "[error]: " + e.getMessage() );
		} catch (NamingException e) {
			System.out.println( "[error]: " + e.getMessage() );
		} 
	}
}

 

 

728x90
반응형
Comments