2011-08-27 59 views
0

我有问题,而一些春天示例项目。有关弹簧控制器映射问题的帮助

我的意图是点击链接在index.jsp中,进入登录页面。 这样的<a href="/login.html">log in</a> 登录控制器用登录过程覆盖,并从索引重定向到登录表单。

和HTML是映射在web.xml中

<servlet-mapping> 
<servlet-name>dispatcher</servlet-name> 
<url-pattern>*.html</url-pattern> 
</servlet-mapping> 

如果我点击的链接,获得 “HTTP状态404 - /login.html” 帮我PLZ!

这样的代码。

LoginController.java

@Controller 
@RequestMapping("/login") 
@SessionAttributes("login") 
public class LoginController { 
    private LoginValidator loginValidator; 
    private MemberService memberService; 
    private Provider<LoginInfo> loginInfoProvider; 

    @Inject  
    public void setLoginInfoProvider(Provider<LoginInfo> loginInfoProvider) { 
     this.loginInfoProvider = loginInfoProvider; 
    } 

    @Autowired 
    public void init(LoginValidator loginValidator, MemberService memberService) { 
     this.loginValidator = loginValidator; 
     this.memberService = memberService; 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    public ModelAndView showform(){ 
    return new ModelAndView("redirect:/login.html"); 
} 

    @RequestMapping(method=RequestMethod.POST) 
    public String login(@ModelAttribute @Valid Login login, BindingResult result, SessionStatus status) { 
     if (result.hasErrors()) return "login"; 

     this.loginValidator.validate(login, result); 
     if (result.hasErrors()) { 
      return "login"; 
     } 
     else { 
      memberService.login(loginInfoProvider.get().currentMember()); 
      status.setComplete(); 
      return "redirect:/members.html"; // don't mind this... modifing..... 
     } 
    } 
} 
+0

看看你的服务器的日志文件,答案就在那里。 – skaffman

回答

0

首先,确保你弹簧加载的调度的servlet你的web.xml文件中映射他们之前

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

基于您的代码,我假设你是使用视图解析器,所以仔细检查你是否有这个地方

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 
+0

检查您的服务器错误日志和控制台。大多数情况下,它会为您提供很好的调试信息,特别是404错误页面。另外我对你的代码有点困惑。对于您的全局REQUESTMAPPING,您将值设置为“登录”,但对于您的REQUESTMETHOD.GET,您将重定向到“登录”。我很惊讶,你没有无限循环重定向。 – Infinity

0

感谢您的回答,但我已经使用代码。

<bean id="jspViewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/view/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
0

它在我看来像你正在定义的映射不正确。你的LoginController响应“/ login”请求;然而,对“/login.html”的请求很可能映射到其他地方定义的不同控制器和方法。也就是说,“/ login”!=“/login.html”。

如果我是你,我会使用更加REST风格的URL映射,通过这种方式链接它:<a href="/login/">log in</a>。然后你的LoginController会干净地映射。从HTML链接到页面时,尽量不要使用扩展名(.html,.jsp,.whatever)。相反,只需链接到以“/”后缀结尾的原始路径。

完整的示例:

HTML: <a href="/login/">Login</a>

的Java:

@Controller 
@RequestMapping("/login/") 
... 

PS:我甚至会得到完全摆脱表单处理代码,并使用Spring Security,而不是来处理身份验证。