【问题标题】:How can use the same method in a controller, receiving an abstract class?如何在控制器中使用相同的方法,接收抽象类?
【发布时间】:2014-01-28 15:12:51
【问题描述】:

我有 5 种不同的带有 mvc 弹簧形式的 jsp。在每个表单的 modelAttribute 中,我都有一个特定的类(例如,狗、猫、老鼠等)。每个表单都有一个提交按钮,我希望该请求将在控制器中以相同的方法提交。
在控制器中,我尝试获取一个通用类(抽象)这样的动物。它给了我一个错误。我怎么能这样做?

如果收到一只猫,这很好用。 谢谢!

jsp:

<form:form method="post" modelAttribute="Cat" action="../2/submit">
            <form:checkbox path="attribute" />
            <button type="submit">Submit</button>
</form:form>

和控制器:

@RequestMapping(value = "/submit",  produces ="text/html" ,headers = "Accept=" ,  method=RequestMethod.POST) 
    public String submitForm(@ModelAttribute Animal animal, Model m) throws IllegalArgumentException, IllegalAccessException {
        return "";
    }

【问题讨论】:

    标签: java forms jsp spring-mvc spring-roo


    【解决方案1】:

    我可以为此想到两种技术。

    技术:老派

    在处理程序方法中使用WebRequest 类型的参数。 这可以访问请求参数。 然后查询你关心的参数,确定请求的来源,确定你需要的参数。

    @RequestMethod("/blammy")
    public String blammy(
        final ModelMap model,
        final WebRequest webRequest)
    {
        String something = webRequest.getParameter("something");
    
        if ("hoot".equals(something))
        {
            ... process a hoot request
        }
        else if ("bark".equals(something))
        {
            ... process a bark request
        }
    }
    

    技术:前置控制器

    为每个表单证明一个方法,然后将调用转发到一个通用方法。

    @RequestMethod("/fish")
    public String fish(
        @ModelAttribute final Fish fish,
        final ModelMap model)
    {
         return commonMethod(model, (Animal)fish);
    }
    
    @RequestMethod("/cat")
    public String cat(
        @ModelAttribute final Cat cat,
        final ModelMap model)
    {
         return commonMethod(model, (Animal)cat);
    }
    
    public String commonMethod(
        final ModelMap model,
        final Animal animal)
    {
        ... blam
    }
    

    【讨论】:

    • 是的,但是对于您的第二个解决方案,这是我尽量避免的。我尽量避免每个表单都有一个@RequestMethod。我只需要一个提交方法,它可以接收“相同”类型的每个类,例如:动物。谢谢
    【解决方案2】:

    您不应该统一请求处理程序方法,尽管使用带有所需业务层的服务层,以便所有控制器都可以调用相同的业务逻辑。

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2018-02-19
      相关资源
      最近更新 更多