web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>EUC-KR</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean name="/hello.htm"
class="test.HelloController"/>
<bean name="authenticator"
class="test.Authenticator"/>
<bean name="/login.htm"
class="test.LoginFormController"
p:authenticator-ref="authenticator"
p:commandClass="test.LoginCommand"
p:commandName="loginCommand"
p:successView="loginSuccess"
p:formView="loginForm" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
loginForm.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>로그인 폼</title>
</head>
<body><center><br></br>
<form action="login.htm" method="post">
Course
<select name="course">
<c:forEach var="course" items="${courses}">
<option value="${course}">${course}</option>
</c:forEach>
</select>
<p>
ID: <input type="text" name="id" value="${loginCommand.id}" onclick="this.value='';"><br>
PWD: <input type="text" name="pwd" value="${loginCommand.pwd}" onclick="this.value='';"><br>
<input type="submit" value="로그인">
</form>
</center>
</body>
</html>
test.LoginFormController.java
package test;
import java.util.*;
import javax.servlet.http.*;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.*;
/* SimpleFormController클래스는 속성으로 successView, formView를 가지고 있기 때문에
* 폼데이터 검증에 성공하면 successView로 등록된 JSP를 이용하여 성공 메시지출력할 수 있고,
* 검증에 실패하면 formView로 등록된 JSP를 출력하여 다시 폼을 보여 줄 수 있다.
*/
public class LoginFormController extends SimpleFormController {
/*회원인증을 위해 개발자가 정의한 클래스*/
private Authenticator authenticator;
/*DI용 메소드*/
public void setAuthenticator(Authenticator authenticator) {
this.authenticator = authenticator;
}
@Override
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
System.out.println("onSubmit()");
LoginCommand cmd = (LoginCommand) command;
try{
/* 회원인증에 실패하면 아래의 메소드는 Exception을 발생하도록 되어있다*/
authenticator.authenticate(cmd.getId(), cmd.getPwd());
ModelAndView mav = new ModelAndView();
mav.setViewName(getSuccessView());
mav.addAllObjects(errors.getModel());
return mav; // 회원인증에 성공하면 successView가 화면에 출력된다
/*위에서 리턴한 데이터는 successView에서 접근할 수가 있다.
* successView에서 커맨드객체에 접근하려면 설정파일에 등록한 "commandName"속성의 값을 이용하면 된다.
* 즉, request.getAttribute("loginCommand"), ${loginCommand.id}등을 사용하면 된다.
*/
}catch(Exception e){
System.out.println("catch()");
}
return showForm(request, response, errors);//회원인증에 실패시 formView가 화면에 출력된다.
}
/*
* (non-Javadoc)
* @see org.springframework.web.servlet.mvc.SimpleFormController#referenceData(javax.servlet.http.HttpServletRequest)
* showForm() 메소드는 referenceData()를 호출해서 폼 페이지에서 보여주고자 하는 참조 데이터(주로 셀렉트박스, 체크박스 같은 유형)를 ModelAndView에 저장한다.
* formView에서는 Model 데이터를 바탕으로 폼에 필요한 데이터를 채워서 표시한다.
*/
@Override
protected Map referenceData(HttpServletRequest request) throws Exception {
/* 입력폼의 콤보박스를 구성하는 리스트를 생성한다*/
//System.out.println("referenceData()");
List<String> course = new ArrayList<String>();
course.add("Java Developer");
course.add("Struts Programmer");
course.add("Spring Professional");
Map map = new HashMap();
map.put("courses", course);
return map;
}
/*
* (non-Javadoc)
* @see org.springframework.web.servlet.mvc.AbstractFormController#formBackingObject(javax.servlet.http.HttpServletRequest)
* formBackingObject()는 GET방식(폼 출력요청)이나 POST방식(폼 전송)을 가리지 않고 항상 실행되며,
* 커맨드객체를 생성하여 뷰에서 사용될 수 있도록 한다. 그러므로 개발자가 이 메소드를 오버라이드하여
* GET방식 요청일 경우에는 폼에서 디폴트로 채워져야 하는 필드의 기본 데이터를 준비하는 용도로 사용하면 되고,
* POST방식(폼을 전송한 경우)일 경우에는 커맨드클래스의 객체를 생성하여 리턴해주면 된다.
* 이 메소드에서 리턴된 데이터를 뷰에서 사용하려면 설정파일에 등록한 "commandName" 속성의 값을 key로 사용하면 된다.
* 즉, request.getAttribute("loginCommand")라고 하거나, ${loginCommand.id}등을 사용하면 된다.
*
*/
@Override
protected Object formBackingObject(HttpServletRequest request)
throws Exception {
if(!this.isFormSubmission(request)){ // GET방식일 경우...
//System.out.println("formBackingObject()-GET");
LoginCommand cmd = new LoginCommand();
cmd.setId("6자이상 영문");
cmd.setPwd("영문, 숫자 혼용 6자이상");
return cmd;
}else{ // POST방식일 경우
//System.out.println("formBackingObject()-POST");
return super.formBackingObject(request);
}
}
}
loginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>로그인 성공</title>
</head>
<body>
<center>
로그인 성공<br></br>
${loginCommand.id}<br></br>
${loginCommand.pwd}<br></br>
</center>
</body>
</html>