让我的第一个Spring webapp工作

时间:2012-04-15 08:30:35

标签: java spring spring-mvc

我有一个控制器从search.jsp中的表单中获取ID。我希望它重定向到entitydemo.jsp,它应该能够访问EntityDemo并输出其属性。我怎么做?我是否需要使用重定向并以某种方式将EntityDemo作为会话属性?

@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;
  }
}

2 个答案:

答案 0 :(得分: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;}

据我所知,Controller方法不返回整个对象,它们返回表示视图名称的String值,例如\foo\bar\myPage.jsp或其他整个ModelAndView对象(有两种类型的对象,其中一种具有portlet的全名,另一种具有servlet。在这种情况下,您必须使用其全名具有servlet的对象。为了清楚起见,当我说出全名时,我的意思是包含它所在的包的名称。如果记忆对我很好,那么你正在寻找的就是springframework...servlet.ModelAndView或类似的东西。

编辑:如果你想在提交时重定向,那么你需要制作2个控制器,一个将呈现表单,另一个将在提交表单后重定向。

关于JSP页面,您应该有一个xml文件名dispatcher-servlet.xml。名称可能会有所不同,具体取决于web.xml中的配置,但它们的结构均为<servletname>-servlet.xml。应该有一个名为viewResolver的属性(虽然应该是这种情况,某些IDE不会为您填充太多。另一方面,IDE等Netbeans会为您设置大部分初始配置)。这是另一个控制器,它作用于views。它的作用是自动附加您在控制器中指定的view名称之前和之后的项目。通常它会附加前缀pages/jsp/和后缀.jsp。因此,如果您有一个包含以下路径pages/jsp/myPage.jsp的网页,则您需要传入控制器的所有内容都是myPage。页面的完整路径将由视图解析器构建。如果您传入整个URL,它仍会继续添加内容,因此即使您指定了正确的路径,仍无法找到该页面。

答案 1 :(得分:0)

我在控制器中使用2种方法让它工作 - 一种用于显示表单,另一种用于搜索结果

控制器:

@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}" />