2014-09-29 49 views
1

我的任務是創建我的控制器而不是在方法簽名處傳遞任何參數。 我很困惑,因爲這是相當的挑戰,我沒有真正看到任何網絡上的例子。 例如:從我的jsp頁面。spring-mvc:如何在控制器中傳遞mvc中沒有方法參數的參數

<form:form method="POST" action="/project/searchResults" id="productSearchResultsForm"> 
     <input name="productRecord" id="productRecord" /> 
     <input name="resultEntity" id="resultEntity" type="hidden" /> 
     <input name="resultCode" id="resultCode" type="hidden" /> 
     <button type="submit" class="btn btn-primary btn-lg">Submit</button> 
    </form:form> 

我想將這三個輸入傳遞給我的控制器,而不在方法簽名處使用@RequestParameter和@ModelAttribute。截至目前,這是我知道如何做到這一點的唯一途徑。

@RequestMapping(value = "/productSearch", method = RequestMethod.GET) 
public ModelAndView init(@ModelAttribute ("showroomCode") String showroomCode, HttpServletRequest request) { 


    logger.info("<<<< initial page <<<<<<"); 
    logger.info("Showroom Code : " + showroomCode); 

    HttpSession session = request.getSession(); 

    ModelAndView model = new ModelAndView("productSearch", "command", 
      String.class); 


    ShowroomUser user = new ShowroomUser(); 
    user.setUserId(1); 
    session.setAttribute("usersession", user); 
    session.setAttribute("showroomCode", showroomCode); 

    logger.info(">>>>> initial page >>>>> "); 
    return model; 
} 

我知道,在Struts 2中,你可以在Action類中聲明全局變量,這樣可以自動的方法使用,而不必從字面上把他們在方法簽名。有沒有辦法刪除這個?

謝謝。

更新

我不願使用HttpServlet的請求和模型屬性在代碼中所有的任何地方。 :( 請幫忙!

+1

您的控制器的同一個實例用於所有請求,有一個全局變量的解決方案不會與併發請求正常工作... – Adam 2014-09-29 13:47:07

+0

感謝亞當,你會知道的任何如何在spring-mvc中執行此操作? – 2014-09-29 13:48:58

+0

您可以將HttpServletRequest請求添加到您的方法,然後使用一系列request.getParameter()調用,如果您擔心您的方法有太多的參數... – Adam 2014-09-29 13:54:46

回答

2

1)用你的屬性productRecord,resultEntity,resultCode創建一個表單POJO。實施例MyForm.java

2)設置這種形式在模型(在你的init方法)實施例:model.addAttribute("myForm", new MyForm())

3)在JSP形式聲明集: <form:form commandName="myForm" >

4)在控制器(檢索結果) @RequestMapping(value = "/productSearch", method = RequestMethod.POST) public ModelAndView postForm(MyForm myForm, HttpServletRequest request) {...}

然後,您可以使用myForm.getProductRecord()例如訪問值。

+0

謝謝,你認爲有可能做到這一點,而無需使用模態屬性和HttpSevlet請求? – 2014-09-30 02:32:01

+0

對於GET方法,您必須在模型中設置信息才能在jsp中使用它。對於POST方法,您至少需要一個參數來檢索表單值。 HttpServletRequest參數不是必需的,但是您必須使用Model。如果您不能使用HttpServletRequest或Model,那麼您可以使用什麼來發送/檢索數據? – 2014-09-30 06:36:46

+0

這就是我不知道的以及我正在研究的內容,因爲這是我的老闆認爲是加速表現的最優化方式。:( – 2014-09-30 12:11:36

0

我不知道你爲什麼想這樣做.. 但是,Spring將請求作爲ThreadLocal公開。您可以在當前線程上訪問它,但不能傳遞任何衍生線程。

這裏就是你要做的:

@RequestMapping("/whatever") 
public ModelAndView controllerMethod() { 
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest(); 

// Do as you want with the request without having to pass it in 
} 
相關問題