我试图使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]映射。
我应该如何去解决这个问题呢?
@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>
这是所有的内存,但它应该给你如何去了解这个总体思路。
所有控制器请求映射应该在Spring MVC中是独一无二的。
也许在你的控制器使用相同的@RequestMapping你应该定义的方法(GET,POST ...),就像这样:
@RequestMapping(value="/index.htm", method = RequestMethod.GET)
@RequestMapping(value="/index.htm", method = RequestMethod.POST)
使用GET方法的控制器使用来呈现的形式,并且结合的数据(一些对象)给它。 与POST方法控制你通常用它来处理表单的提交和验证。
在您的形式来区分它们添加隐藏的参数,然后在您的文章方法注释添加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"})