当前位置: 首页 > 知识库问答 >
问题:

spring MVC表单处理

孟乐
2023-03-14

首先:我是spring的初学者,这是我第一次尝试用spring MVC实现一个web应用程序。以下是我所做的:

实体:

@Entity
@Table(name = "coins")
public class Coin
{
    @Id
    @GeneratedValue
    private Integer id;

    @OneToOne
    private Country country;

    private double value;

    private int year;
}

@Entity
@Table(name = "countries")
public class Country
{
    @Id
    @GeneratedValue
    private Integer id;

    private String name;
}

控制器:

@Controller
public class CoinViewController {

    @Autowired
    private CoinService service;

    @Autowired
    private CountryService countryService;

    @ModelAttribute("countries")
    public List<Country> frequencies() {
        return countryService.get();
    }

    @RequestMapping(value = "/coins/add", method = RequestMethod.GET)
    public String addCoin(Model model) {
        model.addAttribute("coin", new Coin());

        return "coins/add";
    }

    @RequestMapping(value = "/coins/add", method = RequestMethod.POST)
    public String addCoinResult(@ModelAttribute("coin") Coin coin, BindingResult result) {
        // TODO: POST HANDLING

        return "/coins/add";
    }
}

JSP:

<form:form action="add" method="POST" modelAttribute="coin">
    <div class="form-group">
        <label for="country">Country:</label>
        <form:select path="country" class="form-control" >
            <form:option value="" label="-- Choose one--" />
            <form:options items="${countries}" itemValue="id" itemLabel="name" />
        </form:select>
    </div>
    <div class="form-group">
        <label for="value">Value:</label>
        <form:input path="value" class="form-control" />
    </div>
    <div class="form-group">
        <label for="year">Year:</label>
        <form:input path="year" class="form-control" />
    </div>
    <button type="submit" value="submit" class="btn btn-default">Erstellen</button>
</form:form>

但是当我试图保存JSP的输入时,我总是得到这样的结果:

字段“country”上对象“coin”中的字段错误:拒绝值[1];代码[TypeMismatch.Coin.Country,TypeMismatch.Country,TypeMismatch.Country,TypeMismatch.Country,参数[org.springframework.context.support.defaultmessageSourceResolvable:代码[coin.country,country];参数[];default message[country]];默认消息[无法将类型为“java.lang.String”的属性值转换为属性“Country”的必需类型“Country”;嵌套异常为java.lang.IllegalStateException:无法将类型为[java.lang.String]的值转换为属性“Country”的必需类型[Country]:找不到匹配的编辑器或转换策略]

所以我的问题是:

  1. 我应该使用什么编辑器/转换器?
  2. 如何在控制器中注册其中一个?

共有1个答案

柳胜
2023-03-14

可以将自定义编辑器注册到controller类的initBinder中:

@Controller
public class CoinViewController {

    @Autowired
    private CountryEditor countryEditor;

    @InitBinder
    protected void initBinder(final WebDataBinder binder, final Locale locale) {
        binder.registerCustomEditor(Country.class, countryEditor);
    }

    ......
}

(在这种情况下不需要locale参数,但如果您需要区域设置来进行转换(例如,如果您正在处理日期),则该参数会很有用)

您可以定义CountryEditor,如下所示:

@Component
public class CountryEditor extends PropertyEditorSupport {

    @Autowired
    private CountryService countryService;

    @Override
    public void setAsText(final String text) throws IllegalArgumentException {
        try{ 
            final Country country = countryService.findById(Long.parseLong(text));
            setValue(cliente);
        }catch(Exception e){
            setValue(country);
            // or handle your exception
        }
    }
}

我让spring用@component注释处理编辑器的注入。因此,如果您喜欢这样做,请记住为该类启用包扫描!

希望能有所帮助!

 类似资料:
  • 表单是让用户与我们的网页应用程序交互的基本元素。Flask 本身并不会帮助我们处理表单,但是 Flask-WTF 扩展让我们在我们的 Flask 应用程序中使用流行的 WTForms 包。这个包使得定义表单和处理提交容易一些。 Flask-WTF 我们想要使用 Flask-WTF 做的第一件事情(在安装它以后)就是在 myapp.forms 包中定义一个表单。 # ourapp/forms.py

  • 我正在尝试将一个jsp表单放入fancybox,我的站点功能正常,所以我知道我的大部分配置都是正确的。我还做了一个图像的样例测试,它工作得很好,但是对于一个表单,我有问题。下面是代码:

  • 我们已经看到,可以在URL规则中指定http方法。URL映射的函数接收到的表单数据可以以字典对象的形式收集,并将其转发给模板以在相应的网页上呈现它。 在以下示例中,URL => 呈现具有表单的网页(student.html)。填充的数据会提交到触发函数的URL => 中。 函数收集字典对象中中存在的表单数据,并将其发送给result.html 并显示出来。 该模板动态呈现表单数据的HTML表格。

  • 主要内容:在视图中使用表单在Django创建表单,类似于创建一个模型。 在这里,我们只需要从Django的类并继承此类属性表单字段。让我们在myapp文件夹中添加forms.py文件包含我们的应用程序的表单。我们将创建一个登录表单。 myapp/forms.py 由上可见,字段类型可以利用“widget”的参数到HTML渲染; 在我们的例子中,我们要隐藏密码,不会显示。在我们的例子中,想要隐藏密码而不用显示。 日期输入是D

  • 我在处理我的联系方式时遇到了麻烦,虽然是一个简单的联系方式。我花了很多时间试图找出我的代码出了什么问题,但一直没有找到解决办法。我的对象没有接收数据。我有以下例外情况: 执行INSERT INTO联系人(电子邮件、姓名、消息、日期)VALUES时发生异常 (?, ?, ?, ?)'用参数[null, null, null,"2016-09-19 00:08:48"]: SQLSTATE[23000

  • 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。 GET 方法 GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示: http://www.runoob.com/hello?key1=value1&key2=value2 GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用