سؤال

وأنا أعمل على تطبيق ويب حيث لدي معظم صفحاتي الاستفادة من البلاط اباتشي (2.1.2)، ولكن عدد قليل منهم في حاجة إلى أن يكون مجرد وحدات JSP عادي.

وأواجه مشكلة في أن كلا من InternalResourceViewResolver وسوف UrlBasedViewResolver محاولة حل رأي مهما كانت، بحيث بغض النظر عن ترتيب يمكنني استخدام، فإنه إما أن تفشل في صفحة JSP عادي، أو على صفحات البلاط .

وهنا هو التكوين:

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
    <property name="order" value="0"/>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
    <property name="order" value="1"/>
</bean>

لجعله أكثر وضوحا ما أحاول القيام به، ولست بحاجة إلى أن تكون قادرة على الدول عرض مثل هذا:

<view-state id="someState" view="/someDir/foo"><!--render foo.jsp -->
    <transition on="foo" to="bar"/>
</view-state>

<view-state id="someState" view="something.core"><!--render tile defintion named 'something.core' -->
    <transition on="foo" to="bar"/>
</view-state>

لا أحد يعرف كيفية تكوين الأشياء حتى أستطيع أن أحصل عليه لتقديم تعريفات البلاط وحدات JSP عادي؟

هل كانت مفيدة؟

المحلول

وكما قلت، لا يمكنك سلسلة هذه معا. وجافادوك لكلا ينص بوضوح على أنه يجب أن يكون كل من في نهاية سلسلة محلل.

وأقترح أنه إذا كنت حقا بحاجة لاستخدام هذه أسمر، ثم تكتب تنفيذ مخصص بسيط من ViewResolver التي تأخذ اسم طريقة العرض، ويقرر أي من الخاص بك اثنين "الحقيقية" وجهة نظر حل له أن يفوض ل. هذا يفترض أنه يمكنك معرفة أي محلل للاتصال على أساس اسم طريقة العرض.


وهكذا كنت تحديد ViewResolver مخصصة مثل هذا:

public class MyViewResolver implements ViewResolver {

    private ViewResolver tilesResolver;
    private ViewResolver jspResolver;

    public void setJspResolver(ViewResolver jspResolver) {
        this.jspResolver = jspResolver;
    }

    public void setTilesResolver(ViewResolver tilesResolver) {
        this.tilesResolver = tilesResolver;
    }

    public View resolveViewName(String viewName, Locale locale) throws Exception {
        if (isTilesView(viewName)) {
            return tilesResolver.resolveViewName(viewName, locale);
        } else {
            return jspResolver.resolveViewName(viewName, locale);
        }
    }

    private boolean isTilesView(String viewName) {
    .....
    }
}

وأنت كنت بحاجة إلى تنفيذ أسلوب isTilesView أن تقرر أي محلل تخويل.

في التكوين XML، وتحديد هذا محلل جهة نظر جديدة، وتأكد من أنه يبدو <م> قبل في بعضها الآخر.

<bean class="MyViewResolver">
    <property name="tilesResolver" ref="tilesViewResolver"/>
    <property name="jspResolver" ref="viewResolver"/>
</bean>

نصائح أخرى

ولقد حلها فقط من نفس المشكلة عن طريق تقسيم ملف التكوين *-servlet.xml في اثنين. في حالتي يستخدم التطبيق الرئيسي البلاط، ولكن أريد اختبارات QUnit أن تكون وحدات JSP بسيطة.

وapp-servlet.xml يحتوي فقط على بلاط رأي محلل، tests-servlet.xml يحتوي فقط على عرض محلل وweb.xml تعيينات JSP يتم إيفاد الطلبات إلى بريمج الصحيح مستندة على URL.

