2009-05-21 12 views
22

मैं एक वेब अनुप्रयोग को लागू करने के लिए javax.servlet.http.HttpServletRequest का उपयोग कर रहा हूं।एक HttpServletRequest में पैरामीटर कैसे सेट करें?

मुझे getParameter विधि का उपयोग कर अनुरोध के पैरामीटर को प्राप्त करने में कोई समस्या नहीं है। हालांकि मुझे नहीं पता कि मेरे अनुरोध में पैरामीटर कैसे सेट करें।

उत्तर

25

आप मानक API का उपयोग नहीं कर सकते हैं। HttpServletRequest सर्वर द्वारा प्राप्त अनुरोध का प्रतिनिधित्व करता है, और इसलिए नए पैरामीटर जोड़ना वैध विकल्प नहीं है (जहां तक ​​एपीआई का संबंध है)।

आप सिद्धांत रूप से HttpServletRequestWrapper के उप-वर्ग को कार्यान्वित कर सकते हैं जो मूल अनुरोध को लपेटता है, और getParameter() विधियों को रोकता है, और जब आप आगे बढ़ते हैं तो लिपटे अनुरोध को पास करते हैं।

आप यह तरीका अपनाते हैं, तो आप एक Filter का उपयोग करना चाहिए अपने HttpServletRequest एक HttpServletRequestWrapper साथ बदलने के लिए:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    if (servletRequest instanceof HttpServletRequest) { 
     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     // Check wether the current request needs to be able to support the body to be read multiple times 
     if (MULTI_READ_HTTP_METHODS.contains(request.getMethod())) { 
      // Override current HttpServletRequest with custom implementation 
      filterChain.doFilter(new HttpServletRequestWrapper(request), servletResponse); 
      return; 
     } 
    } 
    filterChain.doFilter(servletRequest, servletResponse); 
} 
+2

मुझे लगता है कि आप [यहां] से कार्यान्वयन हो गया (http://stackoverflow.com/questions/1046721/accessing-the- कच्चे शरीर की एक डाल या बाद के अनुरोध)। MULTI_READ_HTTP_METHODS थोड़ा उलझन में था, और अब मैं समझता हूं कि यह किस उद्देश्य से कार्य करता है, मैं पूछता हूं कि अगर आप पूरी तरह से इसे हटा दें। – Neil

15

अपने प्रश्न से, मुझे लगता है कि तुम क्या करने की कोशिश कर रहे हैं कुछ (एक वस्तु स्टोर करने के लिए है, एक स्ट्रिंग ...) RequestDispatcher() का उपयोग करके इसे किसी अन्य सर्वलेट पर फॉरवर्ड करने के लिए। ऐसा करने के लिए आप एक परमाटर लेकिन एक विशेषता

void setAttribute(String name, Object o); 

और फिर

Object getAttribute(String name); 
+5

गुण और पैरामीटर अदला-बदले नहीं हैं, और बहुत अलग अवधारणाओं का प्रतिनिधित्व करते हैं। – skaffman

+2

@ स्काफमैन लेकिन शायद वह गुणों का उपयोग करने के लिए जो कुछ चाहिए उसे हल कर सकता है - –

+2

अनुरोध को संसाधित करने के बीच में एक अनुरोध में नया पैरामीटर जोड़ने की आवश्यकता नहीं है, जवाब को संपादित करने के लिए संपादित किया जाना चाहिए कि एक विशेषता एक समाधान हो सकती है समस्या के लिए, विशेषता को सेट करने के बजाय अनुरोध में पैरामीटर सेट करता है। – Chii

17

का उपयोग कर आप वास्तव में यह करने के लिए चाहते हैं निर्धारित करने की आवश्यकता नहीं है, एक HttpServletRequestWrapper पैदा करते हैं।

public class AddableHttpRequest extends HttpServletRequestWrapper { 

    private HashMap params = new HashMap(); 

    public AddableingHttpRequest(HttpServletRequest request) { 
      super(request); 
    } 

    public String getParameter(String name) { 
      // if we added one, return that one 
      if (params.get(name) != null) { 
       return params.get(name); 
      } 
      // otherwise return what's in the original request 
      HttpServletRequest req = (HttpServletRequest) super.getRequest(); 
      return validate(name, req.getParameter(name)); 
    } 

    public void addParameter(String name, String value) { 
      params.put(name, value); 
    } 

} 
+3

विधि क्या मान्य है? – jomaora

+0

@ जेफ, क्या आप कृपया बता सकते हैं कि यह मान्य तरीका क्या है ?? –

+4

बस इसे प्रतिस्थापित करें - req.get पैरामीटर (नाम) वापस करें; – Akvel

-4

क्षमा करें, लेकिन क्यों निम्नलिखित निर्माण का उपयोग नहीं:

request.getParameterMap().put(parameterName, new String[] {parameterValue}); 
+4

क्योंकि आपको यह अपवाद मिलता है: java.lang.IllegalStateException: लॉक पैरामीटर मैप में कोई संशोधन की अनुमति नहीं है – joaopribs

संबंधित मुद्दे