본문 바로가기

Servlet/CounterServlet MVC

Counter기능 MVC 예제

Count 기능을 구현할 때 2개의 Servlet 과 1개의 클래스로 MVC 패턴을 적용한 예제

Controller (CounterServer.java)

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;

 public class CounterServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   private CountModel model;
  
 public void init(){
  model = new CountModel(this);
 }
 
 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setAttribute("count", String.valueOf(model.getCount()));
  request.getRequestDispatcher("/CountView").forward(request, response);
 }
}


Model (CountModel.java)

import java.io.*;
import javax.servlet.http.*;

public class CountModel {
 
 private HttpServlet servlet;
 private String counterPath;
 private long cnt;
   
 private DataInputStream din;
 private DataOutputStream dout;
 private FileInputStream fin;
 private FileOutputStream fout; 

   
 public CountModel(HttpServlet servlet) {
  this.servlet = servlet;
  counterPath = servlet.getServletContext().getRealPath("/WEB-INF/count.dat");
  File f = new File(counterPath);
  if(!f.exists()){
   createCounterFile();
  }
 }
 
 public long getCount() throws IOException {
  if(cnt==0) cnt = getCountFromFile()+1;
  else{
   cnt++;
   if(cnt%5==0) saveCount();
  }
  return cnt;
 }

 private long getCountFromFile() throws IOException {
   try{
   fin = new FileInputStream(counterPath);
   din = new DataInputStream(fin);
   long cnt = din.readLong();
   din.close();

   return cnt;
  }catch(FileNotFoundException fe){
   try{
    if(din!=null)din.close();
   }catch(Exception e){}
   createCounterFile();
   return 0L;
  }catch(IOException ioe){
   throw ioe;
  }
 }
 
 private void createCounterFile(){
  try{
   fout = new FileOutputStream(counterPath);
   dout = new DataOutputStream(fout);
   dout.writeLong(0L);
   dout.close();
  }catch(Exception e){}
 }
 
 private void saveCount(){
  try{
   dout = new DataOutputStream(new FileOutputStream(counterPath));
   dout.writeLong(cnt);
   dout.close();
  }catch(FileNotFoundException fe){
  }catch(IOException ie){}
 }
}


View (CountView.java)

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 public class CountView extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;

 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html;charset=KSC5601");
  PrintWriter out = response.getWriter();
  out.println("<html><body>");
  out.println("Count:"+request.getAttribute("count"));
  out.println("</body></html>");  
 }          
}