- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于这些类型的问题,这是一个广泛的规范问题解答。
我正在尝试编写一个Spring MVC Web应用程序,用户可以在其中将电影名称添加到内存集合中。像这样配置
public class Application extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {};
}
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { SpringServletConfig.class };
}
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
@Configuration
@ComponentScan("com.example")
public class SpringServletConfig extends WebMvcConfigurationSupport {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
}
@Controller
包中只有一个
com.example
类
@Controller
public class MovieController {
private final CopyOnWriteArrayList<Movie> movies = new CopyOnWriteArrayList<>();
@RequestMapping(path = "/movies", method = RequestMethod.GET)
public String homePage(Model model) {
model.addAttribute("movies", movies);
return "index";
}
@RequestMapping(path = "/movies", method = RequestMethod.POST)
public String upload(@ModelAttribute("movie") Movie movie, BindingResult errors) {
if (!errors.hasErrors()) {
movies.add(movie);
}
return "redirect:/movies";
}
public static class Movie {
private String filmName;
public String getFilmName() {
return filmName;
}
public void setFilmName(String filmName) {
this.filmName = filmName;
}
}
}
WEB-INF/jsps/index.jsp
包含
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Movies</title>
</head>
<body>
Current Movies:
<c:forEach items="${movies}" var="movieItem">
<ul>
<li>${movieItem.filmName}</li>
</ul>
</c:forEach>
<form:form>
<div>Movie name:</div>
<form:input path="filmName" type="text" id="name" />
<input type="submit" value="Upload">
</form:form>
</body>
</html>
/Example
。当我发送GET请求到
http://localhost:8080/Example/movies
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:117)
org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
org.apache.jsp.WEB_002dINF.jsps.index_jsp._jspx_meth_form_005finput_005f0(index_jsp.java:267)
org.apache.jsp.WEB_002dINF.jsps.index_jsp._jspx_meth_form_005fform_005f0(index_jsp.java:227)
org.apache.jsp.WEB_002dINF.jsps.index_jsp._jspService(index_jsp.java:142)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
<form>
(用于
Movie
名称和提交按钮),我可以使用它来发送带有新
Movie
的POST请求。为什么JSP servlet却无法呈现Spring的
<form:form>
标签?
最佳答案
您正在尝试使用Spring MVC's form tag。
此标记呈现HTML form
标记,并公开到的绑定路径。
内部标签进行绑定。它将命令对象放入PageContext
以便可以通过内部标签访问命令对象。 [..]
假设我们有一个名为User
的域对象。它是一个JavaBean
具有firstName
和lastName
之类的属性。我们将其用作
返回form.jsp
的表单控制器的表单支持对象。
换句话说,Spring MVC将提取命令对象并将其类型用作绑定path
内部标签(例如form
或input
)的checkbox
表达式的蓝图,以呈现HTML form
元素。
此命令对象也称为模型属性,其名称在form
标记的modelAttribute
或commandName
属性中指定。您已经在JSP中省略了它
<form:form>
<form:form modelAttribute="some-example-name">
<form:form commandName="some-example-name">
command
(您在错误消息中看到的内容)。模型属性是对象,通常是POJO或POJO的集合,您的应用程序将其提供给Spring MVC堆栈,并且Spring MVC堆栈将其公开给您的视图(即MVC中的M到V)。
ModelMap
中的所有模型属性(它们都有名称),对于JSP,将它们转移到
HttpServletRequest
属性,在此JSP标签和EL表达式可以访问它们。
@Controller
处理到路径
GET
的
/movies
处理程序方法添加了一个模型属性
model.addAttribute("movies", movies); // not named 'command'
index.jsp
。然后,此JSP尝试渲染
<form:form>
...
<form:input path="name" type="text" id="name" />
...
</form:form>
FormTag
(实际上是
InputTag
)试图查找名为
command
(默认属性名称)的模型属性,以便它可以生成带有
<input>
属性的HTML
name
元素。来自
path
表达式和相应的属性值,即
Movie#getFilmName()
的结果。
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute
Movie
POJO简单地正确构造表单,可以使用以下命令显式添加模型属性
model.addAttribute("movie", new Movie());
@RequestMapping(path = "/movies", method = RequestMethod.GET)
public String homePage(@ModelAttribute("command") Movie movie, Model model) {...}
@ModelAttribute
类中包含带有
@Controller
注释的方法
@ModelAttribute("command")
public Movie defaultInstance() {
Movie movie = new Movie();
movie.setFilmName("Rocky II");
return movie;
}
@Controller
处理的每个请求,将返回的对象隐式添加到其模型属性中。
form
标记更适合从具有实际值的现有对象中呈现HTML
<form>
。如果您只想创建一个空白的
<form>
,则可能更适合自己构造而不依赖任何模型属性。
<form method="post" action="${pageContext.request.contextPath}/movies">
<input name="filmName" type="text" />
<input type="submit" value="Upload" />
</form>
POST
处理程序方法仍将能够提取
filmName
输入值并将其用于初始化
Movie
对象。
FormTag
默认情况下会查找名为
command
或具有
modelAttribute
或
commandName
中指定名称的模型属性。确保使用正确的名称。
ModelMap
具有
addAttribute(Object)
方法,该方法添加
Map
提供的属性。
Class
的无大写字母的简称
com.myapp.Product
变为
product
;
com.myapp.MyProduct
变为
myProduct
;
com.myapp.UKProduct
UKProduct
@RequestMapping
supported return types之一,请确保生成的名称符合您的期望。
@Controller
方法。典型的Spring MVC应用程序遵循以下模式:
DispatcherServlet
选择
@RequestMapping
方法来处理请求
DispatcherServlet
将模型属性添加到
HttpServletRequest
,并将请求转发到与视图名称相对应的JSP
@RequestMapping
方法,则将不会添加属性。这可能发生
WEB-INF
以外,或
welcome-list
的
web.xml
包含您的JSP资源,则Servlet容器将直接呈现它,从而完全绕过Spring MVC堆栈
@Controller
,以便适当地添加模型属性。
BindingResult
与这有什么关系?
BindingResult
是用于初始化或验证模型属性的容器。
Spring MVC documentation状态
Errors
或
BindingResult
参数必须跟随模型对象
BindingResult
实例[...]
BindingResult
,则必须在
@RequestMapping
方法中遵循相应的模型属性参数
@RequestMapping(path = "/movies", method = RequestMethod.POST)
public String upload(@ModelAttribute("movie") Movie movie, BindingResult errors) {
BindingResult
对象也被视为模型属性。 Spring MVC使用简单的命名约定来管理它们,从而使查找对应的常规模型属性变得容易。由于
BindingResult
包含有关模型属性的更多数据(例如,验证错误),因此
FormTag
首先尝试绑定到该属性。但是,由于它们并存,因此没有一个就不可能存在。
关于java - 是什么原因导致“java.lang.IllegalStateException:BeanResult'command'的BindingResult和普通目标对象都不能用作请求属性”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42598551/
我有以下查询: SELECT I.InsuranceID FROM Insurance I INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
我想在 SwiftUI 布局中将此函数用作具有不可变值的模板,但得到错误 Result of call to 'padding' 未使用: func keys (padding: CGFloat, t
直到最近我才使用 View 的标签元素,此后发现了一些很酷的用途。我遇到了一个不寻常的问题,希望有人能回答。这可能比 Android 更通用,但我不确定。它与 Java 如何处理 Integer 类有
这个问题在这里已经有了答案: What is the purpose of the var keyword and when should I use it (or omit it)? (19 个回
我有以下脚本(见下文)。我有两个问题: 1.在 Knockoutjs 的上下文中,下面这行是什么意思? ko.observable(null); 2.如何调用这里尚未定义的函数: that.activ
Java 社区中是否存在一种使用 with-repect-to 在方法中使用多个返回的思想流派,如下所示: public SomeClass someMethod(int someValue) {
我一直在尝试为我的网站创建一个小型社交媒体栏。出于某种原因,我无法计算出我想用来创建 Sprite 的图像无法加载。我还应该提一下,我在背景图像不显示方面遇到过类似的问题。 HTML调用是这样的:
我正在尝试使用 std::pair 枚举值作为 unordered_map 容器的键,但我在定义自定义哈希函数时遇到困难。 我尝试了以下方法: // Enum and pair declaration
我正在学习 JS/JQuery 以及匿名函数和闭包。我见过这样的例子: $('.button').click(function(){ /* Animations */ /* Other
我正在尝试使用菜单列表来浏览我的应用程序。尽管应用程序和路由运行良好,但我使用这段代码在控制台中收到了一些警告: {props.itemList.map((item, index) =>(
我只是想创建一个简单的测试,我在其中使用 DelegateHandlers 来实例化一个 HttpClient 而无需引入 Asp.net Core 包。我有 2 个删除处理程序 Throttling
我是answering another question在这里,用户有一个 ListView与 ItemsSource包含 UserControls .我说我不会推荐它,并被问为什么。 这真的让我很惊
我安装了3.5.2和 3.5.3使用 pyenv 的版本。 # pyenv versions * system (set by /usr/local/pyenv/version) 3.5.2
我正在使用 android studio 制作统一插件,但这里有问题。一些 SDK 提供仅使用 AppcompatActivity 来制作 fragment 但我的MainActivity , 正是
我在 Laravel 中使用 whereHas 来构建查询: })->whereHas('results', function ($query) use ($issued, $mode, $reque
我有一个 5Gb .dat 文件(> 1000 万行)。每行的格式如 aaaa bb cccc0123 xxx kkkkkkkkkkkkkk或 aaaaabbbcccc01234xxxkkkkkkkk
我有一个消费者类,它采用 NSInputStream 作为参数,它将被异步处理,并且我想推送来自生产者类的数据,该生产者类要求它提供 NSOutputStream 作为其输出源。现在我如何设置一个缓冲
我正在尝试使用 ENVs在 Symfony2 中设置我的参数。标量值很简单,但我有一些参数是数组,我需要使用 ENV 以某种方式设置它们。 有问题的参数: parameters: redis.se
在我的类作业中,我已经成功地做到了这一点,但只是在非常简单的程序中。今天,我有一个更复杂的程序,在我将 DEBUG 定义为一个符号后,Eclipse 做了可怕的笨拙的事情,并且在我删除定义后这些可怕的
我目前有 2 个复选框类别、一个下拉列表和一个表单中的提交按钮。该按钮应保持“禁用”状态,直到选中 A 类的一个复选框和选中 B 类选项之一并选择选择列表中的一个选项。它适用于复选框(当我在没有列表的
我是一名优秀的程序员,十分优秀!