tutorial - Spring MVC: ¿cómo crear un controlador predeterminado para la página de índice?
spring form (8)
Funciona para mí, pero algunas diferencias:
- No tengo lista de archivos de bienvenida en web.xml
- No tengo @RequestMapping en el nivel de clase.
- Y a nivel de método, solo @RequestMapping ("/")
Sé que estas no son grandes diferencias, pero estoy bastante seguro (no estoy trabajando ahora) esta es mi configuración y funciona con Spring MVC 3.0.5.
Una cosa más. No muestra la configuración de su despachador en web.xml, pero tal vez tenga algún prefijo. Tiene que ser algo como esto:
<servlet-mapping>
<servlet-name>myServletName</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Si este no es tu caso, necesitarás un filtro de reescritura de URL o prueba la solución de redireccionamiento.
EDITAR: Respondiendo a su pregunta, mi configuración de resolución de vistas también es un poco diferente:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
Estoy tratando de hacer una de esas aplicaciones estándar de spring mvc hello world, pero con el giro que me gustaría asignar el controlador a la raíz. (por ejemplo: http://numberformat.wordpress.com/2009/09/02/hello-world-spring-mvc-with-annotations/ ) Así que la única diferencia real es que lo asignan a host / appname / something y Me gustaría asignarlo a host / appname.
Puse mi index.jsp en src / main / webapp / jsp y lo mapeé en el web.xml como el archivo de bienvenida. Lo intenté:
@Controller("loginController")
public class LoginController{
@RequestMapping("/")
public String homepage2(ModelMap model, HttpServletRequest request, HttpServletResponse response){
System.out.println("blablabla2");
model.addAttribute("sigh", "lesigh");
return "index";
}
Como mi controlador pero no veo nada, aparece en la consola de mi tomcat. ¿Alguien sabe dónde estoy arruinando?
Mi web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- Index -->
<welcome-file-list>
<welcome-file>/jsp/index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>springweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springweb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
El mvc-dispatcher-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="de.claude.test.*" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
Estoy usando Spring 3.0.5.release
¿O esto no es posible y necesito volver a colocar mi index.jsp en la raíz del web-inf y poner un redireccionamiento a algún lugar dentro de mi jsp para que el controlador lo recoja?
La redirección es una opción. Una cosa que puedes intentar es crear una página de índice muy simple que coloques en la raíz de la GUERRA que no hace más que redirigir a tu controlador como
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:redirect url="/welcome.html"/>
Luego mapea su controlador con esa URL con algo así como
@Controller("loginController")
@RequestMapping(value = "/welcome.html")
public class LoginController{
...
}
Finalmente, en web.xml, para tener su (nuevo) índice JSP accesible, declare
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
La solución que uso en mi SpringMVC webapps es crear una clase simple de DefaultController
como la siguiente:
@Controller
public class DefaultController {
private final String redirect;
public DefaultController(String redirect) {
this.redirect = redirect;
}
@RequestMapping(value = "/")
public ModelAndView redirectToMainPage() {
return new ModelAndView("redirect:/" + redirect);
}
}
La redirección se puede inyectar utilizando la siguiente configuración de primavera:
<bean class="com.adoreboard.farfisa.controller.DefaultController">
<constructor-arg name="redirect" value="${default.redirect:loginController}"/>
</bean>
El ${default.redirect:loginController}
se establecerá de forma predeterminada en loginController
pero se puede cambiar insertando default.redirect=something_else
en un archivo de propiedades de spring / setting, una variable de entorno, etc.
Como @Mike ha mencionado anteriormente, también tengo:
- Deshizo de la sección
<welcome-file-list> ... </welcome-file-list>
en el archivoweb.xml
. - No tiene ningún archivo en WebContent que se considere páginas predeterminadas (
index.html
,index.jsp
,default.html
, etc.)
Esta solución le permite a Spring preocuparse más por los redireccionamientos que pueden ser o no lo que le gusta.
Se puede resolver de una manera más simple: en web.xml
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
Después de eso, use los controladores que desee procesar index.htm con @RequestMapping ("index.htm"). O simplemente usa el controlador de índice
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">indexController</prop>
</props>
</property>
<bean name="indexController" class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
</bean>
Simplemente podemos asignar un método de controlador para la vista predeterminada. Por ejemplo, tenemos un index.html como página predeterminada.
@RequestMapping(value = "/", method = GET)
public String index() {
return "index";
}
Una vez hecho, podemos acceder a la página con el contexto de aplicación predeterminado.
E.g http://localhost:8080/myapp
Solo ingrese una entrada más en su archivo xml de primavera, es decir, mvc-dispatcher-servlet.xml
<mvc:view-controller path="/" view-name="index"/>
Después de poner esto en su xml, coloque su vista predeterminada o su archivo jsp en su carpeta JSP personalizada como lo mencionó en el archivo mvc-dispatcher-servlet.xml
.
cambiar el index
con su nombre jsp.
Tuve el mismo problema, incluso después de seguir la configuración de Sinhue, pero lo resolví .
El problema era que ese algo (Tomcat?) Se estaba reenviando de "/" a "/index.jsp" cuando tenía el archivo index.jsp en mi directorio WebContent. Cuando eliminé eso, la solicitud ya no se reenvía.
Lo que hice para diagnosticar el problema fue crear un controlador de solicitudes catch-all e imprimir la ruta del servlet a la consola. Esto me mostró que a pesar de que la solicitud que estaba haciendo era para http://localhost/myapp/ , la ruta del servlet se cambiaba a "/index.html". Esperaba que fuera "/".
@RequestMapping("*")
public String hello(HttpServletRequest request) {
System.out.println(request.getServletPath());
return "hello";
}
Entonces, en resumen, los pasos que debes seguir son:
- En su mapeo de servlet use
<url-pattern>/</url-pattern>
- En su controlador use
RequestMapping("/")
- Deshágase de welcome-file-list en web.xml
- No tiene ningún archivo en WebContent que se considere páginas predeterminadas (index.html, index.jsp, default.html, etc.)
Espero que esto ayude.
Una forma de lograrlo es mapeando su archivo de bienvenida a la ruta de solicitud de su controlador en el archivo web.xml
:
[web.xml]
<web-app ...
<!-- Index -->
<welcome-file-list>
<welcome-file>home</welcome-file>
</welcome-file-list>
</web-app>
[LoginController.java]
@Controller("loginController")
public class LoginController{
@RequestMapping("/home")
public String homepage2(ModelMap model, HttpServletRequest request, HttpServletResponse response){
System.out.println("blablabla2");
model.addAttribute("sigh", "lesigh");
return "index";
}