2012-04-15 17 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

相关问题