mvc example html spring spring-mvc contextpath

html - example - Spring MVC Request URLs en JSP



jquery ajax json spring mvc example (7)

Estoy escribiendo una aplicación web usando Spring MVC. Estoy usando anotaciones para los controladores, etc. Todo funciona bien, excepto cuando se trata de enlaces reales en la aplicación (acciones de formulario, etiquetas <a> , etc.) Actual, tengo esto (obviamente abreviado):

//In the controller @RequestMapping(value="/admin/listPeople", method=RequestMethod.GET) //In the JSP <a href="/admin/listPeople">Go to People List</a>

Cuando ingreso directamente la URL como "http: // localhost: 8080 / MyApp / admin / listPeople", la página se carga correctamente. Sin embargo, el enlace de arriba no funciona. Se pierde el nombre de la aplicación "MyApp".

¿Alguien sabe si hay una manera de configurar Spring para lanzar el nombre de la aplicación allí?

Déjame saber si necesitas ver alguna de mis configuraciones de Spring. Estoy utilizando el servlet de despachador estándar con un programa de resolución de vistas, etc.


Como acabo de intentar encontrar la respuesta a esta pregunta, este es el primer resultado de Google.

Esto se puede hacer ahora usando MvcUriComponentsBuilder

Esto es parte de la versión 4.0 de Spring MVC

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

El método necesario es fromMappingName

De la documentación:

Cree una URL a partir del nombre de la asignación de solicitud del método del controlador Spring MVC. El HandlerMethodMappingNamingStrategy configurado determina los nombres de las asignaciones de solicitud de método del controlador en el inicio. De forma predeterminada, a todas las asignaciones se les asigna un nombre basado en las letras mayúsculas del nombre de la clase, seguido de "#" como separador, y luego el nombre del método. Por ejemplo, "PC # getPerson" para una clase llamada PersonController con el método getPerson. En caso de que la convención de nomenclatura no produzca resultados únicos, se puede asignar un nombre explícito a través del atributo de nombre de la anotación @RequestMapping.

Esto está dirigido principalmente para su uso en tecnologías de representación de vista y expresiones EL. La biblioteca de etiquetas Spring URL registra este método como una función llamada "mvcUrl".

Por ejemplo, dado este controlador:

@RequestMapping("/people") class PersonController { @RequestMapping("/{id}") public HttpEntity getPerson(@PathVariable String id) { ... } }

Un JSP puede preparar una URL para el método del controlador de la siguiente manera:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> <a href="${s:mvcUrl(''PC#getPerson'').arg(0,"123").build()}">Get Person</a>


Es necesario anteponer la ruta de contexto a sus enlaces.

// somewhere on the top of your JSP <c:set var="contextPath" value="${pageContext.request.contextPath}"/> ... <a href="${contextPath}/admin/listPeople">Go to People List</a>


La etiqueta c:url agregará la ruta de contexto a su URL. Por ejemplo:

<c:url value="/admin/listPeople"/>

Alternativamente, también prefiero usar las URL relativas tanto como sea posible en mis aplicaciones Spring MVC. Entonces, si la página está en /MyApp/index , el enlace <a href="admin/listPeople"> me llevará a la página listPeople .

Esto también funciona si está más profundo en la jerarquía de URL. Puedes usar el .. para retroceder un nivel. Así que en la página en /MyApp/admin/people/aPerson , usar <a href="../listPeople"> le gustará volver a la página de lista


Normalmente configuro Tomcat para usar la raíz de contexto de "/" o implementar la guerra como ROOT.war. De cualquier manera, el nombre de guerra no se convierte en parte de la URL.


Podrías usar un servletRelativeAction. No estoy seguro de en qué versiones está disponible (estoy usando 4.0.x actualmente) y no he visto mucha documentación sobre esto, pero si observa el código que respalda el formulario de primavera, probablemente pueda adivinarlo. Solo asegúrate de que el camino que pases comience con una "/".

Ejemplo:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check" method="POST">

Consulte org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException { String action = getAction(); String servletRelativeAction = getServletRelativeAction(); if (StringUtils.hasText(action)) { action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action)); return processAction(action); } else if (StringUtils.hasText(servletRelativeAction)) { String pathToServlet = getRequestContext().getPathToServlet(); if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) { servletRelativeAction = pathToServlet + servletRelativeAction; } servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction)); return processAction(servletRelativeAction); } else { String requestUri = getRequestContext().getRequestUri(); ServletResponse response = this.pageContext.getResponse(); if (response instanceof HttpServletResponse) { requestUri = ((HttpServletResponse) response).encodeURL(requestUri); String queryString = getRequestContext().getQueryString(); if (StringUtils.hasText(queryString)) { requestUri += "?" + HtmlUtils.htmlEscape(queryString); } } if (StringUtils.hasText(requestUri)) { return processAction(requestUri); } else { throw new IllegalArgumentException("Attribute ''action'' is required. " + "Attempted to resolve against current request URI but request URI was null."); } } }


Prefiero usar la etiqueta BASE:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />

Entonces, todos tus enlaces pueden ser como:

<a href="admin/listPeople">Go to People List</a>


Ya que han pasado algunos años, pensé que podría ayudar a otros a buscar esto. Si está utilizando anotaciones y tiene una acción de controlador como esta, por ejemplo:

@RequestMapping("/new") //<--- relative url public ModelAndView newConsultant() { ModelAndView mv = new ModelAndView("new_consultant"); try { List<Consultant> list = ConsultantDAO.getConsultants(); mv.addObject("consultants", list); } catch (Exception e) { e.printStackTrace(); } return mv; }

en tu .jsp (ver) agregas esta directiva

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

y simplemente usar

<spring:url value="/new" var="url" htmlEscape="true"/> <a href="${url}">Nuevo consultor</a>

dónde

value del valor debe coincidir con el argumento de @RequestMapping en la acción del controlador y

var''s valor var''s es el nombre de la variable que usa para href

HIH