我是Spring annotation和MVC的新手。我的第一页是home.jsp,现在它没有在Tomcat服务器中出现我在控制台的末尾显示错误。 我试图创建一个非常简单的注释应用程序。这是控制器。
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
@Controller
//@RequestMapping()
public class UserLoginController {
public UserLoginController(){
}
//@RequestMapping(value="/get" , method = RequestMethod.GET)
//@ModelAttribute("user")
public String get(final ModelMap model) {
User userForm = new User();
model.addAttribute("userLogin", userForm);
return "form";
}
@RequestMapping(value="/home.jsp", method = RequestMethod.POST)
public String post(Model model) {
String test=" inside here";
return "success";
}
}
这是JSP
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page session="false" %>
<%@ include file="/WEB-INF/views/header.jsp" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>iBank - Home-version 2.0</title>
</head>
<body>
<h1 align="center">Welcome to iBank-Dhiren</h1>
<h2 align="center">Your Online Bank Portal</h2>
<p align="center">
Today is ${today}.<br/>
<a href="<%=request.getContextPath()%>/admin.htm">Modified Administration Site-version-1.0 </a>
</p>
</body>
</html>
<p>
<form:form method="post" commandName="user">
<div>
<form:label path="name">Name:</form:label>
<form:input path="name"/>
<form:errors path="name" />
</div>
<div>
<form:label path="email">Email:</form:label>
<form:input path="email" />
<form:errors path="email" />
</div>
<div>
<input type="submit" value=" OK "/>
</div>
</form:form>
</p>
</html>
现在如何提交JSP应该是UserLoginController。我无法在注释值之间看到任何连接,并且我的Tomcat服务器也会返回此错误。
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' 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:174)
由于 Dhiren
好的,我无法再进一步了。我尝试了所有但仍然完全陷入困境。
我的JSP home.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page session="false" %>
<%@ include file="/WEB-INF/views/header.jsp" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>iBank - Home-version 2.0</title>
</head>
<body>
<h1 align="center">Welcome to iBank-Dhiren</h1>
<h2 align="center">Your Online Bank Portal</h2>
<p align="center">
Today is ${today}.<br/>
<a href="<%=request.getContextPath()%>/admin.htm">Modified Administration Site-version-1.0 </a>
</p>
</body>
</html>
<p>
<form:form method="post" action="/user.jsp" modelAttribute="user">
<div>
<form:label path="firstName">Name:</form:label>
<form:input path="firstName"/>
<form:errors path="firstName" />
</div>
<div>
<form:label path="password">Password:</form:label>
<form:input path="password" />
<form:errors path="password" />
</div>
<div>
<form:label path="middleName">Middle name:</form:label>
<form:input path="middleName" />
<form:errors path="middleName" />
</div>
<div>
<form:label path="lastName">LastName:</form:label>
<form:input path="lastName" />
<form:errors path="lastName" />
</div>
<div>
<input type="submit" value=" OK "/>
</div>
</form:form>
</p>
</html>
我的UserLoginController
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
@Controller
//@RequestMapping()
public class UserLoginController {
public UserLoginController(){
}
//@RequestMapping(value="/get" , method = RequestMethod.GET)
//@ModelAttribute("user")
public String get(final ModelMap model) {
User userForm = new User();
model.addAttribute("userLogin", userForm);
return "form";
}
@RequestMapping(value="/user.jsp", method = RequestMethod.POST)
public String post(final User user, final BindingResult result, Model mv) {
String test=" inside here";
return "success";
}
}
用户类
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
public class User {
/* @NotEmpty
@Size(max = 20)
*/
private String userId;
/*@NotEmpty
@Size(max = 20)
*/
private String password;
private String firstName;
private String middleName;
private String lastName;
//private int userAccessLevel;
/**
* @return the userId
*/
public String getUserId() {
return userId;
}
/**
* @param userId the userId to set
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the firstName
*/
public String getFirstName() {
return firstName;
}
/**
* @param firstName the firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* @return the middleName
*/
public String getMiddleName() {
return middleName;
}
/**
* @param middleName the middleName to set
*/
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
/**
* @return the lastName
*/
public String getLastName() {
return lastName;
}
/**
* @param lastName the lastName to set
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* @return the userAccessLevel
*
public int getUserAccessLevel() {
return userAccessLevel;
}
*/
/**
* @param userAccessLevel the userAccessLevel to set
*
public void setUserAccessLevel(int userAccessLevel) {
this.userAccessLevel = userAccessLevel;
}*/
}
这些是context.xml文件 servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- Imports user-defined @Controller beans that process client requests -->
<context:component-scan base-package="mytest.apps" />
</beans:beans>
有人可以告诉我为什么home.jsp没有出现
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>appServlet</display-name>
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
当我尝试访问Web应用程序的第一页时出现所有这些错误,我在Tomcat中收到此错误。
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned where no TLDs were found. Skipping JAR scanning can improve startup time and JSP compilation time.
log4j:ERROR Attempted to append to closed appender named [console].
Sep 14, 2011 10:02:39 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' 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:174)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
at org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
at org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
at org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
.
.
Sep 14, 2011 10:02:39 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/AdministrativeApplication] threw exception [An exception occurred processing JSP page /WEB-INF/views/home.jsp at line 25
22: <form:form method="post" action="/user.jsp" modelAttribute="user">
23:
24: <div>
25: <form:label path="firstName">Name:</form:label>
26: <form:input path="firstName"/>
27: <form:errors path="firstName" />
28: </div>
Stacktrace:] with root cause
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
请帮忙
由于 Dhiren
答案 0 :(得分:1)
class User() {
String name;
String email;
//bean getters and setters
}
public String post(Model model, User user) {
....
}
我几天前刚刚开始使用弹簧绑定。
您设置的方式我相信您的表单会尝试使用“email”和“name”属性创建“User”对象。
修改的
我想我理解这个问题......
<form:form method="post" commandName="user">
这告诉你,你想用来自用户对象的数据预先填充表单。如果这是你想要做的,那么你需要为jsp提供一个名为“user”的请求属性。
如果您尝试使用该表单提交数据,我认为是这种情况,我认为您要使用此代码
<form:form method="post" modelAttribute="user">
答案 1 :(得分:1)
model.addAttribute("**userLogin**", userForm); // in controller
return "form"; //in controller
在JSP中你应该给
form:form method="post" action="/user.jsp" modelAttribute="userLogin"
(而不是modelAttribute/commandName="user"
)
试试这个你不会
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute" expection.
答案 2 :(得分:1)
这很简单............
model.addAttribute("**user**",userForm );
这意味着,您的命令名称应与modelAttribute名称完全相同... 所以如果你的jsp文件中的命令名是&#34; user&#34;那么你的模型应该添加名为&#34; user&#34;。
的属性答案 3 :(得分:0)
您的post()
方法应该将命令对象作为其参数之一:
public String post(final User user, final BindingResult result) {
在这种情况下,在发布数据后,表单中的字段name
和email
将分别绑定到user.name
和user.email
。
答案 4 :(得分:0)
在get方法中,添加命令对象
public String get(final ModelMap model) {
User userForm = new User();
model.addAttribute("command", userForm);
return "form";
}
答案 5 :(得分:0)
“commandName”用于绑定表单中的模型和数据。 如果你有类(MODEL)定义如下:
public class UserQuery {
public String message;
public String getMessage()
{
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
JSP文件(DATA):
<prefix:form method="POST" commandName="UserQuery">
<sf:input path="message" /><br/>
<input type="submit"/>
</prefix:form>
和GET / POST控制器:
@Controller
public class ContactController {
@RequestMapping(value="/Contact",method=RequestMethod.GET)
ModelAndView Contact(Model model)
{
model.addAttribute("UserQuery",new Query());
return new ModelAndView("contactView");
}
@RequestMapping(value="/Contact",method=RequestMethod.POST)
ModelAndView Contact()
{
//Here you can get you're attribute and render it
// in other view
return new ModelAndView("contactFormFiledView");
}
}
GET方法 - &gt;用于创建属性“UserQuery”并将其与模型“查询”绑定,这是您的类。通过绑定我的意思是:如果用户单击表单中的提交按钮,表单中的数据将传递给“commandName”中指定的属性。
答案 6 :(得分:0)
解决您的第一个问题。 将home.jsp保存在webapp部分的resources文件夹下。 对servlet-xml文件进行适当的更改,如下所示。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>resources/views/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
在控制器中添加一个方法来处理主页的请求。
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String displayLogin(Model model) {
model.addAttribute("login", new Login());
System.out.println("Returning index page");
return "index";
}
您的新网址将是这样的http://localhost:8080/ProjectName/home
确保在上面提到的displayLogin方法中添加model.addAttribute("login", new Login());
。
这应该有所帮助
问候
BinoyC