2011-08-27 97 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,而不是來處理身份驗證。