2009-12-07 4 views
38

Ich magWo sind die Request-Methode Konstanten in der Servlet-API?

if (POST.equals(req.getMethod())) 

statt

if ("POST".equals(req.getMethod())) 

schreiben, aber ich kann nicht die konstanten Definitionen in dem Servlet-API (nur sah in HttpServletRequest, wo ich sie erwartet zu sein) finden.

Wo sind sie (ich benutze viele Bibliotheken, also wenn jemand anderes sie definiert, würde das auch funktionieren)?

+0

ich ein bisschen herum stocherte in der Haupt-Java-Klassenbibliothek auch ein bisschen ... konnten sie dort auch nicht als Konstanten finden, auch nicht in 'java.net.HttpURLConnection'. – Powerlord

+0

Es ist wichtig, sich daran zu erinnern, dass ~ Hardcoding schlecht ist. Hardcoding-Werte können schlecht sein für (1) Lesbarkeit ("Warum hat Bob 3849 hier verwendet?") Oder (2) Fehler verursachen: Wenn Sie einen Wert an einer Stelle ändern, müssen Sie ihn ändern (und Sie ändern ihn nur) ein). Im Fall 2 sollte dieser Wert in eine Variable/Konstante geschrieben und nur einmal geändert werden. Die Verwendung von POST anstelle von "POST" schadet weder (1) noch (2), daher ist die Verwendung des Werts "hardcoded" in Ordnung. –

Antwort

20

Es scheint, dass Java EE 6, um die HTTP-Methode Namen als Konstanten hinzugefügt zur javax.ws.rs.HttpMethod-Annotationsschnittstelle. Abhängig von Ihrer Konfiguration sind sie möglicherweise für Sie verfügbar.

http://docs.oracle.com/javaee/6/api/javax/ws/rs/HttpMethod.html

+1

Nützlich, wenn Sie Jax-rs verwenden, aber Sie haben Recht, dies ist ein obskurer Ort für die Konstanten - sie sollten wahrscheinlich stattdessen in die Servlet-API verschoben werden. –

12

Soweit ich weiß, gibt es für diese spezielle Eigenschaft keine Konstanten. Sie können die full list of constants überprüfen, um zu sehen, was verfügbar ist, obwohl.

Natürlich können Sie immer Ihre eigenen Konstanten definieren, wenn es Ihren Code einfacher zu schreiben macht.

+1

Nicht in javax.servlet, dann. Seltsam, dass sie das grundlegende Zeug vermissen, aber eine Konstante von DIGEST_AUTH haben ... – Thilo

+0

Zumindest haben sie alle HTTP-Statuscodes. – Thilo

+1

@Matt Das war wahr, als Sie geantwortet haben, aber seit Java 6 existieren diese Konstanten.Bitte update :) –

12

Diese Konstanten werden als privat in Servlets, definiert

public abstract class HttpServlet extends GenericServlet 
    implements java.io.Serializable 
{ 
    private static final String METHOD_DELETE = "DELETE"; 
    private static final String METHOD_HEAD = "HEAD"; 
    private static final String METHOD_GET = "GET"; 
    private static final String METHOD_OPTIONS = "OPTIONS"; 
    private static final String METHOD_POST = "POST"; 
    private static final String METHOD_PUT = "PUT"; 
    private static final String METHOD_TRACE = "TRACE"; 
... 

Es ist einfach völlig in Ordnung ist buchstäblich den Methodennamen verwenden.

+2

das ist sehr schön, aber diese Felder sind privat !!! –

1

Wenn Sie sich fragen, warum gibt es keine Aufzählungen dafür definiert, dass in dieser Frage und Antwort erklärt ist: Why HttpRequest.HttpMethod is string instead of Enum?

Unterm Strich, die HTTP-Spezifikation beschränken nicht den Satz von Methoden erlaubt , so können zusätzliche Verfahren verwendet werden, die über diejenigen hinausgehen, die in der Spezifikation ausdrücklich erwähnt sind.

+0

Es scheint also, dass .NET diese String-Konstanten hat, denen Java fehlt. – Thilo

7

Im Frühjahr (so außerhalb JDK auch) können Sie:

org.springframework.web.bind.annotation.RequestMethod 

Dies ist ein Enum ist, die alle Methoden HTTP bietet

So können Sie RequestMethod.POST.name() verwenden

Verwandte Themen