【问题标题】:org.apache.jasper.JasperException: /WEB-INF/views/home.jsp (line: [25], column: [1]) Unable to find setter method for attribute: [commandName]org.apache.jasper.JasperException:/WEB-INF/views/home.jsp(行:[25],列:[1])找不到属性的设置方法:[commandName]
【发布时间】:2018-04-09 21:17:55
【问题描述】:

我创建了一个 spring 表单,并希望从该表单提交并显示另一个 jsp 页面。当我运行这个项目时,我得到以下异常。谁能帮我理解为什么我会收到这个错误。

org.apache.jasper.JasperException: /WEB-INF/views/home.jsp (line: [25], column: [1]) Unable to find setter method for attribute: [commandName]
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:292)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:115)
    org.apache.jasper.compiler.Generator$GenerateVisitor.evaluateAttribute(Generator.java:2998)
    org.apache.jasper.compiler.Generator$GenerateVisitor.generateSetters(Generator.java:3218)
    org.apache.jasper.compiler.Generator$GenerateVisitor.generateCustomStart(Generator.java:2404)
    org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1894)
    org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1544)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2389)
    org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2441)
    org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2447)
    org.apache.jasper.compiler.Node$Root.accept(Node.java:470)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2389)
    org.apache.jasper.compiler.Generator.generate(Generator.java:3657)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:256)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:384)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:345)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:312)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1325)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1069)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

JSP 文件:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
    <title>Home</title>
    <style>
.error {
    color: #ff0000;
}

.errorblock {
    color: #000;
    background-color: #ffEEEE;
    border: 3px solid #ff0000;
    padding: 8px;
    margin: 16px;
}
</style>
</head>
<body>
<h2>Spring's form textbox example</h2>

    <form:form method="POST" action="/customer" commandName="customer">
        <form:errors path="*" cssClass="errorblock" element="div" />
        <table>
            <tr>
                <td>Username :</td>
                <td><form:input path="userName" />
                </td>
                <td><form:errors path="userName" cssClass="error" />
                </td>
            </tr>
            <tr>
                <td colspan="3"><input type="submit" />
                </td>
            </tr>
        </table>
    </form:form>

</html>

当我使用简单的 html 表单时,它可以正常工作,但如果我通过 spring 表单进行操作,则会出现错误。

控制器类:

@Controller
public class HomeController {


    @RequestMapping("/")
    public String welcomePage()
    {
        return "home";
    }


    @RequestMapping(value="/customer", method=RequestMethod.POST)
    public ModelAndView submitForm(@RequestParam("userName") String name)
    {       
        ModelAndView mv = new ModelAndView("success");
        mv.addObject("userName", name);
        return mv;
    }
}

【问题讨论】:

  • 在需要提交表单的地方显示您的/customer 代码
  • 我已经添加了我的控制器类。除此之外,我还有一个 Customer.java 文件,其中包含一个属性 userName 及其 setter 和 getter 方法。 - @KavishMittal
  • 您没有将customer 作为控制器中的参数:这里是public ModelAndView submitForm(@RequestParam("userName") String name)。所以它显示错误
  • 我是 spring 新手,我不明白该怎么做,你能帮忙解决这个问题吗?如果我使用:public ModelAndView submitForm(@ModelAttribute("customer") Customer customer)。这也行不通。

标签: spring jsp spring-mvc


【解决方案1】:

这可以通过在表单中​​将“commandName”更改为“modelAttribute”来解决。 使用 Spring 5 jars,commandName 参数不起作用。

有关 Spring 框架 5 中的更改的更多详细信息,请访问以下链接:

https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x

【讨论】:

    【解决方案2】:

    1...OLD WAY = commandName

    <form:form action="index" commandName="todo">
    

    2...新方式 = 模型属性

      <form:form action="index" modelAttribute="todo">
    

    commandName 是旧方法,在新应用程序中您应该使用 modelAttribute

    【讨论】:

      【解决方案3】:

      在您的 HomeController.java 中,您需要显示具有相关模型的表单视图,如下所示

      @RequestMapping(value="/customer", method=RequestMethod.GET)
          public ModelAndView showForm(Model model) {
              model.addAttribute("customer",new Customer());
      }
      

      如果您使用的是 spring-webmvc 5 或最新版本,请确保将 commandName="customer" 替换为 modelAttribute="customer"。 我希望这能解决您的问题。

      【讨论】:

        【解决方案4】:

        找不到属性的setter方法:[commandName]t

        在这个异常中Spring Container想知道,你在jsp表单标签中用作“commandName”或“modelAttribute”的名称,该属性属于哪个Domain(Class)。?这意味着 commandName="customer" 客户是 instanceOf Customer 模型类。?或者它是其他..的实例?为了确保 Spring 容器,您必须在 homeController 的 WelcomePage() 方法中发送模型以查看,只需按以下方式执行即可。

        import org.springframework.ui.Model;
        @Controller
        public class HomeController {
        
            @RequestMapping("/")
            public String welcomePage(Model model)
            {
                /* i am not sure what would be youe Model name for customer change that accord to your model name */
                Customer customerInstance = new Customer();
                model.addAttribute("customer", customerInstance);
                return "home";
            }
        }
        

        你可以看到我在模型属性中添加了 2 个参数

        1. 属性名称,即客户
        2. 对象名称,即customerInstance

        模型是一个接口,它是 Spring API 库的一部分,模型接口 简单地说,模型可以提供用于渲染视图的属性。
        要为视图提供可用数据,我们只需将此数据添加到其模型对象中。此外,具有属性的地图可以与模型实例合并: If you want to know more go to this link

        【讨论】:

          【解决方案5】:

          您使用的是哪个版本的 Spring MVC?我有同样的问题,maven依赖是,

          组 id:org.springframework 工件 ID:spring-webmvc 版本:5.0.2.RELEASE

          在版本 5 之后,commandName 被删除,您应该改用 modelAttribute。 我在这里找到了,https://jira.spring.io/browse/SPR-16037

          我只是用 modelAttribute 更改了 commandName。

          <form:form modelAttribute="goal">
          

          【讨论】:

          • 在 Pluralsight 上学习“Spring MVC 简介”课程时出现此错误 - 该课程使用 Spring 3 而我使用的是 Spring 5。将“commandName”更改为“modelAttribute”解决了该问题。谢谢!
          • 工作正常!。谢谢
          【解决方案6】:

          commandName = 请求范围或会话范围内包含此表单信息的变量名称,应该是一个。

          参考:http://forum.spring.io/forum/spring-projects/web/59966-exact-meaning-of-form-form-commandname

          Spring annotation relation with <form:form commandName="xy"

          在您的customerGET 方法中,该方法显示(返回)带有表单的jsp 文件,添加模型属性如下:

          @RequestMapping(value="/customer", method=RequestMethod.GET)
              public ModelAndView showForm(Model model) {
                  model.addAttribute("customer",new Customer());
          
          }
          

          然后尝试它是否正确显示表单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-28
            • 2015-12-01
            • 2014-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多