在Spring MVC中配置多个控制器,并从另一个控制器调用一个控制器的方法

时间:2015-06-21 18:44:16

标签: spring-mvc

我正在尝试在我的应用程序中配置多个控制器,并尝试从一个控制器重定向到另一个控制器。

错误:

  

org.springframework.beans.factory.BeanCreationException:创建名称为' org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0':init方法的调用失败;嵌套异常是java.lang.IllegalStateException:找到了不明确的映射。无法映射' nc'豆方法。

编辑:

第一个控制器

@Controller
@RequestMapping(value = "/nc")
public class StockController {
    @RequestMapping(value = "/testMap", method = RequestMethod.GET)
    public String redirectToStockList(@RequestParam(value = "testInput") String testInput) {
      System.out.println("In StockController..!!");
      return "SampleTamplate";
 }
}   

第二个控制器

@Controller
public class WelcomeController {
@Autowired
private UsersServiceImpl    serviceImpl;
private String              redirectedURL;

private static final Logger logger  = LoggerFactory
                                            .getLogger(WelcomeController.class);

@RequestMapping(value = { "/", "/login" }, method = RequestMethod.GET)
public String login(@RequestParam(value = "username") String username) {
    logger.debug("In login() method.");
    System.out.println("In WelcomeController..!!");
    return "Login";
 }
}

JSP:

第一种形式:

<form action="testMap" method="post">
  <input type="text" class="form-control" name="testInput"/>
</form>

第二表格:

<form action="login" method="post">
  <input type="text" class="form-control" name="username"/>
</form>

当我逐个提交两个表单时,控制权转到“欢迎控制器”&#39;每次。对于第一种形式,它提供了未找到的资源&#39;错误,因为没有映射存在&#34; / testMap&#34;在欢迎控制器。

所以我想要的是,在我的表单提交上调用特定的控制器,并从另一个控制器调用一个控制器的方法。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

在下面的示例中,如果在通过调用位于其中的 menuMapping()方法提交登录表单时存在验证错误,则LoginController会重定向到 / menu URL MenuController类。

(注意:我已经包含了 BindingResult 类和假设形式的使用,因为这是想要重定向到另一个控制器的正当理由。但是,以下解决方案仍然可以正常工作没有BindingResult和if语句而没有使用表单)。

@Controller
public class LoginController {

  MenuController menuController;

  @RequestMapping(value = "/login")
  public String loginMapping(BindingResult result){
     if(result.hasErrors) {
        return "login";
     }
     else {
       return menuController.menuMapping();
     }
}

将MenuController放在另一个类中,如下所示:

@Controller
public class MenuController {

  @RequestMapping(value = "/menu")
  public String menuMapping(){
      return "menu";
    }
}

(编辑:如果你想应用重定向并且控制器方法在同一个类中,则loginMapping返回语句只是return menuMapping();而不是return menuController.menuMapping();

答案 1 :(得分:1)

我将尝试用Grails和Spring方式回答这个问题,因为这是在这里介绍Grails的最佳时机。

在春天,当呼叫从控制器离开时,RequestDispatcher实际上有助于捕获呼叫或检查确切的视图解析器。现在,因为你想将调用转移到另一个控制器,sping提供API(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-redirecting)Inshort你必须使用像“forward:controllerName”这样的视图名称,如

@RequestMapping({"/someurl"})
public String execute(Model model) {
    if (someCondition) {
        return "forward:/someUrlA";
    } else {
        return "forward:/someUrlB";
    }

在grails中,您可以在控制器API中找到适合您的前向方法(http://grails.github.io/grails-doc/2.0.4/api/org/codehaus/groovy/grails/plugins/web/api/ControllersApi.html)。它实际上将同一会话传递给下一个请求的控制器。

请求您尝试使用它。希望这有帮助。