<servlet-mapping>
  <servlet-name>app</servlet-name> <!-- will reach app-servlet.xml -->
  <url-pattern>/foo</url-pattern> <!-- will use "foo" Tile -->
  <url-pattern>/bar</url-pattern> <!-- will use "bar" Tile -->
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tests</servlet-name> <!-- will reach tests-servlet.xml -->
  <url-pattern>/foo-test</url-pattern> <!-- will use foo-test.jsp -->
  <url-pattern>/bar-test</url-pattern> <!-- will use bar-test.jsp -->
</servlet-mapping>

ويبدو أنك كنت على الطريق الصحيح، ولكن الشيء أن نضع في اعتبارنا أن بعض محللات عرض تتصرف كما لو أنها كانت دائما حل طريقة العرض. كنت بحاجة للتأكد من أن تضع هذه حل له الأخير في الترتيب الخاص بك. وأعتقد أن رأي البلاط هو واحد مثل.

وتحرير: يصيح ... نعم، الملصق الآخر هو الصحيح، كل من هذه حل له لن تفعل "تتطابق دائما" بحيث لا يمكن استخدامها على حد سواء في السلسلة. سيكون بديل آخر يتمثل في محاولة لتمديد TilesView للقيام بسيطة JSP تقديم إذا كان غير قادر على العثور على عرض البلاط تكوينه.

ونعم يمكنك استخدام أي عدد من رأي محلل في المشروع الخاص بك.

وهكذا يمكنك استخدام كل من "البلاط مشاهدة محلل" و "محلل منظر داخلي" في نفس المشروع. .

وكان لديك لتكوين ContentNegotiatingViewResolver. .

وتعطي قيمة النظام في ضوء حل له بك.

<property name="order" value="int Value here" />

وكأنني قد أعطيت البلاط عرض محلل 2 و 3. internalviewresolver و. وهو أول تحقق في تعريفات البلاط إذا لم يتم العثور على طريقة عرض في البلاط أنه سيتم التحقق في InternaiViewResolver

وهنا بعض التكوينات التي يعمل بالنسبة لي.

    <bean
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
                <entry key="html" value="text/html" />
            </map>
        </property>
        <property name="parameterName" value="accept"></property>
        <property name="favorParameter" value="true"></property>
        <property name="defaultContentType" value="text/html"></property>
        <property name="viewResolvers">
            <list>
                <ref bean="tilesViewResolver" />
                <ref bean="internalViewResolver" />
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean
                    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
            </list>
        </property>
        <property name="ignoreAcceptHeader" value="true" />
    </bean>

<!--    Configures the Tiles layout system  -->
    <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"
        id="tilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/layouts/layouts.xml</value>
            <!-- Scan views directory for Tiles configurations  -->
                <value>/WEB-INF/views/**/views.xml</value>
            </list>
        </property>
    </bean>
    <bean id="tilesViewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver"
        p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView">
        <property name="order" value="3" />
    </bean>


    <bean id="internalViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2" />
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

وأنا حل هذه المشكلة ببساطة عن طريق إضافة تعريف البلاط للتخطيط التخطيط الاستراتيجي المشترك العادي، ومثل هذا:

  <definition name="plain-jsp.layout" template="/WEB-INF/layouts/plainJsp.jspx" >
    <put-attribute name="content" value=""/>
  </definition>

وبعد ذلك يمكنك فقط استخدام هذا التخطيط كقالب لإدراج ملفات JSP بسيطة الخاصة بك.

  <definition name="catalog/details" extends="plain-jsp.layout">
    <put-attribute name="content" value="/WEB-INF/views/catalog/details.jspx"/>
  </definition>

وملف قالب تخطيط:

<html xmlns:tiles="http://tiles.apache.org/tags-tiles"
      xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">

  <jsp:output doctype-root-element="HTML"/>
  <jsp:directive.page contentType="text/html;charset=UTF-8" />  
  <jsp:directive.page pageEncoding="UTF-8" />

  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=8" />      
  </head>
  <body>
    <div id="content">
      <tiles:insertAttribute name="content"/>
    </div>
  </body>
</html>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top