我正在尝试使用Java,Spring,Hibernate和MySQL制作简单的CRUD Web应用程序.我遇到的问题是我无法显示表单以向数据库添加新项目(比萨饼).
这是我的控制器:
import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.support.SessionStatus; @Controller public class PizzaController { @Autowired private PizzaDao pizzaDao; @RequestMapping(method=RequestMethod.GET, value="/") public String indexPage(Model model) { Listpizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); return "index"; } @RequestMapping(method=RequestMethod.GET, value="Pizza/pizzalist") public String pizzalist(Model model) { List pizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); return "pizzalist/pizzalist"; } @RequestMapping(method=RequestMethod.POST, value="Pizza/pizzalist/add") public String add(@ModelAttribute("mypizza") Pizza pizza) { //, BindingResult result, SessionStatus status, ModelMap mmap) { //mmap.addAttribute("pizza",pizza); pizzaDao.add(pizza); //status.setComplete(); return "pizzalist/pizzalist"; } @RequestMapping(method=RequestMethod.GET, value="Pizza/pizzalist/delete") public String delete(@RequestParam("id")long id, Model model) { pizzaDao.delete(id); List pizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); return "pizzalist/pizzalist"; } @RequestMapping(method=RequestMethod.POST, value="Pizza/edit") public String edit(Model model) { List pizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); return "pizzalist/pizzalist"; } }
并查看:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ include file="/WEB-INF/jsp/includes.jsp"%>Available pizzas List of All Pizzas
${p.name} | ${p.price} | Delete |
Name | |
Price | |
当我只留下显示链接"删除"的可用比萨饼的表格时,一切都显示确定,删除也可以正常工作.
我觉得表单和控制器@ModelAttribute有问题,但我找不到什么是错误的,我在控制器中添加相同的属性,如表单 - "mypizza",这应该有用(至少从我能找到的内容)在谷歌上).
有人可以启发什么阻止此应用程序工作以及如何解决问题?如果需要其他配置文件,我可以提供它们.
UPD:
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'mypizza' available as request attribute org.springframework.web.servlet.support.BindStatus.(BindStatus.java:141) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:179) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:199) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:165) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:152) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:143) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:127) org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421) org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142) org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:103) org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) org.apache.jsp.WEB_002dINF.jsp.pizzalist.pizzalist_jsp._jspx_meth_form_005finput_005f0(pizzalist_jsp.java:243) org.apache.jsp.WEB_002dINF.jsp.pizzalist.pizzalist_jsp._jspx_meth_form_005fform_005f0(pizzalist_jsp.java:194) org.apache.jsp.WEB_002dINF.jsp.pizzalist.pizzalist_jsp._jspService(pizzalist_jsp.java:103) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
Shay Elkayam.. 8
在这个方法上:
@RequestMapping(method=RequestMethod.GET, value="/") public String indexPage(Model model) { Listpizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); return "index"; }
你应该添加以下行:
model.addAttribute("mypizza", new Pizza());
在form:form
需要对应于您所定义的的ModelAttribute一个"空"的模式.
如果modelAttribute
中<form:form
不可用,而形式呈现.然后异常会提出,在你的情况下mypizza
是不可用的,异常说同样的:
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'mypizza' available as request attribute
您可以以任何您喜欢的方式添加模型bean /表单支持对象:
使用@ModelAttribute("mypizza")
:
@ModelAttribute("mypizza") public Pizza loadEmptyModelBean(){ return new Pizza(); }
在您的情况下,@ModelAttribute("mypizza")
选项是完美的,而不是添加每个方法在一个地方添加它.
或者在GET
方法中(@Shay Elkayam回答说的相同):
@RequestMapping(method=RequestMethod.GET, value="/") public String indexPage(Model model) { List<Pizza> pizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); model.addAttribute("mypizza", new Pizza());// model bean added to use in form return "index"; }
如果你不这样做,那么Neither BindingResult nor plain target object for bean name 'mypizza' available
异常会提高.
在这个方法上:
@RequestMapping(method=RequestMethod.GET, value="/") public String indexPage(Model model) { List<Pizza> pizzas = pizzaDao.getAll(); model.addAttribute("pizzas", pizzas); return "index"; }
你应该添加以下行:
model.addAttribute("mypizza", new Pizza());
在form:form
需要对应于您所定义的的ModelAttribute一个"空"的模式.