2015-11-06 4 views
7

Wiem, jak się upewnić, czy w adresie URL istnieje określony parametr. Chciałbym się upewnić, że nie ma parametru ani żadnego parametru w adresie URL, a nie tylko podanym. Jak mogę to zrobić? Mam długą listę parametrów i wygląda na nieefektywną, aby mieć listę warunków dla wszystkich z nich.Jak upewnić się, że w adresie URL nie ma żadnych parametrów?

Przykładowy URL: www.domain.com/Product/UniqueId

Jak każdy produkt posiada wiele unikalnych parametrów, użytkownicy mogą dotrzeć do strony produktu przez, unikalnym kodem, niepowtarzalnym dostawcy, unikalnym, niepowtarzalnym SIG etc pod produktów.

Na przykład:

www.domain.com/Product/UniqueId?code=uniqueCode 
www.domain.com/Product/UniqueId?sig=uniqueSig 
www.domain.com/Product/UniqueId?pod=uniquepod 
www.domain.com/Product/UniqueId?circle=circleNumber&location=Location&color=Color 

pytania, które znalazłem istotne, ale nie przydatne w moim przypadku były 1, 2, 3, 4

muszę zrobić takie badanie w JSP nie Java.

+0

@markspace co masz na myśli przez klasę URL? czy dałbyś mi przykład? – Jack

Odpowiedz

4

nawiązanie

z nowym wymogiem, że to musi być zrobione w JSP, mimo że kod Wiosna obsługi wymienionych w oryginale odpowiedź poniżej może dodać atrybut Model z odpowiednimi informacjami, oto jak to zrobić.

podobne dwa sposoby jak poniżej:

<!-- Use the parameter Map --> 
<c:if test="${empty param}"> 
    <!-- no query parameters given --> 
</c:if> 
<!-- Use the request object --> 
<c:if test="${pageContext.request.queryString == null}"> 
    <!-- no query parameters given --> 
</c:if> 

Original odpowiedzi

Ty oznaczone spring-mvc, więc oznacza to, że mają coś takiego (byłoby miło, gdyby opublikowałeś):

@Controller 
public class ProductController { 

    @RequestMapping("/Product/UniqueId") 
    public String uniqueId(Model model, 
          @RequestParam(path="code" , required=false) String code, 
          @RequestParam(path="sig"  , required=false) String sig, 
          @RequestParam(path="pod"  , required=false) String pod, 
          @RequestParam(path="circle" , required=false) String circle, 
          @RequestParam(path="location", required=false) String location, 
          @RequestParam(path="color" , required=false) String color) { 
     // code here 
    } 
} 

Oto dwa sposoby sprawdzania „bez parametrów zapytania”:

// Get all parameters in a Map 
public String uniqueId(Model model, 
         ..., 
         @RequestParam Map<String, String> allParams) { 
    if (allParams.isEmpty()) { 
     // no query parameters given 
    } 
    // code here 
} 
// Use the request object 
public String uniqueId(Model model, 
         ..., 
         HttpServletRequest request) { 
    if (request.getQueryString() == null) { 
     // no query parameters given 
    } 
    // code here 
} 

Możesz chcieć sprawdzić ten link do wszystkich różnych typów parametrów, które Wiosna da ci:
http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-arguments

+0

Dzięki, ale muszę wykonać takie testy w jsp nie Java. – Jack

+0

@Jack To dlaczego, na litość, oznaczyłeś go 'spring-mvc', jeśli nie chcesz go używać. Spring handler może wykonać logikę i dodać 'Boolean' do modelu, wskazując, czy parametry były obecne. – Andreas

+0

@Andreas Nie jestem pewien, dlaczego otrzymałem połowę nagrody zamiast ciebie. Jeśli chcesz, możesz o to zapytać, bo tak naprawdę nie rozumiem, najlepiej –

5

To działa na nieco łatwiejsze z klasy URI:

import java.net.MalformedURLException; 
import java.net.URI; 
import java.net.URISyntaxException; 

public class UrlTest2 
{ 

    public static void main(String[] args) 
      throws MalformedURLException, URISyntaxException 
    { 
     URI url = new URI("www.domain.com/Product/UniqueId"); 
     System.out.println(url.getQuery()); // prints "null" 
     URI url2 = new URI("www.domain.com/Product/UniqueId?pod=uniquepod"); 
     System.out.println(url2.getQuery()); // prints "pod=uniquepod" 
    } 
} 

