当我使用Spring MVC控制器并通过设置值来提交表单时,modelAttribute我丢失了一些未映射到表单中的模型字段.在此示例中,因为我没有映射年龄和地址,所以这些用户的字段会丢失,因此它们具有null价值.我不想让用户更改他们的年龄和地址,这就是为什么这些字段不在表单中.
方法控制器发布用户编辑表单:
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editionUser(Model model, @ModelAttribute("accountForm") User user,
BindingResult bresult,
RedirectAttributes redirectAttributes) {
//user.getAge() and user.getAddress are null
//Save the information...
}
Run Code Online (Sandbox Code Playgroud)
获取编辑用户页面的方法控制器:
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String initEdit(Model model) {
// the user fields are all filled
User user = userService.getUserById(...);
model.addAttribute("accountForm", user);
return "edition";
}
class User {
Long id;
String email;
String age;
String address;
String nickname;
// ...
}
Run Code Online (Sandbox Code Playgroud)
edition.jsp
<form:form …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring的表单:输入如下:
<form:input type="number" .....>
Run Code Online (Sandbox Code Playgroud)
在我的jsp中,但当我检查在浏览器上呈现的html时,它显示如下:
type="number" type="text"
Run Code Online (Sandbox Code Playgroud)
即,type在html中生成两个属性.
另一方面,如果我在浏览器中使用inspect element选项进行检查,则显示正确 - 仅type="number"按预期方式.
编辑 - 我的问题:为什么我在生成的html(type="number" type="text")中获得两个类型属性?如何解决?
为什么spring没有绑定嵌套对象上的值?
尽管在视图中使用bean表示法在表单中进行设置,但RegistrationBean上的SecurityQuestion对象分别设置为问题和答案为null,null.
豆子:
public class SecurityQuestion {
SecurityQuestionType type;
String answer;
}
public class RegistrationBean {
@Valid
SecurityQuestion securityQuestion;
String name;
public SecurityQuestionType[] getSecurityQuestionOptions() {
return SecurityQuestionType.values();
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
<form:form modelAttribute="registrationBean" method="POST">
<form:select id="securityQuestion" path="securityQuestion.question">
<c:forEach var="securityQuestionOption" items="${securityQuestionOptions}">
<form:option value="${securityQuestionOption}">${securityQuestionOption</form:option>
</c:forEach>
</form:select>
<form:input id="securityAnswer" path="securityQuestion.answer" />
<form:input id="name" path="name" />
</form:form>
Run Code Online (Sandbox Code Playgroud)
控制器:
@RequestMapping(value = URL_PATTERN, method = RequestMethod.POST)
public ModelAndView submit(@Valid final RegistrationBean registrationBean) {
// registrationBean.getSecurityQuestion().getQuestion() == null
// registrationBean.getSecurityQuestion().getAnswer() == null
}
Run Code Online (Sandbox Code Playgroud)
解
所有bean都必须拥有所有字段的getter/setter.Spring使用默认构造函数,然后使用setter从视图中改变对象.
我有以下控制器返回视图:
@RequestMapping(value = "/admin/adminUsers", method = RequestMethod.GET)
public String adminUsers(ModelMap model, HttpSession session) {
Set<TerminalAdmin> users = terminalAdminService.getAllAdmins();
session.setAttribute("users", users);
model.addAttribute("adminRoles", terminalAdminService.findAllAdminRoles());
model.addAttribute("terminalAdmin", new TerminalAdmin());
model.addAttribute("generatedPassword", PasswordUpdateStatus.generatePassword());
return "admin/adminUsers";
}
terminalAdminService.findAllAdminRoles()
Run Code Online (Sandbox Code Playgroud)
返回带有id的集合:
在jsp上我渲染它像这样:
<form:form modelAttribute="terminalAdmin" action="/admin/addNewAdmin">
...
<form:checkboxes items="${adminRoles}" path="adminRoles"/>
...
</form:form>
Run Code Online (Sandbox Code Playgroud)
我有以下控制器来接受这个对象:
@RequestMapping(value = "/admin/addNewAdmin")
public String adminUsers(@ModelAttribute @Valid TerminalAdmin terminalAdmin...){
....
}
Run Code Online (Sandbox Code Playgroud)
在调试中,我看到terminalAdminadminRoles没有id.
如何解决这个问题?
PS
我试图添加aria-describeby到springform.它抛出了一个JSP错误.当我尝试在div标签中使用相同的aria-*属性时,它们在同一页面中工作.aria-*不适用于弹簧形式.它在同一个jsp文件中的div中工作.
我正在对一个非常旧的应用程序进行更改。这是使用 Spring MVC 4。
我需要在 Spring 控制器的 JSP 中从 form:form 标签中发布数据。UI 是固定的,我只能在服务器端进行更改。基于我提交的表单中的特定字段,我希望在我的 Controller Handler 方法参数中有正确的子对象实例。
例如,
class Payment {...}
class CardPayment extends Payment{...}
class CheckPayment extends Payment{...}
Run Code Online (Sandbox Code Playgroud)
在 UI 表单中,会有一个名为 paymentType 的输入值。付款将是 commandObject 或 ModelAttribute
我希望我的 @PostMapping 控制器在参数中具有正确的子对象。我不想在控制器代码中手动实例化它。
@PostMapping
public ModelAndView doSomePay(@ModelAttribute("payment") Payment paymentInput, BindingResult result){
Run Code Online (Sandbox Code Playgroud)
现在我希望paymentInput上面的这个对象是 CardPayment 或 checkPayment 类型。
我试图创建一个@initBinder and WebDatabinder但实际上我有近 10 个子类,我是否需要为所有这些创建“编辑器”?
如果是,那么短而快速地创建 propertyEditor 的最佳方法是什么
@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
String paymentType = request.getParameter("paymentType");
PropertyEditor productEditor;
//somehow I can …Run Code Online (Sandbox Code Playgroud) 我在网上查看了几乎所有与此问题相关的答案,但无法在我的代码中找出问题所在.
这是我的JSP页面.
<form:form method="POST" commandName="category" modelAttribute="category" action="search_category">
<form:input path="category_name" />
<input type="submit" value="Submit">
</form:form>
Run Code Online (Sandbox Code Playgroud)
当我删除
<form:input path="category_name" />
Run Code Online (Sandbox Code Playgroud)
它工作正常.我可以与我的控制器通信.所以问题与这条线有关.
@Controller
public class SearchCategory {
@Autowired
private CategoryService categoryService;
@RequestMapping(value = "/search_category", method = RequestMethod.POST)
public @ResponseBody String searchCategoryFromDatabase(@ModelAttribute("category") Category category, BindingResult result){
return "something";
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的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">
<!-- 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/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>
<!-- The definition of the Root …Run Code Online (Sandbox Code Playgroud) 我有
Class Shape {
//Implementation
}
Class Round extends Shape{
//Implementation
}
Run Code Online (Sandbox Code Playgroud)
控制器我有
@Requestmapping(value="/view/form")
public ModelAndView getForm(){
ModelAndView mav=new ModelAndView();
mav.addObject("shape",new Round());
}
@RequestMapping(value="/submit", method = RequestMethod.POST)
public ModelAndView submitForm(@ModelAttribute("shape") Shape shape){
if(shape instanceof Round){ //**Not giving positive result**
}
}
Run Code Online (Sandbox Code Playgroud)
在Jsp
<form:form action="/submit" commandName="shape" method="post">
//form tags
</form:form>
Run Code Online (Sandbox Code Playgroud)
当我用Round对象提交表单时.在控制器端,ModelAttribute没有给出Round的实例.它只给出形状的例子.这该怎么做
在 Spring MVC 中,我尝试使用注释来执行表单输入的验证。我有一些可选字段,但提供输入时,它必须满足某些条件。例如,我有一个字段可以留空,但是当填写它时,答案必须恰好是五个字符长。
我尝试过类似的事情
@Size(min=5, max=5)
private String value;
Run Code Online (Sandbox Code Playgroud)
但如果用户不填写该字段,则会给用户带来错误。
如何为可选字段提供一些“规则”?
@Component
@Entity
@Table(name="menu")
@Configurable
public class Menu implements Serializable{
....
@OneToMany(mappedBy="menu", fetch=FetchType.EAGER)
private Set<VoceMenu> voceMenuList;
public Set<VoceMenu> getVoceMenuList() {
return voceMenuList;
}
public void setVoceMenuList(Set<VoceMenu> voceMenuList) {
this.voceMenuList = voceMenuList;
}
.....
}
Run Code Online (Sandbox Code Playgroud)
我打印一个表单来编辑菜单,以及它的相对VoceMenu对象,这样:
<form:form action="editMenu" method="post" commandName="menu">
Menu id<form:input path="id" maxlength="11"/><br/>
......
<c:forEach items="${menu.voceMenuList}" varStatus="counter">
<form:input path="voceMenuList[${counter.index}].id" maxlength="11"/>
.....
</c:forEach>
<input type="submit">
</form:form>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试保存对象菜单时,我收到此错误:
bean类[com.springgestioneerrori.model.Menu]的属性'voceMenuList [0]'无效:无法从大小为0的集合获取索引为0的元素,使用属性路径'voceMenuList [0]'访问
spring-form ×10
java ×6
spring ×6
spring-mvc ×6
jsp ×4
annotations ×1
controller ×1
forms ×1
hibernate ×1
html ×1
jquery ×1
jquery-ui ×1
jsp-tags ×1
jstl ×1
spring-3 ×1
validation ×1