2014-12-28 2 views
2

사용자가 로그인했는지 여부에 따라 특정 요소가 켜지거나 꺼지는 index.jsp 페이지가 있습니다. Struts2의 문자열 비교 <s:if> 태그

<head> 
    <s:set var="accessType" value="GUEST" /> 
    <s:if test="#session.containsKey('currentAccessType')"> 
     <s:set var="accessType" value="#session.currentAccessType" /> 
    </s:if> 
</head> 

<body> 
    <nav> 
     <s:if test="#accessType.equals('GUEST')"> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Login</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:if> 

     <s:else> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Control Panel</a></li> 
       <li><a href="#">Logout</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:else> 
    </nav> 
</body> 

accessType

GUEST로 설정됩니다. 그러나 사용자가 아직 로그인하지 않은 경우에도 else-block을 입력합니다.

문자열 비교에서 오류가 발생 했습니까?

UPDATE :

<head> 
    <s:set var="accessType" value="GUEST" /> 
    <!-- removed session code for testing --> 
</head> 

<body> 
    <nav> 
     <s:if test="#accessType.equals('GUEST')"> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Login</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:if> 

     <s:else> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Control Panel</a></li> 
       <li><a href="#">Logout</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:else> 
    </nav> 

    <br /> 

    Access type is <s:property value="#accessType" />. 
</body> 

문제 :

  1. 조건이 <s:else>를 입력 난 그냥 볼 수있는 index.jsp에서의 세션 부분을 제거하고 지금은 다음과 같습니다
    블록.
  2. 액세스 유형이 인쇄되지 않습니다 (설정되지 않음).
+0

오류는 'NullPointerException' 일 수 있습니다. 그런 다음's : else' 태그를 입력하십시오. 변수를 세션에 어떻게 넣었는지 보여줍니다. –

+0

안녕하세요 @RomanC, 귀하의 검토를 위해 게시물을 편집했습니다. – silver

답변

1

s:if 문에있는 문자열을 비교 중이며 변수에 문자열 값을 사용하면 테스트 파일에서 문제가 없습니다. 따라서 "'GUEST'"이 근무했습니다. 따옴표가없는 경우 OGNL은 큰 따옴표로 값을 파싱하려고 시도하고 값 스택에 GUEST이라는 변수가 없으면 null을 반환합니다. 그런 다음 빈 문자열로 변환 된이 값을 인쇄하려고했습니다. JSP에서 'GUEST'의 값을 하드 코드 했으므로 좋지 않습니다.

솔루션 : JSP로 작성하면 안되는 비즈니스 로직. 액션에서 세션 변수를 정의하고 일부 논리 조건에 따라 변수 값을 다시 정의하는 대신 JSP에서이 세션 변수에 액세스해야합니다.

<head> 
<!-- 
    <s:set var="accessType" value="GUEST" /> 
    removed session code for testing --> 
</head> 

<body> 
    <nav> 
     <s:if test="#session.currentAccessType.equals('GUEST')"> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Login</a></li> 
       <li><a href="http://www.iacademy.edu.ph" target="_blank">Main Site</a></li> 
      </ul> 
     </s:if> 

     <s:else> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Control Panel</a></li> 
       <li><a href="#">Logout</a></li> 
       <li><a href="http://www.iacademy.edu.ph" target="_blank">Main Site</a></li> 
      </ul> 
     </s:else> 
    </nav> 

    <br /> 

    Access type is <s:property value="#session.currentAccessType" />. 
</body> 
+0

나는 'GUEST' 값이 백엔드에서 오게된다. 사용자가 index.jsp를 처음 보는 경우 응용 프로그램에서 게스트인지 어떻게 알 수 있습니까? 이 값을 설정하기 위해 인터셉터를 사용해야합니까? – silver

+1

MVC 프레임 워크의 Struts는 먼저 컨트롤러를 호출 한 다음 뷰를 렌더링하고 JSP를 직접 호출하지 않습니다. 액션 (컨트롤러)에서 세션 변수를 정의합니다. –

+0

이봐, 나는 "컨트롤러 호출"에 대해 생각 해왔다. 나는'web의''에'index.jsp'를 가지고 있습니다.xml'이므로 Eclipse에서 실행할 때마다 JSP로 이동합니다. 컨트롤러를 호출하려면 어떻게해야합니까? – silver

0

나는 그 범인을 발견했다.

이 Struts2의 VAR에 문자열 값을 설정하려면,이 라인 :

<s:set var="accessType" value="GUEST" />

가되어야한다

<s:set var="accessType" value="'GUEST'" />

작은 따옴표 ('') 내부에 위치 할 때 리터럴 문자열을 묶어야합니다 value="" 특성

if-check가 정확했습니다.