Więc jeśli getQuery() zwrotów null istnieją żadne parametry. W przeciwnym razie są.

Odnośnie edycji: Nie polecam umieszczania kodu wewnątrz strony JSP. W dzisiejszych czasach uważa się za złą praktykę.

Ale jeśli musisz, wygląda na to, że możesz poprosić o wszystkie parametry i jeśli wynik wynosi 0, nie było żadnych.

<% 
    Map params = request.getParameterMap(); 
    boolean noParams = (params.getSize() == 0); 
%> 

Kod JSP nie jest testowany, ale powinien dać ci pomysł. Następnie można użyć wartości boolowskiej noParams później w kodzie JSP.

+0

Dzięki, ale muszę wykonać takie testy w jsp nie Java. – Jack

+0

@Jack Naprawdę nie powinieneś mieć kodu, który testujesz w widoku (JSP). Widoki powinny być co najwyżej cienkie. Przenieś kod do serwletu, gdzie można go przetestować. – markspace

2

Nie wiesz, co masz na myśli, mówiąc "aby upewnić się, że nie ma żadnego parametru" ... po prostu nie możesz, klienci mogą użyć adresu URL, który chcą trafić na serwer. Możesz wybrać przetwarzanie tylko na podstawie ciągu URL otrzymanego przez Twój kod serwera.

W przeciwnym razie, oto dwa wskaźniki:

  1. starasz się sprawdzić lub analizowania URL? Jeśli tak można zrobić: url.indexOf ('?') < 0, zakładając url varialble ma cały ciąg url ...

  2. zobaczyć także Java API URL, aby uzyskać ciąg kwerendy itp

+0

Dzięki, ale muszę zrobić takie testy w jsp nie Java. – Jack

2

JSP przechowuje niejawny obiekt o nazwie paramValue, który odwzorowuje parametry żądania na tablicę. Można użyć tego obiektu, a JSTL length funkcja do nauki liczbę parametrów bezpośrednio w JSP, coś jak

<c:if test="${fn:length(paramValues) gt 0}">...</c:if> 

upewnij się, że obejmują następujące taglibs na początku swojej strony jsp

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

Możemy łatwo sprawdzić parametry za pomocą Regex. Powiedzmy, że masz następujące adresy URL:

www.domain.com/Product/UniqueId?foo=bar 
www.domain.com/Product/UniqueId 

Teraz rzeczywisty adres URL może być dowolny. Możemy oznaczyć go jako . *, co oznacza wszystko. (Kropka = dowolny znak, * = zero lub więcej razy. Istnieją bardziej złożone wyrażenia regularne w celu sprawdzenia adresów URL, ale podano, że podano adresy URL, dlatego nie są one istotne).

Po dopasowaniu adresu URL, chcesz sprawdzić parametry. Parametry są w składni:

?key=value&key=value&key=value... 

Dlatego chcemy, aby sprawdzić znakiem zapytania, a następnie za pomocą kombinacji klawiszy i wartości.Regex byłoby:

\?((.*=.*)(&?))+ 

który pasuje znak zapytania, a następnie: (. ) klucza, znak równości, wartości i ewentualnej &, 1 lub więcej (). (&?) razy (+)

dzięki czemu można umieścić go w sposób tak:

public boolean hasParameters(String url){ 
    return url.matches(".*\\?((.*=.*)(&?))+"); 
} 

www.domain.com/Product/UniqueId?foo=bar będzie pasować do wyrażenia regularnego, a www.domain.com/Product/UniqueId nie będzie, ponieważ nie są śledzone przez parametry.

P.S: Podwójny ukośnik przed znakiem zapytania jest wynikiem java, a nie w ramach regex.

Link: Regex checker with the following regex & example

Jeśli chcesz użyć go w JSP, wystarczy umieścić tę metodę w scriplet (rozpoczęte z <% i zakończył%>), lub gdziekolwiek indziej w kodzie faktycznie.

2

Użyj metod dostępnych pod numerem java.net.URI, aby uzyskać wszystkie informacje o adresie URL.

Powiązane problemy