이번 실습에서는 학생정보 조회 컨트롤러를 서블릿으로 구현 한다.

실습을 통해 서블릿 컨트롤러를 구현하고 웹 애플리케이션 개발에 활용할 수 있다.

실습 내용

다음과 같이 jwprj.student 패키지로 StudentController 서블릿 클래스를 생성한다.

package jwprj.student;
// import 생략
@WebServlet(name="StudentServlet", urlPatterns="/student")
public class StudentController extends HttpServlet {
	
    private static final long serialVersionUID = 1L;	
    private StudentService studentService = new StudentService();

    private void processRequest(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException{

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException{

        processRequest(request, response);
    }

    @Override
    protected void doPost(
    HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        processRequest(request, response);
    }
}

이러한 코드 구성의 결과 모든 실행의 중심은 processRequest() 메서드가 된다.

먼저 학생정보 조회를 위해 검색창에서 입력된 id 값을 가지고 온다. 이때 파라미터가 정상적으로 전달되었는지 확인을 위한 null 체크가 필요하며 id를 int 로 변환해야 한다.

String studentID = request.getParameter("id");
if (studentID != null) {
    int id = Integer.parseInt(studentID);
    studentService.getStudent(id)
        .ifPresent(s -> request.setAttribute("student", s));
}

StudentService의 getStudent()메서드는 Optional 타입을 리턴한다. Optional 은 ifPresent() 메서드를 이용해 null 이 아닌경우에만 수행될 코드를 람다식으로 간편하게 처리할 수 있다. 검색된 학생정보가 있을 경우 student라는 이름으로 request 에 저장 한다.

이제 요청을 처리하고 적절한 뷰로 이동시키기만 하면 된다. 여기서는 뷰에서 보여줄 데이터가 있기 때문에 포워딩 방식으로 이동 한다.

RequestDispatcher dispatcher = request.getRequestDispatcher("/student/studentinfo.jsp");
dispatcher.forward(request, response);

먼저 studentSearch.jsp 를 실행하도록 한다.

studentSearch.jsp

1~3 사이의 값을 입력하고 Search 버튼을 누른다. 다음과 같이 컨트롤러가 연동되어 학생정보가 출력되면 성공한 것이다.

studentInfo.jsp

만일 1~3 이외의 값을 입력하면 별도의 에러없이 studentInfo.jsp가 실행되며 대신 출력되는 데이터가 비어있는 상태가 된다.

만일 검색결과가 없다는 메시지를 추가하고 싶다면 studentInfo.jsp에 다음과 같이 EL을 이용해 간단한 메시지 출력이 가능하다.

    <h1>Student Information</h1>
    ${student.id == null? "Student not found !!":""}
    <hr>

studentInfo.jsp

package jwprj.student;
// import 생략..

@WebServlet(name = "StudentServlet", urlPatterns = "/student")
public class StudentController extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private StudentService studentService = new StudentService();

	private void processRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String studentID = request.getParameter("id");
		if (studentID != null) {
			int id = Integer.parseInt(studentID);
			studentService.getStudent(id).ifPresent(s -> request.setAttribute("student", s));
		}

		RequestDispatcher dispatcher = request.getRequestDispatcher("/student/studentInfo.jsp");
		dispatcher.forward(request, response);
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		processRequest(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		processRequest(request, response);
	}
}