2012-04-15 18 views
2

我有一個控制器從search.jsp中的表單獲取ID。我希望它重定向到entitydemo.jsp,它應該能夠訪問EntityDemo並輸出它的屬性。我怎麼做?我是否需要使用重定向並以某種方式將EntityDemo作爲會話屬性?讓我的第一個Spring webapp工作

@Controller 
public class SearchEntityController { 

    @RequestMapping(value = "/search", method = RequestMethod.GET) 
    public EntityDemo getEntityDemoByID(@ModelAttribute("search") Search search, BindingResult result) { 
    EntityDemo entityDemo = null; 
    if (search.getId() != null) { 
     int id = Integer.parseInt(search.getId()); 
     entityDemo = DBHelper.getEntityDemo(id); 
    } 
    return entityDemo; 
    } 
} 

回答

0

我得到它通過兩種方法在我的控制器的工作 - 一個以顯示形式和另一個用於搜索結果

控制器:

@Controller 
public class SearchEntityController { 

    @RequestMapping(value = "/search", method = RequestMethod.GET) 
    public void searchForm(Model model) { 
    model.addAttribute(new Search()); 
    } 

    @RequestMapping(value = "/entitydemo", method = RequestMethod.POST) 
    public void showSearchResult(@ModelAttribute Search search, Model model) { 
    model.addAttribute("entityDemo", getEntityDemo(search)); 
    } 

    // code to load entity here 
} 

(搜索是一類具有一個int id和存取)

形式在search.jsp的:

<form:form action="entitydemo" commandName="search"> 
    ID: <form:input path="id" /> 
</form:form> 

在entitydemo中顯示結果。jsp:

<core:out value="${entityDemo.foo}" /> <br/> 
<core:out value="${entityDemo.bar}" /> 
6

假設你有一些類名爲EntityDemo這對於所有字段GettersSetters,我認爲你應該做的事情,像這樣:

@Controller 
public class SearchEntityController { 

    @RequestMapping(value = "/search", method = RequestMethod.GET) 
    public ModelAndView getEntityDemoByID(@ModelAttribute("search") Search search, BindingResult result) { 
    EntityDemo entityDemo = null; 
    Map<String, Object> model = new HashMap<String, Object>(); 
    if (search.getId() != null) { 
     int id = Integer.parseInt(search.getId()); 
     entityDemo = DBHelper.getEntityDemo(id); 
     model.put("entityDemo", entityDemo); 
    } 

    return new ModelAndView(new RedirectView(pageIWantToRedirectTo), model); 
    } 
} 

然後,在你的JSP,你可以使用JSTL並做這樣的事情:${entityDemo.name},其中name是一個字段,我假設EntityDemo類與適當的Getter一起,這是public String getName(){return this.name;}

據我所知,控制器方法不返回整個對象,他們要麼返回String值,其表示視圖的名稱,如\foo\bar\myPage.jsp否則,整個ModelAndView對象(有2種類型的對象,其中一人全稱爲portlet,另一個爲servlet,在這種情況下,您必須使用全名爲servlet的那個。爲了清楚起見,當我說全名時,我的意思是包含它所在的包的名稱。如果內存爲我服務,那麼你正在尋找的是springframework...servlet.ModelAndView或類似的東西

編輯:如果你想重定向提交時,您需要製作2個控制器,一個將呈現表單,另一個將在表單提交後重定向。

關於您的JSP頁面,您應該有一個xml文件名稱dispatcher-servlet.xml。名稱可能不同,具體取決於您在web.xml中的配置,但它們都具有<servletname>-servlet.xml的結構。應該有一個名爲viewResolver的屬性(雖然應該是這種情況,但某些IDE不會爲您提供太多的功能)另一方面,NetBeans IDE等IDE爲您設置了大部分初始配置。這是另一個控制器,它會影響您的views。它的作用是自動追加在您的控制器中指定的名稱前後的項目。通常它會附加pages/jsp/的前綴和.jsp的後綴。因此,如果您的頁面的路徑爲pages/jsp/myPage.jsp,則您需要通過控制器的網頁將爲myPage。頁面的完整路徑將由視圖解析器構造。如果您傳遞整個網址,它仍然會繼續添加內容,因此即使您指定了正確的路徑,也仍然無法找到該網頁。

+0

@Michael:我修改了我的答案。春天的XML文件非常重要,在大多數情況下,這將是您的解決方案無法正常工作的原因。一旦你掌握了它,你會發現Spring將加速你的發展。 – npinti 2012-04-15 11:10:46

+0

乾杯。我終於搞定了。實際上,我使用兩種方法使用一個控制器 - 一種是將表示表單的類放在模型(用於表單頁面)上,另一種將實體加載並放在模型(用於結果頁面)上。 – Michael 2012-04-15 21:18:26

+0

@邁克爾:是的,你是正確的,你可以有多個方法使用相同的類(控制器)。很高興我的回答有幫助。 – npinti 2012-04-16 05:03:47

相關問題