当前位置: 首页 > 知识库问答 >
问题:

bean名称'login details'的BindingResult和普通目标对象都不能作为请求属性使用

燕野
2023-03-14

这个主题已经存在于堆栈溢出,但我仍然不能理解解决方案,也不能在我的代码中暗示。我对J2EE&Spring是全新的。我对下面的代码有很少的疑问。我尝试了一个示例登录应用程序。在jsp表单中,method=post和controller方法请求method=get。我对这个变体感到困惑(在示例代码中曾这样提到)。如果我移除form:input标记,就可以看到没有输入框的login.jsp页面。在配置文件中,我们需要包含commandName属性?我已经粘贴了控制台、jsp页面、配置文件和java类代码。

login.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
 <title>Cable Vision UserLogin </title>
</head>
<body>
  <form:form commandName="loginDetails" id="login" action="login.do" method="post">
       <table>
         <tr>
           <td colspan="3"><h3>Cable Vision UserLogin</h3></td>
         </tr>
          <tr>
          <td><label>UserName</label></td>
          <td><form:input path="userName"></form:input></td>
          <td><font color="red"><form:errors path="userName"></form:errors></font></td>
          </tr>
          <tr>
            <td><label>Password</label></td>
            <td><form:input path="Password"></form:input></td>
            <td><font color="blue"><form:errors path="Password"></form:errors></font></td>
          </tr>
          <tr>
            <td colspan="2" align="center"><input type="submit" value="Login"></td>
            <td></td>
          </tr>
          <tr>
            <td colspan="3" align="center"><font color="red"><form:errors/></font></td> 
          </tr>  
       </table>
       </form:form>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SpringMVC</display-name>
  <servlet>
  <servlet-name>login</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>login</servlet-name>
  <url-pattern>/login.jsp</url-pattern>
  </servlet-mapping>
  <servlet>
  <servlet-name>dashboard</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>dashboard</servlet-name>
  <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
  <welcome-file>/WEB-INF/jsp/login.jsp</welcome-file>
  </welcome-file-list>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>
          org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  </web-app>
    11:          </tr>
    12:           <tr>
    13:           <td><label>UserName</label></td>
    14:           <td><form:input path="userName"></form:input></td>
    15:           <td><font color="red"><form:errors path="userName"></form:errors></font></td>
    16:           </tr>
    17:           <tr>


    Stacktrace:] with root cause
    java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'loginDetails' available as request attribute
        at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:179)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:199)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:165)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:152)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:143)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:127)
        at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421)
        at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
        at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:103)
        at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
        at org.apache.jsp.WEB_002dINF.jsp.login_jsp._jspx_meth_form_005finput_005f0(login_jsp.java:234)
        at org.apache.jsp.WEB_002dINF.jsp.login_jsp._jspService(login_jsp.java:107)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
package com.spring.login.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.ValidationUtils;
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.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

import com.spring.login.model.LoginModel;
import com.spring.login.service.LoginService;

@Controller
@RequestMapping(value="/login")
public class LoginController {

    private LoginModel loginModel;

    @Autowired
    private LoginService loginService;

    //this method will load the login.jsp when the application starts

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView init()
    {
        loginModel=new LoginModel();
        return new ModelAndView("login","loginDetails",loginModel);
    }

    //this method will be called when we are going to submit the login details
    //if this fails, it will be displayed in the same page, in case of success it is redirected to success page
    public ModelAndView login(@ModelAttribute("loginDetails")LoginModel loginModel,BindingResult bindingResult,HttpServletRequest request,HttpServletResponse response)
    {
        try
        {
            //spring validation utils for checking empty fields
            ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult, "userName","userName","Username cannot be empty");
            ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult, "passWord","passWord","Password cannot be empty");

            if (bindingResult.hasErrors())
            {
                //returning errors on same page if any errors.
                return new ModelAndView("login","loginDetails",loginModel);
            }
            else
            {
                //if the userdetails is validated then redirecting to success jsp
                //else returning to the same page
                if(loginService.validate(loginModel))
                {
                    request.getSession().setAttribute("user",loginModel);
                    RedirectView redirectView=new RedirectView("Success.do",true);
                    return new ModelAndView(redirectView);
                }
                else
                {
                    bindingResult.addError(new ObjectError("Invalid","Invalid Credentials. "+"Username or Password is incorrect. "));
                    return new ModelAndView("login","loginDetails",loginModel);
                }
            }
            } catch (Exception e)
            {
                System.out.println("Exception in LoginController "+e.getMessage());
                e.printStackTrace();
                return new ModelAndView("login","loginDetails",loginModel);
            }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation=
          "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

            <context:component-scan base-package="com.spring.login"/>
            <mvc:annotation-driven/>
            <bean id="jspViewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass"
                      value="org.springframework.web.servlet.view.JstlView"/>
             <property name="prefix" value="/WEB-INF/jsp/"/>
             <property name="suffix" value=".jsp"/>
            </bean>
           </beans>

共有1个答案

都才俊
2023-03-14

您有一个

/WEB-INF/jsp/login.jsp

这意味着对应用程序上下文根的请求,例如

 localhost:8087/LoginForm 

将通过 处理,而不经过任何Spring处理。

因此,在处理JSP时,您将没有名为logindetails的模型(或请求)属性可用。但您的表单

<form:form commandName="loginDetails" id="login" action="login.do" method="post">
@RequestMapping(method=RequestMethod.GET)
public ModelAndView init()
{
    loginModel=new LoginModel();
    return new ModelAndView("login","loginDetails",loginModel);
}
 类似资料: