2010-10-29 16 views
6

Mi primavera de aplicación MVC tiene una sola ContentNegotiatingViewResolver que define JSONView para la representación JSON resonses:adelante a una página HTML estática de Controlador

<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> 

Toda la aplicación se encuentra en la raíz url "miaplicacion". Todo funciona como lo necesito

La primera pregunta es: ¿cómo devolver una página estática html cuando se accede a una determinada URL? Por ejemplo, cuando se accede a la primavera URI/miaplicacion/prueba me gustaría hacer una página html /TestStuff.html que reside en la carpeta webapp raíz.

que siguió adelante y escribió un controlador simple:

@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>()); 
    } 
} 

El método get() se supone que le diga la primavera para hacer una TestStuff.html, pero en su lugar me sale un error que dice que la vista con el nombre "/TestStuff.html" no se encuentra.

La segunda pregunta es cómo evitar la necesidad de poner extensión a la URL. En mi ejemplo, cuando uso /miaplicacion/test en lugar de /myapp/test.html mi ContentNegotiatingViewResolver utiliza una vista json que hace que {} (llaves vacías)

Cualquier punteros son muy apreciados.

+0

Desde su configuración de 'ContentNegotiatingViewResolver' No puedo entender lo que está tratando de lograr. Esta resolución es aplicable cuando el mismo recurso se puede representar en diferentes representaciones. Si algunos de los recursos se representan en JSON, mientras que otros son HTML, se necesita otra configuración de resolución. Este – axtavt

Respuesta

5

En lugar de devolver "/TestStuff.html" desde su controlador, intente devolver "redirect: /TestStuff.html".

Otra opción es crear y registrar una resolución de vista para sus páginas estáticas. Tal vez algo como esto:

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

"redirigir: /TestStuff.html" está funcionando muy bien (al menos con Spring MVC 3.1.1) ... Es más sencillo que tener que añadir ViewResolver ya que tengo uno ya definido para todas mis páginas JSP. –

0

La mejor manera de hacer esto es utilizar InternalResourceViewResolver combinado con MVC: etiqueta vista-controlador (consulte el Manual de Referencia del resorte apropiada para más detalles). Basta con incluir lo siguiente en su archivo XML contexto de aplicación (en este caso, su TestStuff.html archivo estático se encuentra en el directorio/páginas estáticas/WEB-INF):

<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"/> 
Cuestiones relacionadas