Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 1
  • 352

Podczas  webinarium poświęconemu Spring MVC padło pytanie: "jeśli byśmy chcieli wysłać  po akcji submit do innego kontrolera, to jakbyśmy musieli zmienić wartość dla znacznika form"?

Można to ująć bardziej ogólnie: "W jaki sposób należy tworzyć linki od kontrolerów i zasobów w aplikacji webowej"? Aplikacja na serwerze może być uruchomiona na tzw. ROOT - czyli kontrolery i zasoby będą dostępne po znaku "/" bezpośrednio po nazwie domeny  (np. http://spring-test.altkom.pl/home.htm) - wtedy sprawa jest dość prosta. Wystarczy podawać linki względne, rozpoczynające się od znaku "/" (np. /home.htm).   Jednak bardzo często na jednym serwerze działa więcej niż jedna aplikacja webowa, wtedy każda z nich dostępna jest przez podanie nazwy aplikacji po nazwie domeny. Twórca aplikacji powinien zadbać o to, aby działała niezależnie od tego, jak zostanie uruchomia na serwerze. W jaki sposób tworzyć prawidłowo linki tak, aby działały niezależnie od sposobu wdrożenia aplikacji na serwerze? 

Uczestnik szkolenia
  • Zapytał
  • @ Uczestnik szkolenia | 09.04.2014

Odpowiedzi (2)

  • 0

Bardzo często wystarczające jest używanie adresów w postaci bezwzględnej, np.:

<form:form commandName="product" action="save.htm">


Oznacza to: wyślij formularz pod adres kontrolera save.htm w tej samej lokalizacji względnej, co kontroler wyświetlający stronę z formularzem. Jeśli więc kontroler, który wyświetla formularz jest dostępny pod adresem: http://spring-mvc.altkom.pl/aplikacja-web/products/add.htm, to powyższy kod HTML spowoduje wysłanie danych z formularza pod adres: http://spring-mvc.altkom.pl/aplikacja-web/products/save.htm. To bardzo często jest dokładnie tym, czego oczekujemy. W tym przypadku użycie adresu rozpoczynającego się od "/" spowoduje problem, wysłanie formularza pod niewłaściwy adres: http://spring-mvc.altkom.pl/add.htm.

 

Co zrobić, jeśli chcemy wysłać formularz lub linkować do kontrolera o innym adresie względnym?

Jest kilka rozwiązań - w tym tylko dwa są naprawdę dobre. 

Sposób pierwszy: używać wartości zmiennej ${pageContext.request.contextPath} przed nazwą kontrolera, np:
 

<form:form commandName="product" action="${pageContext.request.contextPath}/inny_kontroler/save.htm">


To rozwiązanie sprawdza się bardzo dobrze do linkowania zasobów w połączeniu ze znacznikiem <base href="":

<base href="${pageContext.request.contextPath}/">


 Sposób drugi:którego używam najczęściej wszędzie tam, gdzie jest to możliwe, to użycie tag'a <c:url/> biblioteki standardowej JSTL.  Nazwę tego znacznika łatwiej zapamiętać niż nazwę zmiennej pageContext.request.contextPath:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<a href="<c:url value="/home.htm"/>">link do /aplikacja-web/home.htm</a>


Niestety, to rozwiązanie nie działa w połączeniu ze znacznikiem <form:form/>, sprawdzi się dla linków i zwykłych formularzy HTML.

 

  • Odpowiedział
  • @ | 09.04.2014
  • TRENER ALTKOM AKADEMII
  • 3

Dla tagu c:url można wykorzystać atrybut var i następnie za pomocą EL odczytać adres strony:

<c:url value="/home.htm" var="home" />
<form:form action=${home}>

 

kwadrat85
  • Odpowiedział
  • @ kwadrat85 | 16.04.2014
    • 5
    • 0
    • 0