PreparedStatement 인터페이스 이용하여 회원 정보 조회 실습
- Statement 인터페이스를 상속하므로 지금까지 사용한 메서드를 그대로 사용
- Statement 인터페이스에 대해서 PreparedStatement인터페이스는 컴파일된 SQL문을 DBMS에 전달하여 성능 향상시킴
- 실행하려는 SQL문에 '?'를 넣을수 있으므로 '?'의 값만 바꾸어 손쉽게 설정할 수 있어 Statement보다 SQL문 작성하기가 더 간단함
DataSource 이용해 데이터베이스 연동
-> 기존 데이터베이스 연동 방법의 문제점 : 애플리케이션에서 데이터베이스 연결 과정에서 시간이 너무 많이 걸린다
-> ConnectionPool 등장 : 애플리케이션 실행 시 미리 Connection 객체를 생성한 후, 미리 데이터베이스 연결을 맺는다. 애플리케이션은 데이터베이스 연동 작업 발생 시 이 Connection 객체를 이용해서 작업한다
톰캣의 DataSource 설정 방법
- JDBC 드라이버를 /WEB-INF/lib 폴더에 설치
- ConnectionPool 기능 관련 jar 파일을 /WEB-INF/lib 폴더에 설치
- CATALINA_HOME₩context.xml에 Connection객체 생성 시 연결할 데이터 베이스정보를 JNDI로 설정
- DAO 클래스에서 데이터베이스 연동 시 JNDI 이름으로 데이터베이스를 연결해서 작업
톰캣 context.xml에 네이밍 해주기
<Resource
name="jdbc/mariadb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mariadb://localhost:3306/test"
username="root"
password="qwer"
maxActive="50"
maxWait="-1"
/>
DAO에 생성자 생성
public MemberDAO() {
try {
Context ctx = new InitialContext();// connectionpool 이용
Context envContext = (Context) ctx.lookup("java:/comp/env");// connectionpool 이용
dataFactory = (DataSource) envContext.lookup("jdbc/mariadb");// connectionpool 이용
} catch( Exception e) {
e.printStackTrace();
}
}
접근할 때
con = dataFactory.getConnection();// connectionpool 이용
서블릿 포워드 기능 사용하기
- 포워드기능 : 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
- 포워드기능 용도 : 요청에 대한 추가 작업을 다른 서블릿에게 수행하게함, 요청에 포함된 정보를 다른 서블릿이나 JSP와 공유함, 요청에 정보를 포함시켜 다른 서블릿에 전달할 수 있음, 모델2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용됨
서블릿의 포워드 방법
redirect 방법 : HttpServletResponse 객체의 sendRedirect()메서드 이용, 웹 브라우저에 재요청 하는 방식
형식 : sendRedirect("포워드할 서블릿 또는 JSP");
Refresh 방법 : HttpServletResponse 객체의 addHeader() 메서드 이용, 웹 브라우저에 재요청하는 방식
형식 : response.addHeader("Refresh",경과시간(초),url=요청할 서블릿 또는 JSP);
location 방법 : 자바스크립트 location 객체의 href 속성 이용, 자바스크립트에서 재요청 하는 방식
형식 : location.href='요청할 서블릿 또는 JSP';
dispatc 방법 : 일반적으로 포워딩 기능을 지칭, 서블릿이 직접 요청하는 방법, RequestDispatcher 클래스의 forward()메서드를 이용
형식 : RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 또는 JSP"));
dis.forward(request,response);
dispatch 실습예제
첫번째 서블릿에서 두번째 서블릿으로 요청할 때
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf-8");
RequestDispatcher dispatch = request.getRequestDispatcher("second4?name=kimseongjin");
// 서블릿 뒤에 ? 로 GET방식으로 값 전달 가능
dispatch.forward(request, response);
}
두번째 요청 받은 서블릿
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
// getParameter로 전달받은 값
out.print("<html><body>");
out.print("dispatch를 이용한 dispatch 실습 <br>" + name);
out.print("</body></html>");
}
바인딩
- 웹 프로그램 실행 시 자원(데이터)를 서블릿 관련 객체에 저장하는 방법
- 주로 HttpServletRequest, HttpSession, ServletContext객체에서 사용
- 저장된 자원은 프로그램 실행 시 서블릿이나 JSP에서 공유 해서 사용
! 브라우저를 거쳐서 서블릿 전달하는 방식은 바인딩은 안된다. request값이 첫번째와 두번째 서블릿은 다르기 때문에
request.setAttribute("address", "성북구 값");
// setAttribute로 바인딩해 값 전달
RequestDispatcher dispatch = request.getRequestDispatcher("second5");
dispatch.forward(request, response);
---------------------------------------------
String address = (String) request.getAttribute("address");
// getAttribute로 전달받은 값을 변수에 저장
out.print("<html><body>");
out.print("dispatch를 이용한 dispatch 실습 <br>" + address);
out.print("</body></html>");