티스토리 뷰

1. 파일의 위치

 : rc/main/webapp ( 우리가 생성한 웹어플리케이션의 top 폴더 )
 : rc/main/webapp/WEB-INF/
                                   web.xml (웹어플리케이션의 배포설정파일)
                                   /classes : 모든 컴파일된 .class파일과 resource 파일들 저장
                                   /lib : 모든 의존성 라이브러리 .jar 파일들을 저장
                                   /tlds : 소위 태그 라이브러(tag library)파일들을 저장
 : rc/main/webapp/  : 정적인 문서파일(.html, .css, .js, 이미지파일등)들을 저장


[ 1. 전송 파라미터 다루기 ] (****)

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;

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 lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@NoArgsConstructor
@Log4j2

@WebServlet( name = "Hello3",  // + urlPatterns는 String[] ( 스트링타입의 배열 )이다.
		urlPatterns = { "/xxx", "/yyy" } ) // mapping된 url이 2개이다.
public class Hello3Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		//================================================================
		// HTTP Request 메시지로부터, 전송 파라미터들을 얻어내기 위해서는 다음과 같이 한다.
		//================================================================
		
		// 전송값이 1개일때 사용하는 방법
		String name = req.getParameter("name"); // name이란 이름의 전송파라미터의 값을 추출
		String age = req.getParameter("age"); // age이란 이름의 전송파라미터의 값을 추출
		
		//================================================================
		
		// 값이 여러개일때 사용하는 방법
//		String hobby = req.getParameter("hobby"); // hobby이란 이름의 전송파라미터의 값을 추출
		String[] hobby = req.getParameterValues("hobby");
		
		//================================================================
		
		// 값 확인
		log.info("\t + name : {}, age : {} ", name, age); // + name : hehehehehe, age : 1999999 
		log.info("\t + hobby : {}", Arrays.toString(hobby)); // + hobby : [1, 3]
		
		//================================================================
		
		// 전송 파라미터의 이름 출력
		Enumeration<String> parameterNames = req.getParameterNames();
		log.info("\t + paraNames : {}", parameterNames);
		
		while(parameterNames.hasMoreElements()) {
			String names = parameterNames.nextElement();
			log.info("\t + name : {}", names);
		} // while
		
		// + name : name, + name : age, + name : hobby로 출력
		
		//================================================================
		
		// Map형태로 출력하기
		
//		@Cleanup("clear") // 이 Map 객체는 읽기 전용이기때문에, clear시키면 안된다!!
		Map<String, String[]> map = req.getParameterMap(); // Map<String, String[]>로 틀이 잡혀있다.
		log.info("\t + map : {}", map);
		
		// + map : {name=[hehehehehe], age=[1999999], hobby=[1, 3]}로 출력
		
		//================================================================
		
		// Map 객체 중 hobby라는 키를 가지고 있는 값을 출력
		log.info("\t + map : {}, hobby : {} ", map, map.get("hobby"));
		
		// + map : {name=[hehehehehe], age=[1999999], hobby=[1, 3]}, hobby : [1, 3] 로 출력
		
		//================================================================
		
		// 문자 기반의 출력 스트림
		PrintWriter out =  res.getWriter();
		out.println("<h1>World!!!</h1>");
		out.println("<h3>name : " + name + "</h3>");
		out.println("<h3>age : " + age + "</h3>");
		
		//================================================================
		
		// 값이 여러개일때
		out.println("<h3>hobby : " + Arrays.toString(hobby) + "</h3>");
		
		// + 값이 없을 때에는 null값이 들어가게 된다.
		// + 값이 1개가 아닌 여러개일 경우에는 getParameter를 사용하면, 하나만 들어가고 나머지는 들어가지 않는다.
		// + 값이 여러개일 경우에는 getParameterValues를 사용해야 한다.
		
		//================================================================
		
		// 자원해제
		out.flush();
		out.close();
		
		//================================================================
		
	} // service

} // end class

[ 2. Servlet의 라이프사이클 ] (*)

 

package org.zerock.myapp;

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

import javax.servlet.ServletConfig;
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 lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/Lifecycle")
public class LifecycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//================================================================
       
	@Override
	public void init(ServletConfig config) throws ServletException {
		
		log.trace("init({}) inovked.", config);
		
	} // init : init은 매개변수가 있는 init과 매개변수가 없는 init이 있다.
	
	// + 하지만 init으로 초기화하기 위해서는 매개변수가 있는 init을 사용하는 것이 좋다.
	
	//================================================================

	@Override
	public void destroy() {
		log.trace("destory() invoked.");
	} // destroy : 쓰레드가 파괴되기 직전에 실행된다.
	
	//================================================================

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		log.trace("service(req, res) invoked.");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<h1>LifecycleServlet</h1>");
		out.flush();
		
	} // service
	
	//================================================================

} // end class

