我在一些春季样本项目中得到了证据。
我的意思是单击链接在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 :(得分: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来处理身份验证。