স্প্রিং এমভিসি - স্প্রিং কন্ট্রোলারে মানচিত্রে সমস্ত অনুরোধের প্যারাম কীভাবে পাবেন?


183

নমুনা ইউআরএল:

../search/?attr1=value1&attr2=value2&attr4=value4

আমি attr1, att2, এবং attr4 এর নাম জানি না।

আমি অনুরোধের পরম নামের মানচিত্রের মানচিত্রটিতে অ্যাক্সেস না করে যতক্ষণ না আমার কাছে (বা অনুরূপ, যত্ন নেই) ততক্ষণ কিছু করতে সক্ষম হতে চাই:

@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request, 
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}

আমি কীভাবে স্প্রিং এমভিসি দিয়ে এটি অর্জন করতে পারি?

উত্তর:


310

অন্য উত্তরগুলি সঠিক হলেও এটি অবশ্যই HttpServletRequest অবজেক্টটি সরাসরি ব্যবহার করার "স্প্রিং ওয়ে" নয়। উত্তরটি আসলে বেশ সহজ এবং আপনি যদি স্প্রিং এমভিসির সাথে পরিচিত হন তবে আপনি কী প্রত্যাশা করবেন

@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
   return "viewName";
}

41
আপনি যদি একই নামের চেকবক্সের একটি গ্রুপের মতো তালিকা মানগুলি প্রক্রিয়া করতে চান তবে ব্যবহার করুন: @RequestParam MultiValueMap<String, String>
আইসডড্যান্ট

1
এর জন্য ধন্যবাদ. আপনি শিরোনাম দিয়েও
রব ওয়ারসনপ

3
এটি কেবল তখনই কাজ করছে যখন অনুরোধের পদ্ধতিটি জিইটি বা পোস্ট হয়। এটি পুট, ডিলিট ইত্যাদি অনুরোধ পদ্ধতির জন্য কাজ করছে না।
জর্জ সিগগ্রোগলৌ 18

import org.springframework.ui.ModelMap;পাশাপাশি যুক্ত করতে ভুলবেন না
ট্রুথহোল্ডার

ModelMapমানচিত্র হিসাবে সমস্ত অনুরোধের প্যারামগুলি পাওয়ার জন্য @typelogic এর প্রয়োজন নেই; এটি কেবল ওপির কোড সম্পর্কিত একটি বিশদ।
xlm

34

সম্পাদন করা

এটি চিহ্নিত করা হয়েছে যে সেখানে একটি বিশুদ্ধ স্প্রিং এমভিসি প্রক্রিয়া রয়েছে ( কমপক্ষে 3.0 হিসাবে ) রয়েছে যার মাধ্যমে কেউ এই ডেটা পেতে পারে। আমি এখানে এটি বিশদ করব না, কারণ এটি অন্য ব্যবহারকারীর উত্তর। দেখুন @ AdamGent এর উত্তর জানার জন্য, এবং ভুলবেন না এটা ভোট দিন করতে।

স্প্রিংয়ের ৩.২ ডকুমেন্টেশনে এই প্রক্রিয়াটি RequestMappingজাভাডক পৃষ্ঠা এবং জাভাক ডক পৃষ্ঠায় উভয় ক্ষেত্রেই উল্লেখ করা হয়েছে RequestParam, তবে পূর্বে এটি কেবল RequestMappingপৃষ্ঠাটিতে উল্লেখ করা হয়েছে । 2.5 ডকুমেন্টেশনে এই প্রক্রিয়াটির কোনও উল্লেখ নেই।

এটি সম্ভবত বেশিরভাগ বিকাশকারীদের পক্ষে পছন্দসই পদ্ধতির কারণ HttpServletRequestএটি সার্লেলেট-এপিআই জারের দ্বারা সংজ্ঞায়িত বস্তুর সাথে আবদ্ধ (অন্তত এটি) সরিয়ে দেয় ।

/ সম্পাদনা

এর মাধ্যমে আপনার কাছে অনুরোধ ক্যোয়ারী স্ট্রিংয়ের অ্যাক্সেস থাকা উচিত request.getQueryString()