[ 3. Servlet의 라이프사이클 응용 ] (***)

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;

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

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet(
		urlPatterns = { "/InitParamServlet" }, 
		initParams = { 
				@WebInitParam(name = "jdbcUrl", value = "jdbc:oracle:thin:@db000000_high?TNS_ADMIN=C:/opt/OracleCloudWallet/ATP"), 
				@WebInitParam(name = "user", value = "hr"), 
				@WebInitParam(name = "pass", value = "Oracle00000")
		})
public class InitParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private Connection conn;
	
	//================================================================
       
	@Override
	public void init(ServletConfig config) throws ServletException {
		
		log.trace("init({}) inovked.", config);
		
		String jdbcUrl = config.getInitParameter("jdbcUrl");
		String user = config.getInitParameter("user");
		String pass = config.getInitParameter("pass");
		
		log.trace("\t + jdbcUrl : {}, user : {}, pass : {}", jdbcUrl, user, pass);
		
		try {
			
			Class.forName("oracle.jdbc.OracleDriver");
			
			// JDBC Connection을 생성하여, 필드에 저장
			// => 이것이 우리가 init 메소드에서 할 초기화 작업이다.
			
			this.conn = DriverManager.getConnection(jdbcUrl, user, pass);
			log.info("\t + conn : {}", conn);
			
		}catch (Exception e) {
			throw new ServletException(e); // 예외가 발생하면 ServletException예외로 던져준다.
		} // try - catch
		
	} // init
	
	//================================================================

	@Override
	public void destroy() {
		log.trace("destory() invoked.");
		
		try { if ( this.conn != null ) this.conn.close(); }
		catch(Exception e) { ;; } // try - catch
		
	} // destroy
	
	//================================================================

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		try {
			
			Statement stmt = conn.createStatement();
			
			String sql = "SELECT current_date FROM dual";
			ResultSet rs = stmt.executeQuery(sql);
			Timestamp ts = null;
			
			try ( stmt; rs; ) {
				rs.next();
				ts = rs.getTimestamp("current_date");
			} // try - with - resources
			
//			================================================
			
			// 1. 응답 데이터의 유형을 설정 (***)
			res.setContentType("text/html; charset=utf8");
			
			// 2. 문자기반
			@Cleanup
			PrintWriter out = res.getWriter();
			
			out.println("<h1>Init Timestamp</h1>");
			out.println("<p>Current time : " + ts + "</p>");
			out.flush();
			
		} catch(Exception e) {
			throw new IOException(e);
		} // try - catch
		
	} // service
	
	//================================================================

} // end class

[ 4. PostConstruct / PreDestroy ]

 

package org.zerock.myapp;

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

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletConfig;
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 lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

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

	@Override
	public void init(ServletConfig config) throws ServletException {
		log.trace("init({}) inovked.", config);
	} // init
	
	// ===========================================

	@Override
	public void destroy() {
		log.trace("destory() invoked.");
	} // destroy
	
	// ===========================================
	
	@PostConstruct
	void postConstruct() {
		log.trace("postConstruct() invoked.");
	} // postConstruct : init과 같은 기능
	
	@PreDestroy
	void preDesrtoy() {
		log.trace("preDesrtoy() invoked.");
	} // preDesrtoy : Destroy와 같은 기능
	
	// ===========================================

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		log.trace("service(req, res) invoked.");
		
		// ===========================================
		
		// 1. 응답 데이터의 유형을 설정 (***)
		res.setContentType("text/html; charset=utf8");
		
		// 2. 문자기반
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<h1>PostpreServlet</h1>");
		out.flush();
		
		// ===========================================
		
	} // service
	
	// ===========================================
	// 실행 순서
	
	// 1. postConstruct() invoked.
	// 2. init() invoked.
	// 3. service(req, res) invoked.
	// 4. destroy() invoked.
	// 5. predesrtoy() invoked.
	// ===========================================

} // end class

[ 5. 로그인 폼 ]

 

<!DOCTYPE html>

<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

    <!-- 정적 문서파일은 webapp 파일 밑에 생성해야 한다. -->
</head>

<body>
    <h1>getParameter 실습</h1>

    <form action="Login" method="get">

        <fieldset>

            <legend>로그인 폼</legend>
            
            <ul>
                <li>
                    <label for="userid">아이디</label>
                    <input type="text" name="userid">
                </li>

                <li>
                    <label for="password">비밀번호</label>
                    <input type="password" name="password">
                </li>

                <li><input type="submit" value="전송"></li>
            </ul>
        </fieldset>
    </form>
</body>

</html>
728x90
댓글
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항