2014-07-19 6 views
8

Sto scrivendo una webapp usando angularjs e spring mvc come provider di servizi REST e come provider di viste parziali (sto anche usando angular-ui-router in modo da poter avere più partial parziali). Al momento non ho alcun utilizzo per i linguaggi dei modelli poiché ho intenzione di fare tutto in modo angolare, tuttavia ogni singolo risolutore di vista che ho provato ha un tipo di linguaggio modello che si scontra con angolare e arresta l'applicazione e/o riempie i miei registri con errori.Quale risolutore a molla è piacevole con angularjs?

Per prima cosa ho provato a utilizzare InternalResourceViewResolver ma non ho fortuna in quanto sembra che si aspetti solo file .jsp e non mostri nient'altro.

Quindi ho provato a utilizzare Thymeleaf. Thymeleaf segue lo standard XML che mi ha costretto a riscrivere gran parte del mio html per seguire i requisiti xml, e dopo che l'ho fatto è morto incontrando uno && all'interno di una direttiva ng-show. Quindi, nessuna fortuna con quello neanche.

Quindi ho provato Velocity. Ho avuto molta fortuna con la velocità fino ad ora. Serve benissimo i file html, non smette di incontrare errori di analisi e mi permette di mostrare viste parziali allo stesso modo di InternalResourceViewResolver. Tuttavia su di incontrare variabili angolari preceduti da $ Velocity tenta di analizzare loro come variabili VTL e riempie il mio log con messaggi come

velocity - Null reference [template 'clients/createOrEdit.html', line 1, column 65] : $invalid cannot be resolved.

Tutto continua a lavorare come dovrebbe, ma io non sono quello di lasciare solo gli errori siano e non ho trovato alcun modo di disabilitare VTL.

Questa è la mia attuale esperienza con i risolutori di vista.

Ho anche avuto l'idea di trattare i file .html come risorse statiche (che sono prima che angolare è magico) usando mvc:resources ma senza alcun risolutore di vista la mia applicazione non è stata avviata anche se ho impostato il layout principale. html per essere il file di benvenuto in web.xml

La mia domanda è. Cosa dovrei usare come risolutore di viste in modo che giochi bene con angularjs e se dovessi usare anche i risolutori di vista?

EDIT: Sto cercando di utilizzare il ContentNegotiatingViewResolver e ottengo:

DEBUG ContentNegotiatingViewResolver - Requested media types are [text/html] based on Accept header types and producible media types [*/*]) 
DEBUG ContentNegotiatingViewResolver - No acceptable view found; returning null 
DEBUG DispatcherServlet - Could not complete request 
javax.servlet.ServletException: Could not resolve view with name 'layout.html' in servlet with name 'springDispatcherServlet' 

webapp-config.xml (contextconfig in servlet dispatcher)

<mvc:annotation-driven /> 

    <!-- Resources --> 
    <mvc:resources location="/libs/" mapping="/libs/**" /> 
    <mvc:resources location="/css/" mapping="/css/**" /> 
    <mvc:resources location="/js/" mapping="/js/**" /> 
    <!-- Angular application data --> 
    <mvc:resources location="/WEB-INF/appjs/" mapping="/appjs/**" /> 
    <!-- View locations --> 
    <mvc:resources location="/WEB-INF/html/" mapping="/**"/> 

    <!-- Controllers --> 
    <context:component-scan base-package="com.mrplow.controller" /> 

    <!-- Views --> 
    <util:map id="contentMediaTypes"> 
     <entry key="json" value="application/json" /> 
     <entry key="html" value="text/html" /> 
    </util:map> 

<!-- <util:list id="defaultViews"> --> 
<!--  <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />  --> 
<!-- </util:list> --> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" 
    p:order="1" 
    p:ignoreAcceptHeader="false" 
    p:defaultContentType="text/html" 
    p:mediaTypes-ref="contentMediaTypes" /> 

LayoutController.java

@Controller 
@RequestMapping("/") 
public class LayoutController { 

    @RequestMapping 
    public String getIndexPage() { 
     return "layout"; 
    } 
} 

risposta

9

Per poter utilizzare risorse statiche (html, css, img, js) in primavera, utilizzare una struttura di directory che è simile al seguente:

src/ 
    package/ 
    LayoutController.java 
WebContent/ 
    WEB-INF/ 
    static/ 
     html/ 
     layout.html 
     images/ 
     image.jpg 
     css/ 
     test.css 
     js/ 
     main.js 
    web.xml 
    springmvc-servlet.xml 



@Controller 
public class LayoutController { 

@RequestMapping("/staticPage") 
public String getIndexPage() { 
return "layout.htm"; 

} } 



    <!-- in spring config file --> 
<mvc:resources mapping="/static/**" location="/WEB-INF/static/" /> 

layout.html

<h1>Page with image</h1> 
<img src="/static/img/image.jpg"/> 

Nota che devi parlare /static/img/image.jpg non solo /image.jpg ..Same vale per i CSS e JS.

O

È possibile anche utilizzare contenuto vista negoziazione resolver come illustrato di seguito:

<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="xml" value="application/xml" /> 
       <entry key="rss" value="application/rss+xml" /> 
       <entry key="html" value="text/html"/> 
      </map> 
      </property> 

      <property name="defaultViews"> 
      <list> 
       <!-- JSON View --> 
       <bean 
       class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
       </bean> 

Spring MVC userà “ContentNegotiatingViewResolver” (ordine = 1) per restituire una vista adatto (basato su estensione file dichiarata nella proprietà "mediaTypes", se non corrisponde, utilizzare "InternalResourceViewResolver" (ordine = 2) per restituire una pagina JSP predefinita.

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

Ora dal jsp è possibile reindirizzare alla tua pagina html statica così

@Controller 
    public class LayoutController { 

     @RequestMapping("/index") 
     public String getIndexPage() { 
      return "index"; 
     } 

    } 

index.jsp

<form:form method="GET" action="/static/html/layout.html"> 

Ora tentare di accedere al servizio attraverso http://yourapp.com//index mostrano la modulo azione menzionato sopra.Verrà mostrato il layout.html

fare clic su un pulsante oo presentati in pagina JSP per richiamare la pagina layout.html

+0

Grazie. Una domanda però. I tipi di media citano xml - application/xml. Ciò spiega anche i file html? – MrPlow

+0

sì, è possibile utilizzare questo per html . ho aggiornato la mia risposta. Si prega di controllare –

+0

vedo. Un'altra domanda. Dove cerca i file? Non sembra in grado di trovare le mie opinioni. Aggiornerò l'OP con la configurazione corrente – MrPlow

2

Penso ContentNegotiatin gViewResolver è il miglior risolutore di visualizzazione, poiché sarà possibile integrarlo con Jackson2 per rispondere ai dati nel testo JSON, XML o HTML, tra gli altri tipi di risposta necessari.

Ad esempio, osservare questo approccio.

http://hillert.blogspot.com.es/2011/01/rest-with-spring-contentnegotiatingview.html

+0

Grazie. Una domanda però. I tipi di media citano xml - application/xml. Ciò spiega anche i file html? – MrPlow

+0

Non so se sto capendo bene la tua domanda. Ma il tipo di contenuto in file HTML è "text/html" invece di "application/xml". Cercando in google puoi trovare i diversi tipi di contenuti per tutte le risorse. Per l'altro lato, conoscere @RequestMapping e consuma/produce attributi, per specificare a livello di metodo tutte le domande. – Dani

1

Per le persone che cercano il modo per rendere la soluzione con ContentNegotiatingViewResolver a lavorare in nuova versione di primavera:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="order" value="1" /> 
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/> 
    <property name="defaultViews"> 
     <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> 
    </property> 
</bean> 

E dopo che le estensioni configurare quali si necessario in ContentNegotiationManagerFactoryBean:

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="mediaTypes"> 
     <props> 
      <prop key="json">application/json</prop> 
      <prop key="html">text/html</prop> 
      <prop key="xml">application/xml</prop> 
      // and so on 
     </props> 
    </property> 

    <property name="ignoreAcceptHeader" value="true"/> 
</bean>