1

多くの Spring MVC 初心者と同様に、私も最初のハードルを乗り越えるのに苦労しています。私の場合、現在のハードルは、JSTL fmt taglib が日付を適切にフォーマットしていない、 fmt tag の value 属性によって文字列リテラルが渡されていることに関連しているようです。私は自分の知識のねじれを解決するために使用している単純な Maven プロジェクトを持っています。次のコード スニペットは、私の WelcomeController、web-servlet.xml、web.xml、およびwelcome.jsp からのものです。

WelcomeController.java

    @Controller
    @RequestMapping(value="/")
    class WelcomeController {  

        @RequestMapping(method=RequestMethod.GET) 
        public String welcome(Model model) {
            Date today = new Date();
            System.out.println("Controller being called");
            model.addAttribute("today", today);
            System.out.println(model.containsAttribute("today"));
            return "welcome";
       }
    }

web-servlet.xml

   <?xml version="1.0" encoding="UTF-8"?>
   <beans> <!-- bean namespaces ommitted for space sake -->

        <context:component-scan base-package="org.opel.eros.web"/>

        <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

        <context:property-placeholder location="classpath:META-INF/properties/web-config.properties"/>

        <mvc:annotation-driven/>

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="${config.prefix}"/>
            <property name="suffix" value="${config.suffix}"></property>
        </bean>

web.xml

   <web-app>
       <servlet>
            <servlet-name>eros</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
       </servlet>

       <servlet-mapping>
           <servlet-name>eros</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>
   </web-app>

そして最後にwelcome.jsp

   <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
   <html>
   <head></head>
   <body>
       <fmt:formatDate value="${today}" pattern="yyyy-MM-dd"/>
   </body>
   </html>

私が知っているほど単純にはなりませんが、 url を入力すると例外がスローされhttp://localhost:9990/XYZ/ます。これは例外です: PWC6338: Cannot convert "${today}" for the attribute value of the bean java.util.Date

これは、formatDate に文字列リテラル "${today}" が渡されているエラーのように思えます。これは明らかに例外をスローします。私が参考にするために使用している例 (Spring Recipes: A problem Solution Approach から) では、モデル属性にアクセスするには、上記の fmt タグで指定された構文を使用すると述べています。

基本的に、私は解決策とこれが起こっている理由を探しています(おそらく、私の側では本当に単純で愚かなことだと思います=])。事前にご協力いただきありがとうございます。

4

2 に答える 2

2

問題は web.xml 内にあるようです。web.xml と対応するプロジェクト構造は、maven-archtype-webapp を使用して Spring Source ツールによって自動生成されました。自動生成された web.xml は名前空間定義を指定しません。代わりに、次のような DOCTYPE を指定します。

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

自動生成されたコードがバージョン 3.0 の定義を使用すると仮定したのは間違いでした。バージョン 3 への変更により、問題が修正されました。注意すべきことの 1 つは、システムが明らかにバージョン 2.3 を使用している間、次への呼び出しからの出力であるということです。

-application.getMajorVersion(); and
-application.getMinorVersion();

3.0 のサーブレット バージョンを作成しました。これは、私の一部に混乱をもたらし、他の人を捕まえる可能性があります。ボグダンの助けに感謝します。

于 2012-10-19T15:15:11.010 に答える
1

私の推測では、使用しているJSPバージョンとJSTLバージョンの間に不一致があります。セットアップに応じてJSTLを使用する方法を説明する記事は次のとおりです。WebアプリケーションでJSTLを参照および使用する方法

web.xmlの<web-app>タグは、アプリケーションのバージョンについて何も述べていないので、これが最初に確認することです。アプリケーションのバージョンを確認するためのコードを記述したり(web.xmlで明示的に指定しない場合は、各サーブレットのバージョンにデフォルトを設定する必要があります)、変更してJSP2を使用しているかどうかを確認するための簡単なダーティテストを実行できます。これに対するあなたのJSP:

<html>
   <head></head>
   <body>
       ${today}
   </body>
</html>

日付の値が表示されている場合は、JSP2を使用しています。文字列${today}が表示されている場合は、JSP 1を使用しています(JSTLバージョンが間違っています)。

于 2012-09-30T16:43:00.927 に答える