将 JSP 中的枚举提交给控制器
Submit enum from JSP to controller
我在 JSP 中有一个表格要提交给控制器。现在表单的属性之一是枚举,但我无法让它工作。
public class UploadFormBean {
private Type type;
public enum Type {
A ("abc"),
B ("xyz"),
C ("pqr");
private final String str;
private Type(final String str) {
this.str = str;
}
@Override
public String toString() {
return str;
}
}
public Type getType() {
return type;
}
public void setType(final String type) {
for (Type s: Type.values()) {
if (s.toString().equalsIgnoreCase(type)) {
this.type = s;
}
}
}
}
控制器:
public ModelAndView execute(final HttpServletRequest request, @ModelAttribute final UploadFormBean uploadFormBean) {
//some code.
Type t = uploadFormBean.getType(); //t is null.
//some more code.
}
JSP:
<input type="hidden" name="type" value="abc">
我错过了什么。让我知道是否需要任何信息。感谢大家的帮助。
您不能直接映射 Enum
,请将您的表单 bean 类型更改为
private String type;
它会起作用
问题是默认的 Spring MVC 属性 编辑器无法确定如何将 HTTP 请求中提交的 abc
映射到 Type.A
。它关于枚举的默认行为是将字符串值转换为枚举。由于找不到名为 abc
的枚举值,因此它使用 null
.
退出
您可以通过编写自己的 PropertyEditor
.
来克服这个问题
public class TypeEditor extends java.beans.PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(text != null) {
text = text.trim();
if(text.equalsIgnoreCase("abc")) {
setValue(Type.A);
}
else if(text.equalsIgnoreCase("xyz")) {
setValue(Type.B);
}
else if(text.equalsIgnoreCase("pqr")) {
setValue(Type.C);
}
}
}
}
最好在枚举 class Type
中创建一个方法来从 java.lang.String
中获取 Type
值。 属性 编辑器代码将在此之后得到简化,对枚举值的任何更改都将本地化到 Type
class.
然后,将此编辑器添加到控制器中的网页活页夹 class。
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Type.class, new TypeEditor());
}
}
我在 JSP 中有一个表格要提交给控制器。现在表单的属性之一是枚举,但我无法让它工作。
public class UploadFormBean {
private Type type;
public enum Type {
A ("abc"),
B ("xyz"),
C ("pqr");
private final String str;
private Type(final String str) {
this.str = str;
}
@Override
public String toString() {
return str;
}
}
public Type getType() {
return type;
}
public void setType(final String type) {
for (Type s: Type.values()) {
if (s.toString().equalsIgnoreCase(type)) {
this.type = s;
}
}
}
}
控制器:
public ModelAndView execute(final HttpServletRequest request, @ModelAttribute final UploadFormBean uploadFormBean) {
//some code.
Type t = uploadFormBean.getType(); //t is null.
//some more code.
}
JSP:
<input type="hidden" name="type" value="abc">
我错过了什么。让我知道是否需要任何信息。感谢大家的帮助。
您不能直接映射 Enum
,请将您的表单 bean 类型更改为
private String type;
它会起作用
问题是默认的 Spring MVC 属性 编辑器无法确定如何将 HTTP 请求中提交的 abc
映射到 Type.A
。它关于枚举的默认行为是将字符串值转换为枚举。由于找不到名为 abc
的枚举值,因此它使用 null
.
您可以通过编写自己的 PropertyEditor
.
public class TypeEditor extends java.beans.PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(text != null) {
text = text.trim();
if(text.equalsIgnoreCase("abc")) {
setValue(Type.A);
}
else if(text.equalsIgnoreCase("xyz")) {
setValue(Type.B);
}
else if(text.equalsIgnoreCase("pqr")) {
setValue(Type.C);
}
}
}
}
最好在枚举 class Type
中创建一个方法来从 java.lang.String
中获取 Type
值。 属性 编辑器代码将在此之后得到简化,对枚举值的任何更改都将本地化到 Type
class.
然后,将此编辑器添加到控制器中的网页活页夹 class。
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Type.class, new TypeEditor());
}
}