帮助Spring控制器映射问题

时间:2011-08-27 17:24:49

标签: spring-mvc

我在一些春季样本项目中得到了证据。

我的意思是单击链接在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.....
        }
    }
}

3 个答案:

答案 0 :(得分:0)

首先,确保在将它们映射到web.xml

之前加载了Spring Dispatcher servlet
<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>

答案 1 :(得分: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>

答案 2 :(得分:0)

在我看来,你错误地定义了映射。您的LoginController响应“/ login”的请求;但是,对“/login.html”的请求很可能会映射到其他地方定义的不同控制器和方法。也就是说,“/ login”!=“/ login.html”。

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

完整示例:

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

爪哇:

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

P.S。:我甚至会完全删除表单处理代码,而是使用Spring Security来处理身份验证。