GetQueryString ছাড়াও, মানচিত্র হিসাবে অনুরোধ. getParameterMap () থেকে কোয়েরি প্যারামিটারগুলিও পুনরুদ্ধার করা যেতে পারে ।


12
আমি সন্দেহ করি যে কেউ এই উত্তরটিকে হ্রাস পেয়েছে কারণ getQueryString কোনও মানচিত্র নয়, একটি স্ট্রিং প্রদান করে। বিকল্পটি পরামিতিগুলির মানচিত্রের সন্ধান করছিল। এটিকে আরও সঠিক করতে সহায়তা করতে আমি আপনার উত্তরে getParameterMap যুক্ত করেছি :) +1
jmort253

না আমি হ্রাস পেয়েছি কারণ এটি করার জন্য স্প্রিং এমভিসি উপায় নয়। @RequestParamআনন্দের সাথে Mapপ্যারামিটার হিসাবে নেবে (আমার উত্তর দেখুন)।
অ্যাডাম জেন্ট

@ অ্যাডামজেন্ট প্রশ্নটি এমন সময়ে জিজ্ঞাসা করা হয়েছিল যখন স্প্রিং ৩.২ এখনও প্রকাশিত হয়নি। ফিরে যান এবং 3.1 জন্য JavaDoc কটাক্ষপাত করা, এবং আপনি লক্ষ্য করবেন ব্যবহার এমন কোনো উল্লেখ নেই @RequestParamএকটি উপর Map<String,String>সব কোয়েরি স্ট্রিং পরামিতি পুনরুদ্ধার করতে। আর দয়া করে মনে হয় না তাই উত্তর আপনি এখানে দেখতে বেশি ঘৃণা ... তারা না যে খারাপ :) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/...
নিকোলাস। hauschild

আমি মনে করি এটি 3.1 তে বিদ্যমান ছিল তবে জাভাডোসড ছিল না। আমি বলিনি যে আমি ঘৃণা করি কিন্তু হতবাক যে পথটি@RequestParam Map<> হয়নি। স্প্রিং এমভিসি (স্প্রিং ৩.১ এবং তার চেয়েও বেশি) দেখেছি এমন অনেকগুলি আধুনিক প্রকল্পগুলিতে আমার সামান্য বিরক্তি আছে তারা প্রতিটি পদ্ধতির উপরে এইচটিটিপি সার্ভেলেকুয়েস্ট এবং এইচটিটিপি সার্লেটরেসপোনস রাখবে। এবং এটি মনে হয় কারণ জুনিয়র বিকাশকারীরা ডকটির দিকে না তাকিয়ে স্ট্যাকওভারফ্লো এবং গুগল ব্যবহার করে। এটি স্প্রিং প্রকল্পের জন্য নেটলেট এপিআই বলতে সার্লেট এপিআই থেকে স্যুইচ করা কঠিন করে তোলে। জ্যাকস-আরএসে একই ধরনের আপত্তিজনক সমস্যা রয়েছে তবে অনেক কম ডিগ্রীতে।
অ্যাডাম জেন্ট

এবং এটি 3.1 তে জাভাডোসড ঠিক সমস্ত সঠিক জায়গায় নয়: " অতিরিক্তভাবে, @ অনুরোধ প্যারামিটারগুলিতে অ্যাক্সেস পাওয়ার জন্য @RequestParam একটি মানচিত্র <স্ট্রিং, স্ট্রিং> বা মাল্টিভ্যালাপ ম্যাপ <স্ট্রিং, স্ট্রিং> পদ্ধতি প্যারামিটারে ব্যবহার করা যেতে পারে। " প্রকৃতপক্ষে এটি সংস্করণ 3.0.০ এ ফিরে যায় (আমি জানতাম আমি এটি ৩.১ এর আগে ব্যবহার করেছি)। আমার বিরক্তি এখনও দাঁড়িয়ে আছে যে লোকেরা গবেষণা করে বিরক্ত করেনি :)
অ্যাডাম জেন্ট

