'el'에 해당하는 글 1건

어제와 오늘은 스프링 프레임워크를에서 제공하는 코드를 이용하여, 몇가지를 테스트를 하였다.
Spring MVC를 이용하여, Sample코드를 작성해보았는데, 정상적으로 동작하지 않았다.
Springframework에서 제공하고 있는, MOC테스트도 정상적으로 동작하고, Controller에서 log를 찍어 보아도, 정상적으로 표시가 되는데, 꼭 View에서 값을 표시할 수 없다는 것이었다.

아래의 코드는 Controller의 코드로, 현재 시간을 String형으로 View에 전달되는 코드이다.
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String now = (new Date()).toString();
        logger.info("Returning hello view with " + now);
        System.out.println("Returning hello view with..2 " + now);
        return new ModelAndView("/WEB-INF/jsp/hello.jsp", "now", now);
    }

View(hello.jsp)의 코드는 아래와 같다. JSTL과 EL을 이용해서, Controller에서 전달한 값을 찍어주는 코드이다. 그러나 내가 원하는 값(현재 시간) 대신 "${now}" 라고 화면에 찍어준다.
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
  <head><title>Hello :: Spring Application</title></head>
  <body>
    <h1>Hello - Spring Application</h1>
    <p>Greetings, it is now <c:out value="${now}"/></p>
  </body>
</html>

위의 코드를 테스트 하기가 그렇게 쉽지는 않았다. 왜냐하면, JSTL의 문제일 것이라는 생각은 있었지만 어떤식으로 전달되는 값을 테스트 할지는 생각하기 쉽지 않고, 에러 메시지도 전혀 없었기 때문이다.
그래서, 값의 전달에 문제가 있을 거라 생각하고, 다음과 같은 코드를 넣어 보았다.

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
  <head><title>Hello :: Spring Application</title></head>
  <body>
  <%
       out.println(request.getAttribute("now"));
  %>

    <h1>Hello - Spring Application</h1>
    <p>Greetings, it is now <c:out value="${now}"/></p>
  </body>
</html>

위와 같이 했을 때, 임시로 넣어준 테스트 코드인 "request.getAttribute("new"))" 는 정상적으로 Controller에서 전달한 값들이 표시해 주었다. 이제 문제는 JSTL과 EL의 문제인데, 엄밀하게 이야기하면, JSTL의 문제는 아니고, EL의 문제인데, 건드릴 수 있는 부분은 자바 코드는 전혀없기 때문데, 결국 시스템의 설정을 건드려 주어야 한다.

그래서, googling과 이전에 사서 보곤했던 "Head first"시리즈로 나왔던 "Server & JSP"책을 찾아보았다.
결국 답을 찾았는데, 답은 web.xml의 설정이 잘못되었기 때문이다.

아래는 처음에 web.xml에 설정했던 것이다.
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">

위의 것을 아래과 같이 설정을 변경하였더니, EL이 정상적으로 잘 동작하였다.
<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 versing 2.5가 최신의 것인데, 위에서는 2.4버전으로 설정한 것을 예로 보여주고 있다. 만약 2.5 버전을  사용하고 싶다면, 아래의 것을 사용하면 된다.

<web-app
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">


Goolge App Engine은 JSTL을 기본적으로 제공하고 있기 때문에, JSTL을 지원하기 위해서, "jstl.jar"과 "standard.jar" 파일을 Class path에 포함 시킬 필요는 없다.

위와 같이 web.xml의 설정을 변경하면, 아래와 같은 결과를 볼수가 있다.

이를 해결하기까지, 생각보다 시간이 많이 걸렸다.




WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  1 , 댓글  7개가 달렸습니다.
  1. 보통 DD는 그냥 쓰던것 복사해서 쓰는 경우가 많아서,
    저도 예전에 web.xml 뼈대부분만 그냥 복사해서 썼다가
    같은 현상으로 좀 짜증 났었던 기억이 나네요. :)
    그래도 그덕에 해결방법을 아주 다양하게 알게 됐죠.

    역시 제일 좋은 방법은 포스트에 언급하신 namespace와 schema를 제대로 설정하는것인거 같구요.

    다른 방법으로는 jsp 파일에
    <%@page isELIgnored="false" %>
    를 추가해 주는 방법이 있습니다만, 너무 삽질 같구요...ㅡ_ㅡ;
    (XML 스타일이면
    <jsp:directive.page isELIgnored="false" />)

    아니면 DD안에
    <jsp-config>
    <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <el-ignored>false</el-ignored>
    </jsp-property-group>
    </jsp-config>
    이렇게 설정해주는 방법도 있구요.
    근데 이럴바에는 역시 namespace와 schema 설정을 해주는게 훨씬 좋겠죠.

    뭐 요즘이야 Eclipse와 M2Eclipse를 써서 web-app plug-in이 알아서
    DD를 생성해 주니 저런 문제 생길일은 별로 없지만,
    저런건 한번 설정해서 쓰면 크게 신경 안쓰는 부분이라서,
    이전에 쓰던 파일 한번 잘못 복사했다가
    "뭐야? 왜 전에 잘 되던게 안되지?" 하는식으로 골칫거리를 낳기 쉬운거 같습니다.
  2. 감사합니다. 자세히 여러가지 알려주셔서...
    사실 Google App Engine의 Eclipse Plugin이 만들어 주는 Web.xml이 너무나 심플해서 생겨난 문제 였습니다.

    말씀하신 대로, Eclipse에서 자동으로 생성해 주는 다른 Plugin은 별 문제가 없었거든요. 그래서 무의식적으로 확인할 생각을 하지 않고, 지나쳤는데 이번에 제대로 공부하는 기회가 되었습니다.

    감사합니다.
    • 헉, 별말씀을요.
      게을러서 제가 포스팅 하긴 힘들고,
      다른분이 좋은글 써놓은것에 정보 공유 차원에서
      몇마디 한건데요. 사실 묻어가기죠...ㅡ_ㅡ;;;

      그나저나 Google App Engine Eclipse Plugin은
      써본적이 없어서 몰랐는데, 그게 또 그렇게
      심플하게 생성하는군요.
      좋은 정보 고맙습니다. 아직 사용은 안 해봤지만,
      저도 Google App Engine에 관심이 있어서
      조만간 사용해 볼까 했는데,
      알려주신덕에 plugin이 생성한 web.xml 때문에
      발생하는 문제는 모면했네요.

      역시 정보는 다른이와 나누면 더 크게 돌아오는군요...^^
    • Kevin님의 블로그를 방문했는데, 좋은 자료들이 많이 있더군요. 또 찾아 주셔서 감사합니다.
  3. 저기 궁금해서 그러는데요.. 혹시 SpringMVC의 ViewResolver는 어떤걸 사용하셨나요??
  4. 저기 궁금해서 그러는데요.. 혹시 SpringMVC의 ViewResolver는 어떤걸 사용하셨나요??
  5. 저기 궁금해서 그러는데요.. 혹시 SpringMVC의 ViewResolver는 어떤걸 사용하셨나요??
secret