Spring MVC的多个控制器具有相同的@RequestMapping(Spring MVC Mu

2019-07-30 13:59发布

我试图使Web应用程序,允许用户从登录页面登录index.htm 。 这个动作用的LoginController映射,成功登录后,用户需要回到相同index.htm但作为登录用户和用户问候与欢迎信息。

index.htm的也有一个名为itemform另一种形式,它允许用户在项目名称添加为文本。 这一行动是由itemController控制。

我的问题是我的两个LoginController中itemController具有相同的@RequestMapping ,因此我得到这个错误:

在ServletContext的资源[/WEB-INF/tinga-servlet.xml]定义的错误创建名称为豆'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0:豆的初始化失败; 嵌套的例外是java.lang.IllegalStateException:不能映射处理[LoginController中]到URL路径[将/index.htm]:已经有处理程序[com.tinga.LoginController@bf5555]映射。

不能映射到URL路径的处理程序[LoginController中] [将/index.htm]:已经有处理程序[com.tinga.LoginController@bf5555]映射。

我应该如何去解决这个问题呢?

Answer 1:

@RequestMapping(value="/login.htm")
public ModelAndView login(HttpServletRequest request, HttpServletResponse response) {
   // show login page if no parameters given
   // process login if parameters are given
}

@RequestMapping(value="/index.htm")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
   // show the index page
}

最后,你需要一个Servlet过滤器拦截的要求,如果你没有请求login.htm页面,你必须检查,以确保在用户登录,如果是你,你让filterchain继续。 如果没有,你发出着/login.htm

public class LoginFilter implements Filter {
  public void doFilter(ServletRequest request,  ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest)request;

    boolean loggedIn = ...; // determine if the user is logged in.
    boolean isLoginPage = ...; // use path to see if it's the login page

    if (loggedIn || isLoginPage) {
        chain.doFilter(request, response);
    }
    else {
        request.getRequestDispatcher("/login.htm").forward(request, response);
    }
  }
}

而在web.xml

从我的部署描述符例如:

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>  
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping>

这是所有的内存,但它应该给你如何去了解这个总体思路。



Answer 2:

所有控制器请求映射应该在Spring MVC中是独一无二的。



Answer 3:

也许在你的控制器使用相同的@RequestMapping你应该定义的方法(GET,POST ...),就像这样:

@RequestMapping(value="/index.htm", method = RequestMethod.GET)
@RequestMapping(value="/index.htm", method = RequestMethod.POST)

使用GET方法的控制器使用来呈现的形式,并且结合的数据(一些对象)给它。 与POST方法控制你通常用它来处理表单的提交和验证。



Answer 4:

在您的形式来区分它们添加隐藏的参数,然后在您的文章方法注释添加PARAMS属性区分。

<form:hidden name="hiddenAction" value="login" />
<form:hidden name="hiddenAction" value="item" />

@RequestMapping(method = RequestMethod.POST, params = {"hiddenAction=login"})
@RequestMapping(method = RequestMethod.POST, params = {"hiddenAction=item"})


文章来源: Spring MVC Multiple Controllers with same @RequestMapping