티스토리 뷰
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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 87일차 - ServletContext (*****) (0) | 2022.07.01 |
---|---|
KH 86일차 - Servlet 3 ( 파라미터 값 가지고 오기,초기화 파라미터 ) (***) (0) | 2022.06.30 |
KH 84일차 - Servlet 생성 (****) (0) | 2022.06.28 |
KH 83일차 - Driver SPY / junit (0) | 2022.06.27 |
KH 82일차 - WAS (0) | 2022.06.24 |
댓글