2011-08-07 18 views
20

Piszę aplikację internetową za pomocą Spring MVC. Używam adnotacje dla kontrolerów itp Wszystko działa dobrze, z wyjątkiem, jeśli chodzi o rzeczywistych powiązań we wniosku (działania formularzy, <a> tagi, etc.) prąd, mam to (oczywiście w skrócie):Spring MVC Request URLs w JSP

//In the controller 
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET) 

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

Po bezpośrednim wpisaniu adresu URL, np. "Http: // localhost: 8080/MyApp/admin/listPeople", strona ładuje się poprawnie. Jednak powyższy link nie działa. Utrata nazwy aplikacji "MyApp".

Czy ktoś wie, czy istnieje sposób, aby skonfigurować Spring, aby rzucić na nazwę aplikacji tam?

Daj mi znać, jeśli chcesz zobaczyć dowolną z moich konfiguracji Spring. Używam standardowego serwletu dyspozytora z funkcją rozpoznawania widoku itp.

+1

Jest to możliwe na wiosnę 3,0 '">People' –

Odpowiedz

43

Należy wstawić ścieżkę kontekstu do swoich łączy.

+0

+1 Dzięki, pomyślałem o tym, ale wolę zrobić to z Spring jakoś. –

+2

Nie ma metody "Spring" to zrobić :) Jedyną opcją, która oszczędza przed dodaniem $ {contextPath} do twoich linków jest wdrożenie twojej aplikacji jako root, tak, że jest to ścieżka kontekstowa "/" (jak opisał Kevin); ale nie poleciłbym tego podejścia, ponieważ spowoduje uzależnienie aplikacji od jej wdrożenia. – craftsman

+0

Jest także sposób z server.xml, jeśli dobrze pamiętam. – Kevin

0

Zwykle konfiguruję tomcat tak, aby używał kontekstowego katalogu głównego z "/" lub wdrażał wojnę jako ROOT.war. Tak czy inaczej nazwa wojny nie staje się częścią adresu URL.

6

wolę używać BASE tag:

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

Następnie wszystkie linki mogą być tak:

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

Radzę przeczytać to przed użyciem tagu base: http://stackoverflow.com/questions/1889076/is-it-recommended-to-use-the-base-html-tag –

13

Znacznik c:url dołączy ścieżkę kontekstowe do adresu URL. Na przykład:

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

Alternatywnie wolę używać względnych adresów URL w jak największym stopniu w moich aplikacjach Spring MVC. Jeśli strona ma numer /MyApp/index, link <a href="admin/listPeople"> przeniesie mnie na stronę listPeople.

Działa to również, gdy użytkownik znajduje się głębiej w hierarchii adresów URL. Możesz użyć .., aby przejść z powrotem do wyższego poziomu. Tak więc na stronie pod adresem /MyApp/admin/people/aPerson, podoba się powrót do strony z listą:

0

Można użyć servletRelativeAction. Nie jestem pewien, jakie wersje są dostępne (używam obecnie wersji 4.0.x) i nie widziałem zbyt wiele dokumentacji na ten temat, ale jeśli spojrzeć na kod wspierający formularz wiosenny, prawdopodobnie można się domyślić. Po prostu upewnij się, że ścieżka, którą mijasz zaczyna się od "/".

Przykład:

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

See 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."); 
     } 
    } 
} 
4

jak właśnie stara się znaleźć odpowiedź na to pytanie, a to to pierwszy wynik Google.

Można to zrobić teraz za pomocą MvcUriComponentsBuilder

Jest to część 4.0 wersja od Spring MVC

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

The metody konieczna jest fromMappingName

Z dokumentacji:

Tworzenie URL z nazwą żądanie mapowania MVC wiosny kontrolera metody. Skonfigurowana metoda HandlerMethodMappingNamingStrategy określa nazwy mapowań żądań metod kontrolera podczas uruchamiania. Domyślnie wszystkie odwzorowania mają przypisaną nazwę opartą na wielkich literach nazwy klasy, a następnie "#" jako separator, a następnie nazwę metody. Na przykład "PC# getPerson" dla klasy o nazwie PersonController z metodą getPerson. W przypadku, gdy konwencja nazewnictwa nie zapewnia unikalnych wyników, jawna nazwa może być przypisana poprzez atrybut nazwy adnotacji @RequestMapping.

Ma to na celu przede wszystkim zastosowanie w technologiach renderowania widoku i wyrażeniach EL. Biblioteka znaczników Spring URL rejestruje tę metodę jako funkcję o nazwie "mvcUrl".

Na przykład, biorąc pod uwagę to sterownik:

@RequestMapping("/people") 
class PersonController { 

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

} 

JSP można przygotować URL sposobu sterownik w następujący sposób:

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

<a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a> 
Powiązane problemy