2012-03-14 13 views
5

मैं एक ही अनुरोध के भीतर कई दृश्य वापस करने की कोशिश कर रहा हूं, उन्हें सभी को JSON स्ट्रिंग में वापस कर रहा हूं।एक ही अनुरोध के भीतर एकाधिक विचार प्रस्तुत करें

उदाहरण:

@RequestMapping(value = "my-request") 
public void myRequest(HttpServletRequest request, HttpServletResponse response) throws Exception 
{ 
    Map<String,Object> model1 = new Hashtable<String,Object>(); 
    model1.put(...); 
    ModelAndView modelAndView1 = new ModelAndView("path/to/view1", model1); 
    // Render modelAndView1 in some way, in order to obtain the rendered HTML as a String 

    Map<String,Object> model2 = new Hashtable<String,Object>(); 
    model2.put(...); 
    ModelAndView modelAndView2 = new ModelAndView("path/to/view2", model2); 
    // Render modelAndView2 in some way, in order to obtain the rendered HTML as a String 

    // Now write a JSON String to the HttpServletResponse containing both the rendered views (strings). 
    // (this is not part of my problem, I'm able to do it as long as I have the two strings) 
} 

मैं वसंत MVC का उपयोग कर रहा टाइलें 2. साथ

किसी को भी मेरी मदद कर सकते हैं?

अद्यतन 1 - दृश्य के नाम एक ViewResolver का उपयोग कर हल कर रहे हैं:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/tiles/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

अद्यतन 2 - मैं एक github repository बना लिया है एक बहुत ही छोटी सी समस्या के पुनरुत्पादन उदाहरण हैं।

+0

तो वास्तव में आप किसी भी विचारों दिखाना चाहते हैं न, लेकिन अपने ग्राहक के लिए एक स्ट्रिंग पारित? – Stefan

+0

जिन तारों के बारे में मैं बात कर रहा हूं वे एचटीएमएल को तारों के रूप में प्रस्तुत कर रहे हैं (तदनुसार मूल प्रश्न बदल दिया गया है) – satoshi

+0

यदि आपकी उपयोग करने वाली टाइलें एक समग्र दृश्य में टाइल दृश्यों को जोड़ती हैं और इसके नाम पर रीडायरेक्ट करती हैं। – Stefan

उत्तर

6

अद्यतन: आपकी समस्या को हल करने के लिए कुछ दृष्टिकोण हैं। मैं इसे आजमाउंगा, लेकिन शायद क्लीनर तरीके हैं।

@Component 
public class JsonMultipleViewFactory { 

    @Autowired private List<ViewResolver> viewResolverList; 

    public View getView(List<ModelAndView> mavList) { 
     for (ModelAndView mav : mavList) { 
      if (mav.getView()==null) { 
       mav.setView(resolve(mav.getViewName())); 
      } 
     } 
     return new JsonMultipleView(mavList); 
    } 

    private View resolve(String viewName) { 
     for (ViewResolver vr : viewResolverList) { 
      View view = vr.resolve(viewName, LocaleContextHolder.getLocale()); 
      if (view!=null) { 
       return view; 
      } 
     } 
     return null; 
    } 
} 

public class JsonMultipleView implements View { 

    private final List<ModelAndView> mavList; 

    public JsonMultipleView(List<ModelAndView> mavList) { 
     this.mavList = mavList; 
    } 

    public String getContentType() { 
     return "application/json"; 
    } 

    public void render(Map<String,?> model, HttpServletRequest request, HttpServletResponse response) { 
     Json json = new Json(); // You can use several Json libraries here 
     for (ModelAndView mav : mavList) { 
      MockHttpServletResponse mockResponse = new MockHttpServletResponse(); 
      mav.getView().render(mav.getModel(), request, mockResponse); 
      json.add(mav.getViewName(), mockResponse.getContentAsString()); 
     } 
     json.write(response.getOutputStream()); 
     response.getOutputStream().close(); 
    } 
} 

और इस तरह इस्तेमाल किया जा सकता:

@Autowired private JsonMultipleViewFactory jsonMultipleViewFactory; 

@RequestMapping(value = "my-request") 
public View myRequest() { 
    ... 
    List<ModelAndView> mavList = new ArrayList<ModelAndView>(); 
    mavList.add(modelAndView1); 
    mavList.add(modelAndView2); 
    return jsonMultipleViewFactory.getView(mavList); 
} 
+0

धन्यवाद! यह काम करता है :) – satoshi

+0

रुको। मुझे 'NullPointerException' मिलता है क्योंकि' mav.getView() 'शून्य वापस आता है, क्या आप जानते हैं क्यों? 'ModelAndView की तरह मेरे उदाहरण में बिल्कुल बनाई गई है। धन्यवाद! – satoshi

+0

'getView() 'doc से:" व्यू ऑब्जेक्ट को वापस करें, या शून्य अगर हम व्यूअरसेवर द्वारा एक व्यूअरसेवर द्वारा हल किए जाने वाले दृश्य नाम का उपयोग कर रहे हैं। "... मैं इससे कैसे बच सकता हूं? – satoshi

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