14

HttpServletRequest অবজেক্টটি ইতিমধ্যে পরামিতিগুলির মানচিত্র সরবরাহ করে। দেখুন request.getParameterMap () আরো বিস্তারিত জানার জন্য।


1
প্যারামিটার মানচিত্র পান একটি পোষ্ট অনুরোধ থেকে ফর্ম ডেটা থাকবে। যদি ব্যবহারকারী কোয়েরি স্ট্রিংয়ের কীগুলি জানেন না, তবে কীভাবে তারা ক্যোরিয় স্ট্রিং থেকে এসেছে এবং কোনও পোষ্ট বডি থেকে প্রাপ্ত ডেটা থেকে কী পার্থক্য করতে সক্ষম হবে?
নিকোলাস.হসচিল্ড

আপনি কি আমাকে বলছেন যে আপনি একটি ফর্ম পোস্ট প্রসেস করতে চলেছেন তবে প্রকৃত ফর্মের পরামিতিগুলি কী তা আপনার কোনও ধারণা নেই?
কেভিন

2
প্রশ্নটিতে বলা হয়েছে যে প্যারামিটারের নামগুলি তিনি জানেন না। এছাড়াও, আমি জানি না তারা কী হয়। ;)
নিকোলাস.হসচিল্ড

দুঃখিত আমি কিছুটা হাস্যকর মনে করি।
কেভিন

11
এটি একটি ডেটা চালিত অ্যাপ্লিকেশনটিতে অর্থবোধ করে। এক যেখানে অনুরোধ পাথ এবং ক্যোয়ারী স্ট্রিংগুলি ক্লায়েন্ট তৈরি করতে পারে এবং অ্যাপ্লিকেশন সার্ভারটি এই পাথগুলি এবং কী হিসাবে স্ট্রিংগুলিকে কী হিসাবে ব্যবহার করে সংশ্লিষ্ট মানটি (কোনও ডেটা উত্স থেকে কোনও ধরণের থেকে) সন্ধান করবে।
নিকোলাস.হসচিল্ড

12

আপনি কেবল এটি ব্যবহার করতে পারেন:

Map<String, String[]> parameters = request.getParameterMap();

এটা ঠিক কাজ করা উচিত


10

মানচিত্রে অনুরোধের পরম পাওয়ার সহজ উদাহরণ এখানে।

 @RequestMapping(value="submitForm.html", method=RequestMethod.POST)
     public ModelAndView submitForm(@RequestParam Map<String, String> reqParam) 
       {
          String name  = reqParam.get("studentName");
          String email = reqParam.get("studentEmail");

          ModelAndView model = new ModelAndView("AdmissionSuccess");
          model.addObject("msg", "Details submitted by you::
          Name: " + name + ", Email: " + email );
       }

এই ক্ষেত্রে, এটি যথাযথভাবে নাম এবং ইমেল ভেরিয়েবলের সাথে ছাত্র নাম এবং ছাত্র ইমেলের মান আবদ্ধ করবে।


8

org.springframework.web.context.request.WebRequestআপনার নিয়ামক পদ্ধতিতে একটি প্যারামিটার হিসাবে ব্যবহার করুন , এটি পদ্ধতিটি সরবরাহ করে getParameterMap(), সুবিধাটি হ'ল আপনি নিজের অ্যাপ্লিকেশনটি সার্লেট এপিআইতে আঁটেন না, ওয়েবরয়েভেস্ট জাভাএই প্যাটার্ন কনটেক্সট অবজেক্টের একটি উদাহরণ।


6

দুটি ইন্টারফেস আছে

  1. org.springframework.web.context.request.WebRequest
  2. org.springframework.web.context.request.NativeWebRequest

নেটিভ সার্ভলেট / পোর্টলেট API এর সাথে সম্পর্ক ছাড়াই জেনেরিক অনুরোধের প্যারামিটার অ্যাক্সেসের পাশাপাশি request/sessionঅ্যাট্রিবিউট অ্যাক্সেসের অনুমতি দেয় ।

প্রাক্তন .:

@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
    Map<String, String[]> params = webRequest.getParameterMap();
    //...
}

