java - Bean名称'loginDetails'的BindingResult或普通目标对象都不能用作请求属性

标签 java forms jsp spring-mvc

该主题已经存在于堆栈溢出中,但是我仍然无法理解该解决方案,也无法暗示我的代码。我对J2EE和Spring完全陌生。我对以下代码有一些疑问。我尝试了一个示例登录应用程序。在该jsp形式中,method = post,而在控制器方法中,request 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>


安慰:
    2014年4月9日12:27:45 PM org.apache.catalina.core.AprLifecycleListener初始化
        INFO:在java.library.path上找不到基于APR的Apache Tomcat本机库,该库可以在生产环境中实现最佳性能:C:\ Program Files \ Java \ jre7 \ bin; C:\ WINDOWS \ Sun \ Java \ bin; C:\ WINDOWS \ system32; C:\ WINDOWS; C:/ Riya / software_downloads / eclipse / jre / bin / server; C:/ Riya / software_downloads / eclipse / jre / bin; C:/ Riya / software_downloads / eclipse / jre / lib / amd64; C:\ Program Files \ Java \ jdk1.7.0_09 \ bin; C:\ Program Files \ apache-maven-3.2.1 \ bin; C:\ app \ Riya \ product \ 12.1.0 \ dbhome_1 \ bin ;; C:\ Riya \ software_downloads \ eclipse ;;。
        2014年4月9日12:27:45 PM org.apache.tomcat.util.digester.SetPropertiesRule开始
        警告:[SetPropertiesRule] {服务器/服务/引擎/主机/上下文}将属性“源”设置为“ org.eclipse.jst.jee.server:LoginForm”找不到匹配的属性。
        2014年4月9日12:27:45 org.apache.coyote.AbstractProtocol初始化
        INFO:初始化ProtocolHandler [“ http-bio-8086”]
        2014年4月9日12:27:45 org.apache.coyote.AbstractProtocol初始化
        INFO:初始化ProtocolHandler [“ ajp-bio-8009”]
        2014年4月9日12:27:45 PM org.apache.catalina.startup.Catalina负载
        INFO:初始化在440毫秒内完成
        2014年4月9日12:27:45 PM org.apache.catalina.core.StandardService startInternal
        INFO:启动服务Catalina
        2014年4月9日12:27:45 PM org.apache.catalina.core.StandardEngine startInternal
        信息:启动Servlet引擎:Apache Tomcat / 7.0.34
        2014年4月9日12:27:48 PM org.apache.catalina.core.ApplicationContext日志
        INFO:在类路径上未检测到Spring WebApplicationInitializer类型
        2014年4月9日12:27:48 PM org.apache.catalina.core.ApplicationContext日志
        INFO:初始化Spring根WebApplicationContext
        log4j:WARN找不到记录器的附加程序(org.springframework.web.context.ContextLoader)。
        log4j:WARN请正确初始化log4j系统。
        2014年4月9日,下午12:27:50 org.apache.coyote.AbstractProtocol开始
        INFO:启动ProtocolHandler [“ http-bio-8086”]
        2014年4月9日,下午12:27:50 org.apache.coyote.AbstractProtocol开始
        信息:启动ProtocolHandler [“ ajp-bio-8009”]
        2014年4月9日12:27:50 PM org.apache.catalina.startup.Catalina开始
        INFO:服务器在4270毫秒内启动
        2014年4月9日下午12:27:50 org.apache.jasper.compiler.TldLocationsCache tldScanJar
        信息:至少对一个JAR进行了TLD扫描,但其中没有TLD。为该记录器启用调试日志记录,以获取已扫描的JAR的完整列表,但未在其中找到TLD。在扫描过程中跳过不需要的JAR可以缩短启动时间和JSP编译时间。
        2014年4月9日12:27:51 PM org.apache.catalina.core.StandardWrapperValve调用
        严重:Servlet [jsp]在路径为[/ LoginForm]的上下文中的Servlet.service()引发了异常[在第14行处理JSP页面/WEB-INF/jsp/login.jsp时发生了异常

    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)


LoginController.java

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


仪表板servlet.xml

<?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>


login-servlet配置文件还具有与dashboard-servlet文件相同的内容。以前,示例代码中没有应用程序context.xml,但是出现错误,因此包含了应用程序context.xml。由于我们拥有login-servlet.xml,所以dashboard-servlet.xml的目的是什么?

最佳答案

您有一个<welcome-file>

/WEB-INF/jsp/login.jsp


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

 localhost:8087/LoginForm 


将通过<welcome-file>处理,而不经过任何Spring处理。

这样,在处理JSP时,将没有名为loginDetails的模型(或请求)属性可用。但是您的form

<form:form commandName="loginDetails" id="login" action="login.do" method="post">


需要它,以便它可以用作模板来呈现<input>元素。

代替<welcome-file>,为Web应用程序上下文的根添加处理程序方法,添加model属性,然后返回视图名称。

类似于此处的处理程序方法

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

关于java - Bean名称'loginDetails'的BindingResult或普通目标对象都不能用作请求属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22968950/

相关文章:

java - Android 从一个适配器中删除选项会改变另一个适配器

java - 验证用户的字符串类型 'menu choice'

linux - 从 ssh 启动窗口应用程序

forms - JSP - 检查表单提交

java - 设置表达式错误

java - Android 水平滚动可捕捉列表项

java - 如何动态添加可绘制对象到 TextView

javascript - 如何防止禁用 javascript 的用户提交表单?

java - 无法以正确的顺序显示来自 SQL 的数据,HTML JSP

java - HTTP POST : how to ensure it is called only from a previous page?