2010-10-29 14 views
6

La mia applicazione MVC primavera ha un unico ContentNegotiatingViewResolver che definisce JSONView per il rendering resonses JSON:avanti ad una pagina html statico dal controller

<mvc:annotation-driven/> 

<context:component-scan base-package="world.domination.test"/> 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json"/> 
     </map> 
    </property> 
    <property name="defaultViews"> 
     <list> 
      <bean class="com.secondmarket.connector.springmvc.MappingJacksonJsonViewEx"/> 
     </list> 
    </property> 
</bean> 

L'intera applicazione si siede sulla radice url "myapp". Tutto funziona come ho bisogno.

La prima domanda è: come restituire una pagina html statica quando si accede a un determinato URL? Diciamo, quando accedo a Spring uri/myapp/test, vorrei rendere una pagina html /TestStuff.html che risiede nella cartella webapp di root.

sono andato avanti e ho scritto un semplice controllo:

@Controller 
@RequestMapping("test") 
public class TestConnector { 

    @Autowired 
    private RestTemplate tpl; 

    @RequestMapping(method = RequestMethod.GET) 
    public String get() { 
     return "/TestStuff.html"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@RequestParam("url") String url, @RequestParam("data") String data) { 
     return tpl.postForObject(url, data, String.class, new HashMap<String, Object>()); 
    } 
} 

Il metodo get() dovrebbe dire a primavera per rendere una TestStuff.html, ma invece ho un errore che dice che la vista con nome "/TestStuff.html" mancante.

La seconda domanda è come evitare l'estensione dell'URL. Nell'esempio quando uso /myapp/test anziché /myapp/test.html mio ContentNegotiatingViewResolver utilizza una vista json che rende {} (parentesi graffe vuote)

Qualsiasi puntatori sono molto apprezzati.

+0

Dalla configurazione di ContentNegotiatingViewResolver' non riesco a capire cosa stai cercando di ottenere. Questo risolutore è applicabile quando la stessa risorsa può essere resa in diverse rappresentazioni. Se alcune risorse sono renderizzate in JSON, mentre altre sono HTML, è necessaria un'altra configurazione di resolver. – axtavt

risposta

5

Invece di restituire "/TestStuff.html" dal controller, provare a restituire "redirect: /TestStuff.html".

Un'altra opzione è creare e registrare un risolutore di viste per le pagine statiche. Forse qualcosa di simile:

<bean id="staticViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="prefix" value="/WEB-INF/static/"/> 
    <property name="suffix" value=".html"/> 
</bean> 
+0

Questo "redirect: /TestStuff.html" funziona perfettamente (almeno con Spring MVC 3.1.1) ... È più semplice che dover aggiungere viewResolver poiché ne ho già uno definito per tutte le mie pagine JSP. –

0

Il modo migliore per farlo è quello di utilizzare InternalResourceViewResolver combinato con MVC: tag View-Controller (leggere la primavera Manuale di riferimento per i dettagli). Basta includere il seguente nel file XML contesto di applicazione (in questo caso il vostro TestStuff.html file statici si troverà nella directory/WEB-INF/static-pagine):

<bean> 
    <bean id="staticPagesViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/static-pages/"/> 
    <property name="suffix" value=".html"/> 
</bean> 

<mvc:view-controller path="/test" view-name="TestStuff"/> 
Problemi correlati