PS আর্গুমেন্ট সম্পর্কে ডক্স রয়েছে যা নিয়ামক প্যারাম হিসাবে ব্যবহার করা যেতে পারে।


ধন্যবাদ এটি কাজ করে। আমি জিজ্ঞাসা করতে পারি, String[]মান হিসাবে বিন্দু কি ? আমি মান পেতে কেবল এটি 0 এ সূচক করতে হবে।
ট্রুথহোল্ডার

মানগুলির একটি অ্যারে থাকতে পারে key=val1,val2বা key=val1&key=val2(যদি আমি স্মরণে এই দুটি স্বরলিপি সঠিকভাবে মনে করি) তাই আপনি 2 টি উপাদান সহ অ্যারে পাবেন
katoquro

6

আমি পার্টিতে দেরি করতে পারি, তবে আমার বোঝাপড়া অনুসারে আপনি এরকম কিছু খুঁজছেন:

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}

2
@SuppressWarnings("unchecked")
Map<String,String[]> requestMapper=request.getParameterMap();
JsonObject jsonObject=new JsonObject();
for(String key:requestMapper.keySet()){
    jsonObject.addProperty(key, requestMapper.get(key)[0]);
}

সমস্ত প্যারাম সংরক্ষণ করা হবে jsonObject


1

ক্যোয়ারী প্যারামিটার এবং পাথ পরামিতিগুলির মধ্যে মৌলিক পার্থক্য রয়েছে। এটি এর মতো হয়: www.your_domain?queryparam1=1&queryparam2=2- ক্যোয়ারী প্যারামিটারগুলি। www.your_domain/path_param1/entity/path_param2- পথের পরামিতি।

আমি যে অবাক করেছিলাম তা হ'ল স্প্রিং এমভিসি বিশ্বে প্রচুর লোক একে অপরের জন্য বিভ্রান্ত করে। ক্যোয়ারী প্যারামিটারগুলি অনুসন্ধানের মাপদণ্ডের মতো হলেও, পথের প্যারামগুলি সম্ভবত অনন্যভাবে কোনও উত্স সনাক্ত করবে। এটি বলার পরে, এর অর্থ এই নয় যে আপনার ইউআরআইতে আপনার একাধিক পাথ প্যারামিটার থাকতে পারে না, কারণ সংস্থানটির কাঠামোটি নীস্ট করা যায়। উদাহরণস্বরূপ, আসুন ধরা যাক আপনার কোনও নির্দিষ্ট ব্যক্তির একটি নির্দিষ্ট গাড়ী সংস্থান দরকার:

www.my_site/customer/15/car/2 - 15 তম গ্রাহকের দ্বিতীয় গাড়ি খুঁজছেন।

সমস্ত পাথের পরামিতিগুলিকে মানচিত্রে রাখার জন্য ইউসকেস কী হবে? পাথ প্যারামিটারগুলির কোনও "কী" থাকে না যখন আপনি নিজেই কোনও ইউআরআই দেখেন, মানচিত্রের অভ্যন্তরে থাকা এই কীগুলি আপনার @ ম্যাপিং টীকা থেকে নেওয়া হবে, উদাহরণস্বরূপ:

@GetMapping("/booking/{param1}/{param2}")

HTTP / REST দৃষ্টিকোণ থেকে পাথের পরামিতিগুলি কোনও মানচিত্রে প্রকৃতপক্ষে অনুমান করা যায় না। আমার মতে স্প্রিংয়ের নমনীয়তা এবং কোনও বিকাশকারীকে মিটানোর জন্য তাদের আকাঙ্ক্ষা সম্পর্কে এটি সবই।

আমি কখনই পথের পরামিতিগুলির জন্য কোনও মানচিত্র ব্যবহার করব না, তবে এটি ক্যোয়ারী প্যারামিটারগুলির জন্য বেশ কার্যকর হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.