JAVA WEB 공부 4일차

머리터지기 일보직전·2022년 9월 19일
0

JAVA WEB

목록 보기
4/8

PreparedStatement 인터페이스 이용하여 회원 정보 조회 실습

  • Statement 인터페이스를 상속하므로 지금까지 사용한 메서드를 그대로 사용
  • Statement 인터페이스에 대해서 PreparedStatement인터페이스는 컴파일된 SQL문을 DBMS에 전달하여 성능 향상시킴
  • 실행하려는 SQL문에 '?'를 넣을수 있으므로 '?'의 값만 바꾸어 손쉽게 설정할 수 있어 Statement보다 SQL문 작성하기가 더 간단함

DataSource 이용해 데이터베이스 연동

-> 기존 데이터베이스 연동 방법의 문제점 : 애플리케이션에서 데이터베이스 연결 과정에서 시간이 너무 많이 걸린다
-> ConnectionPool 등장 : 애플리케이션 실행 시 미리 Connection 객체를 생성한 후, 미리 데이터베이스 연결을 맺는다. 애플리케이션은 데이터베이스 연동 작업 발생 시 이 Connection 객체를 이용해서 작업한다

  • JNDI(Java Naming and Directory Interfate)란 필요한 자원을 키/값 쌍으로 저장한 후 필요할때 키를 이용해 값을 얻는 방법

톰캣의 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에서 공유 해서 사용
  • 바인딩 관련 메서드
  • setAttribute(String name, Object obj) : 데이터를 각 객체에 바인딩한다.
  • getAttribute(String name) : 각 객체에 바인딩 된 자원을 name으로 가져옴
  • removeAttribute(String name) : 각 객체에 바인딩 된 자원을 name으로 제거

! 브라우저를 거쳐서 서블릿 전달하는 방식은 바인딩은 안된다. 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>");

0개의 댓글