SessionAttribute
1. @SessionAttributes
model attribute를 session에 저장, 유지할 때 사용하는 어노테이션
사용목적 : 연속으로 client 로 부터 submit 이 날라오는 경우 중복 submit 을 방지할 때 이용
Controller 의 메소드에서 SessionStatus의 isComplete() 확인을 통해 Session내에 지정된 model 이 있는지 체크/중복(실행) 가능.
2. Session 유지기간, 초기화 방법
유지기간 : SessionStatus.setComplete()을 실행하기 전까지는 Session에서 내부의 데이터를 유지
초기화 방법 : SessionStatus.setComplete()을 실행하면 Controller에서 선언해둔 SssionAttribute에 등록된 form이 초기화
* 중복 저장 회피 방법
Data를 Add한 후에 redirect로 List.do 화면으로 이동
* List 화면으로 넘기는 parameter가 존재해서 forward로 List.do 화면으로 이동하고 싶을 때
중복 저장 Exception 발생 과정
(저자 혼자만의 정리, 그냥 이렇겠거니 혼자만의 생각)
- 중복 저장 전, setComplete() method 호출로 인해 Session 내 form 정보 초기화
- addData.do를 다시 실행
- 저장을 위한 SessionAttribute로 지정한 form Data 접근
- 초기환 된 데이터로 인해 HttpSessionRequiredException 발생
- org.springframework.web.servlet.handler.SimpleMappingExceptionResolver에 의해 사용자가 지정한 errorPage로 이동 (페이지 이동 설정파일 : dispatcher-servlet.xml)
Exception handling 방법 - errorPage에서 어떤 Form에 의해서 Exception이 발생했는지에 따라 각 화면 List.do로 재 forward.
(이것 또한 지극히 혼자만의 생각. 이렇게 하면 될 것 같아서...;;)
구현 방법
1. dispatcher-servlet.xml에 HttpSessionRequiredException 추가
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="cmmn/bizError"/>
<property name="exceptionMappings">
<props>
<prop key="org.springframework.dao.DataAccessException">cmmn/dataAccessFailure</prop>
<prop key="org.springframework.transaction.TransactionException">cmmn/transactionFailure</prop>
<prop key="egovframework.rte.fdl.cmmn.exception.EgovBizException">cmmn/bizError</prop>
<prop key="org.springframework.security.AccessDeniedException">cmmn/accessDenied</prop>
<prop key="org.springframework.web.HttpSessionRequiredException">cmmn/httpsession</prop>
</props> <!-- 추가한 부분 -->
</property>
</bean>
2. httpsession.jsp 구성
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set value="${exception.message}" var="error"></c:set>
<c:if test="${fn:contains(error,'sampleVO')}">
<jsp:forward page="/sample/egovSampleList.do"/>
</c:if>