본문 바로가기
교재 실습/자바 웹 개발 워크북

30. 서블릿 초기화 매개변수 (2)

by Jint 2022. 1. 26.

 

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
    	
		...
		//회원 상세 정보 출력
		stmt = conn.createStatement();
		rs = stmt.executeQuery(
		"SELECT MNO,EMAIL,MNAME,CRE_DATE FROM MEMBERS" + 
		" WHERE MNO=" + request.getParameter("no"));	
		rs.next();

		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<html><head><title>회원정보</title></head>");
		out.println("<body><h1>회원정보</h1>");
		out.println("<form action='update' method='post'>");
		out.println("번호: <input type='text' name='no' value='" + request.getParameter("no") + "' readonly><br>"); //회원번호 : 주 키(Primary Key) 칼럼이므로 값 변경 불가능. readonly속성은 값없이 속성 이름만 추가 가능.
		out.println("이름: <input type='text' name='name'" + " value='" + rs.getString("MNAME")  + "'><br>");
		out.println("이메일: <input type='text' name='email'" + " value='" + rs.getString("EMAIL")  + "'><br>");
		out.println("가입일: " + rs.getDate("CRE_DATE") + "<br>");
		out.println("<input type='submit' value='저장'>");
		out.println("<input type='button' value='취소'" + " onclick='location.href=\"list\"'>"); //onclick속성에 자바스크립트로 입력.
		//location : 웹 브라우저의 페이지 이동을 관리하는 자바스크립트 객체
		//href 프로퍼티 : 웹 브라우저가 출력할 페이지의 URL을 설정.
		out.println("</form>");
		out.println("</body></html>");

	} catch (Exception e) {
		throw new ServletException(e);

	} finally {
		try {if (rs != null) rs.close();} catch(Exception e) {}
		try {if (stmt != null) stmt.close();} catch(Exception e) {}
		try {if (conn != null) conn.close();} catch(Exception e) {}
	}
}

회원 상세 정보를 가져오는 쿼리와 요청폼을 만든다. <form>태그의 action속성의 값은 회원 상세 페이지와 동일한 URL인 'update'이다. 즉 입력폼에서 '저장' 버튼을 누르면 현재 페이지와 동일한 /member/update로 요청한다. 다만, method속성이 'post'이기 때문에 서버에 POST 요청을 보낸다.

 

회원 목록 페이지에서 회원 이름을 클릭하면 회원 상세 정보 페이지가 출력된다.

그림 1 (회원 상세 정보 페이지)

 

회원 정보를 변경하는 코드를 MemberUpdateServlet 클래스의 doPost()에 작성한다.

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			//JDBC 드라이버를 로딩하고 데이터베이스 연결 시 서블릿 초기화 매개변수에서 해당 정보 가져와 처리.
			Class.forName(this.getInitParameter("driver"));
			conn = DriverManager.getConnection(
						this.getInitParameter("url"),
						this.getInitParameter("username"),
						this.getInitParameter("password"));
			
			stmt = conn.prepareStatement(
					"UPDATE MEMBERS SET EMAIL=?,MNAME=?,MOD_DATE=now()" //now() : MySQL에서 제공하는 데이터베이스 함수. 현재 날짜와 시간 반환.
					+ " WHERE MNO=?");
			stmt.setString(1, request.getParameter("email"));
			stmt.setString(2, request.getParameter("name"));
			stmt.setInt(3, Integer.parseInt(request.getParameter("no")));
			stmt.executeUpdate();
			
			response.sendRedirect("list");
			
		} catch (Exception e) {
			throw new ServletException(e);
			
		} finally {
			try {if (stmt != null) stmt.close();} catch(Exception e) {}
			try {if (conn != null) conn.close();} catch(Exception e) {}
		}
	}

회원 상세 정보 페이지에서 이름과 이메일을 바꾸고 저장한다(그림 2). 저장 버튼을 클릭하면 자동으로 회원 목록 페이지로 이동하는 '리다이렉트'를 사용한 것을 확인할 수 있다(그림 3).

그림 2 (회원 상세 정보 페이지에서 정보 수정)
그림 3 (회원 목록 페이지)

 

- 어노테이션으로 서블릿 초기화 매개변수 설정

web.xml이 아닌 서블릿 소스 코드에 어노테이션으로 서블릿 초기화 매개변수를 설정한다. 언제라도 바뀔 수 있는 정보는 소스 파일이 아닌 외부 파일에 두어야 해서, 현재 설정은 좋은 방법은 아니다. web.xml에 작성한 MemberUpdateServlet 클래스의 배치 정보를 주석처리한 뒤 MemberUpdateServlet 클래스에 직접 서블릿 배치 정보를 설정하는 어노테이션을 추가한다.

@SuppressWarnings("serial")
/* 애노테이션을 이용하여 서블릿 배치 정보 설정
 * - 서블릿 초기화 파라미터도 애노테이션으로 처리 
 */
@WebServlet(
  urlPatterns={"/member/update"},
  initParams={//initParams : 서블릿 초기화 매개변수를 설정하는 속성, 속성값은 @WebInitParam의 배열
	  @WebInitParam(name="driver",value="com.mysql.jdbc.Driver"), //name="매개변수 이름(필수)", value="매개변수 값(필수)", description="매개변수에 대한 설명(선택)"
	  @WebInitParam(name="url",value="jdbc:mysql://localhost/studydb"),
	  @WebInitParam(name="username",value="study"),
	  @WebInitParam(name="password",value="study")
  }
)
public class MemberUpdateServlet extends HttpServlet {
	...
}

톰캣 서버를 재시작한 뒤 이 서블릿을 실행하면 이전과 똑같이 실행된다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글

32. 필터 사용하기 (1)  (0) 2022.01.29
31. 컨텍스트 초기화 매개변수  (0) 2022.01.28
29. 서블릿 초기화 매개변수 (1)  (0) 2022.01.25
28. 리다이렉트  (0) 2022.01.24
27. 리프래시  (0) 2022.01.23

댓글