프로그래밍/JSP & Servlet
Service()가 실행될때마다 카운터 쌓기
김마농
2012. 4. 19. 10:36
Service()가 실행될때마다 카운터 쌓기
1. 우선 클래스를 만들어준다.

2. 다음과 같이 코딩한다.
이 코딩은 서비스가 요청될때마다 카운터가 하나씩 쌓여서 화면에 출력하는걸 의미한다.

3. web.xml도 다음과 같이 코딩해준후 서버를 가동시킨다.

4. http://127.0.0.1:8088/myweb/counter로 들어가서 다음과 같이 나오는지 확인한다.

5. 새로고침 할때마다 서비스가 요청되어 카운터가 쌓이는걸 볼 수 있다.

6. 여러번 새로고침한 상황이다.

하지만 위와 같이 코딩하게 되면 서버를 재 실행하게 되면 카운터는 인스턴스 변수이기 때문에 초기화 된다.
그래서 외부자원을 이용해야 하지만 항상 서비스가 요청될때마다 읽고 쓰기가 되면 계속 작업을 하기 때문에 버벅거리게 된다.
이 문제를 해결하기 위해 destroy()에 저장하고 init()때 읽어 들이기를해야 한다.
1. Init()와 destroy()를 활용하여 코딩하기로 한다.
2. 우선 Init()를 코딩한다.
- init()에서는 파일을 읽어서 그 파일안에 있는 값을 로드하는 기능을 한다.

3. 그다음 Destroy()를 코딩한다.
- destroy()는 visitcount를 저장하는 역할을 하게 된다.

4. 그 다음 서버를 가동시키고 http://127.0.0.1:8088/myweb/counter를 실행하면 다음과 같이 나와야 한다.
밑 사진은 이미 22번째까지 새로고침을 한 것이다.

5. 이제 서버를 재가동하여 값이 제대로 저장되어 불러오는지 테스트한다.



6. 재가동하여 이전에 불러온값 +1이 적용되면 성공적으로 코딩한 것이다.
CounterServlet 소스코드
public class CounterServlet extends HttpServlet {
FileReader fr = null;
PrintWriter pw = null;
private int visitCount;
private String counter = "D:\\apc\\apache-tomcat-6.0.35\\counter.dat";
public void init() {
try {
fr = new FileReader(counter);
visitCount = fr.read();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("카운터");
out.println("");
visitCount++;// 카운터의 값을 1증가
out.println("당신은" + visitCount + "번째 방문자입니다.");
out.println("");
}
public void destroy() {
try {
pw = new PrintWriter(counter);
pw.write(visitCount);
} catch (IOException e) {
e.printStackTrace();
} finally {
pw.close();
}
}
}