'FrameWork/SpringMVC'에 해당되는 글 5건

  1. 2008/10/14 [누워서 하는 스프링 5] 컨트롤러의 종류 -2
SimpleFormController 를 이용한 폼 처리

게시판 글쓰기나 한 페이지로 구성된 회원 가입 등 웹 어플리케이션에는 한 개의 입력 폼을 제공하는 페이지가 많다.
이 때, 사용자는 폼에 값을 입력한 뒤 서버에 전송하게 된다. 폼을 전송할 경우 서버에서는 사용자가 입력한 값을
사용하여 알맞은 처리를 수행한 뒤 올바르게 처리된 경우 결과 화면을 보여주고, 잘못된 값을 입력하였거나, 잘못 처리된 경우
다시 입력 폼을 출력하게 된다.

<bean name="loginController" class="net.utsman.spring.controller.LoginController">
        <property name="authenticator" ref="authenticator" />
        <property name="commandName" value="login"/>
        <property name="commandClass" value="net.utsman.spring.command.LoginCommand" />
        <property name="successView" value="loginSuccess" />
        <property name="formView" value="loginForm" />
    </bean>
<bean name="authenticator" class="net.utsman.spring.business.LoginAuthenticator" />

HTTP GET 요청이 들어올 경우에는 formView 를 통해 지정한 뷰를 보여주며,
(showForm() 메소드를 호출하여 입력 폼 출력을 위한 ModelAndView 객체를 리턴한다.)
POST 요청이 들어올 경우에는 successView 를 총해 지정한 뷰를 보여주게 된다.
(입력 폼 검증을 수행한뒤에 onSubmit() 메서드를 호출하여 클라이언트의 요청을 처리하게 된다.)

Authenticator.java

public interface Authenticator {
  /**
   폼 검증이 실패했을때는 익셥션을 onSubmit() 에 전달하게 한다.
   */
    public void authenticate(String id, String password) throws AuthenticatorException;
}


LoginAuthenticator.java

public class LoginAuthenticator implements Authenticator {
    @Override
    public void authenticate(String id, String password) throws AuthenticatorException {
        if (!id.equals("utsman")) {
            throw new AuthenticatorException("invalid id " + id);
        }
    }
}


LoginController.java

public class LoginController extends SimpleFormController {
    private Authenticator authenticator;

    public void setAuthenticator(Authenticator authenticator) {
        this.authenticator = authenticator;
    }
   
    @Override
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
        LoginCommand login = (LoginCommand)command;
        try {
            authenticator.authenticate(login.getId(), login.getPassword());
            ModelAndView mav = new ModelAndView();
            mav.setViewName(getSuccessView());
            mav.addAllObjects(errors.getModel());
            return mav;
        } catch (AuthenticatorException e) {
            /**
             * 입력 폼 정보를 담고 있는 ModelAndView 객체를 리턴한다.
             */
            return showForm(request, response, errors);
        }       
    }
   
    @Override
/**
입력 폼을 보여줄 때 필요한 정보가 있는 경우에는 referenceData() 메서드를 사용한다.
*/
    protected Map<String, List<String>> referenceData(HttpServletRequest request) throws Exception {
        List<String> loginTypes = new ArrayList<String>();
        loginTypes.add("일반 회원");
        loginTypes.add("기업 회원");
        loginTypes.add("특별 회원");
       
        Map<String, List<String>> reference = new HashMap<String, List<String>>();   
        reference.put("loginTypes", loginTypes);
        return reference;
    }
   
//    @Override
    /**
     * doSubmitAction() 는 예외를 처리하지 않고 http 500 에러로 내보낸다.
     * 로그인 처리시에 예외를 http 500 에러로 내보내지 않고, 입력 폼으로 돌아가게 처리할려고 한다면,
     * onSubmit() 메소드를 오버라이딩하여 구현하면 된다.
     */
//    protected void doSubmitAction(Object command) throws Exception {
//        LoginCommand login = (LoginCommand)command;
//        authenticator.authenticate(login.getId(), login.getPassword());
//    }   
}

loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<form method="post" action="login.do">
    <select>
        <c:forEach var="type" items="${loginTypes}">
            <option>${type}</option>
        </c:forEach>
    </select><br/>
    ID:<input type="text" name="id"/>[utsman]<br/>
    PASSWORD:<input type="text" name="password"/><br/>
    <input type="submit" name="submit"/>
</form>


포스팅에 사용된 예제 소스 보기[서브 버전]
http://zeehastory.googlecode.com/svn/trunk/springmvc

참고 문헌
http://static.springframework.org/spring/docs/2.5.x/reference/introduction.html
최범균의 Spring 2.5 프로그래밍

Posted by utsman 트랙백 0 : 댓글 0