我正在尝试使用Spring MVC完成此操作:我的欢迎页面位于我的/ webapp文件夹中的index.jsp,因此可以将其设置为欢迎页面。此页面有一个登录表单。当登录失败时,我想重定向到此欢迎页面(redirect:/
)并传递一条错误消息,然后可以使用JSTL显示该错误消息。问题是,当我进行重定向时,模型消失了,错误消息也消失了。但我不能只返回viewname,因为index.jsp位于webapp文件夹中,而我的View Resolver映射到/ WEB-INF / pages /...
任何人都知道如何让这个工作?这就是我到目前为止所做的:
的web.xml
<web-app schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>TDD oefening</display-name>
<servlet>
<servlet-name>springservlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springservlet-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springservlet</servlet-name>
<url-pattern>/web/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
springservlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="be.kdg.prog4.tdd"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:resources mapping="/resources/**" location="/resources/"/>
</beans>
我的处理登录的控制器方法
@RequestMapping(value = "/login.do", method = RequestMethod.POST)
public ModelAndView login(@RequestParam String username, @RequestParam String password) {
boolean ok = service.checkLogin(username, password);
ModelAndView mav;
if (!ok) {
mav = new ModelAndView("redirect:/");
mav.addObject("error", "Wrong username or password");
return mav;
}
mav = new ModelAndView("favorites");
mav.addObject("username", username);
mav.addObject("isRoot", username.equals("root"));
return mav;
}
我想在重定向后显示消息:
<span id="errormsg" name="errormsg" style="color: red;">${error}</span>
所有必需的taglib都出现在.jsp页面的顶部,jstl和cglib等都存在于我的pom.xml中。
提前致谢。
答案 0 :(得分:2)
要在重定向后保留模型,您需要使用Flash属性。
以下是从JavaDoc中提取的示例:
@RequestMapping(value = "/accounts", method = RequestMethod.POST)
public String handle(Account account, BindingResult result, RedirectAttributes redirectAttrs) {
if (result.hasErrors()) {
return "accounts/new";
}
// Save account ...
redirectAttrs.addAttribute("id", account.getId()).addFlashAttribute("message", "Account created!");
return "redirect:/accounts/{id}";
}
和JavaDoc:)
编辑 - 反映@M的评论。 Deinum
您可以在index.jsp中添加一个简单的刷新元数据,并在spring应用程序中添加并映射login.jsp页面。这将确保您的用户完成的每个导航都将由Spring DispatchServlet控制。
为了说明这个想法,我小心翼翼地说道。
的index.jsp
<meta http-equiv="refresh" content="0; url=/login" />
控制器中某处定义的请求映射
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String doLogin(Model model) {
// This return sttm needs to reflect the right path to your login.jsp
return "login";
}