2013년 5월 29일 수요일

[전자정부프레임워크] 중복 저장 막기위한 @SessionAttributes 지정 후 HttpSessionRequiredException handling

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>

댓글 없음:

댓글 쓰기