2009-12-07 25 views
38

Tôi muốn viếtHằng số phương thức yêu cầu trong API Servlet ở đâu?

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

thay vì

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

nhưng tôi không thể tìm thấy các định nghĩa liên tục trong API Servlet (chỉ nhìn vào HttpServletRequest, nơi tôi mong đợi họ được).

Chúng ở đâu (Tôi đang sử dụng nhiều thư viện, vì vậy nếu ai đó định nghĩa thư viện, chúng cũng sẽ hoạt động)?

+0

Tôi chọc xung quanh một chút trong thư viện lớp Java chính một chút, quá ... không thể tìm thấy chúng như là hằng số ở đó, hoặc thậm chí trong 'java.net.HttpURLConnection'. – Powerlord

+0

Điều quan trọng cần nhớ là ~ tại sao ~ hardcoding là xấu. Giá trị mã hóa có thể xấu (1) khả năng đọc ("Tại sao Bob sử dụng 3849 ở đây?") Hoặc (2) gây ra lỗi: khi thay đổi giá trị tại một vị trí sẽ yêu cầu bạn thay đổi giá trị đó trong một vị trí khác (và bạn chỉ thay đổi nó trong một). Trong trường hợp 2, giá trị này nên được đặt trong một biến/hằng số và chỉ thay đổi một lần. Sử dụng POST thay vì "POST" không làm tổn thương hoặc (1) hoặc (2), do đó, sử dụng giá trị "hardcoded" là tốt. –

Trả lời

20

Dường như Java EE 6 thêm các tên phương thức HTTP như hằng vào giao diện chú thích javax.ws.rs.HttpMethod. Tùy thuộc vào thiết lập của bạn, chúng có thể có sẵn cho bạn.

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

+1

Hữu ích nếu bạn đang sử dụng Jax-rs, nhưng bạn nói đúng, đây là một vị trí tối nghĩa cho các hằng số - chúng có lẽ sẽ được chuyển vào api Servlet để thay thế. –

12

Theo như tôi biết, không có bất kỳ hằng số nào cho thuộc tính cụ thể đó. Bạn có thể kiểm tra các full list of constants để xem những gì có sẵn, mặc dù.

Tất nhiên, bạn luôn có thể xác định các hằng số của riêng mình nếu nó giúp mã của bạn dễ viết hơn.

+1

Không có trong javax.servlet, sau đó. Thật lạ lùng khi chúng bỏ lỡ những thứ cơ bản, nhưng có hằng số DIGEST_AUTH ... – Thilo

+0

Ít nhất chúng có tất cả các mã trạng thái HTTP. – Thilo

+1

@Matt Điều này đúng khi bạn trả lời nhưng kể từ Java 6, các hằng số đó tồn tại.Vui lòng cập nhật :) –

12

Những hằng số được định nghĩa là tư nhân trong Servlet,

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"; 
... 

Đó là hoàn toàn tốt đẹp chỉ sử dụng tên phương pháp theo nghĩa đen.

+2

điều này rất hay, nhưng những trường đó là riêng tư !!! –

1

Nếu bạn tự hỏi tại sao không có bất kỳ sự đếm được xác định cho điều này, đó là giải thích trong câu hỏi này và câu trả lời: Why HttpRequest.HttpMethod is string instead of Enum?

Bottom line, spec HTTP không hạn chế việc tập hợp các phương pháp cho phép , vì vậy các phương pháp bổ sung có thể được sử dụng ngoài các phương pháp được đề cập rõ ràng trong thông số kỹ thuật.

+0

Vì vậy, có vẻ như .NET có các hằng số String mà Java thiếu. – Thilo

7

Trong mùa xuân (để bên ngoài JDK, quá), bạn có thể sử dụng:

org.springframework.web.bind.annotation.RequestMethod 

Đây là một enum mà cung cấp tất cả các phương pháp HTTP

Vì vậy, bạn có thể sử dụng RequestMethod.POST.name()

Các vấn đề liên quan