SpringMVC& Spring in Action:不能在第5章中重定向到home.jsp

时间:2016-07-17 07:07:02

标签: java maven spring-mvc

我现在用Spring in Action学习SpringMVC和maven,但我现在有一个问题。 " /"的默认请求应该映射到" home.jsp"但不是。 您还可以看到书籍论坛中描述的相同问题。 https://forums.manning.com/posts/list/38046.page 以下是代码:

package spittr.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected String[] getServletMappings(){
        return new String[]{ "/" };
    }

    @Override
    protected Class<?>[] getRootConfigClasses(){
        return new Class<?>[]{ RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses(){
        return new Class<?>[]{ WebConfig.class };
    }
}
package spittr.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter{

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
        configurer.enable();
    }
}
 package spittr.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan(basePackages={"spitter"}, excludeFilters={
    @Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)
})
public class RootConfig {

}
package spittr.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String home(){
        return "home";
    }
}

当我在tomcat 7.0上运行它时,它应该显示home.jsp。但它仍然显示index.jsp。

-------------------- update ------------------------- < / p>

以下测试类表明控制器类是正确的,并且该控制器可以响应请求&#34; /&#34;与home.jsp。那么,哪里出错了?

package spittr.web;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;

public class HomeControllerTest {

    @Test
    public void testHomePage() throws Exception{
        HomeController controller = new HomeController();
        MockMvc mockMvc = standaloneSetup(controller).build();
        mockMvc.perform(get("/")).andExpect(view().name("home"));   
    }
}

3 个答案:

答案 0 :(得分:1)

更新或添加web.xml

<welcome-file-list>home.jsp</welcome-file-list>

如果您没有web.xml,可以通过

生成
  

动态网络项目 - &gt; RightClick - &gt; Java EE工具 - &gt;生成   部署描述符存根。

您也可以index.jsp中的JSP redirect using JSTL libraries重定向到home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:redirect url="/home.jsp"/>

答案 1 :(得分:0)

似乎是path问题。

首先检查web.xml文件中的路径映射,找出要重定向到调度程序servlet的确切url-pattern。假设您在

下创建了home.jsp个视图
 /WEB-INF/views/ 

文件夹中。

答案 2 :(得分:0)

我在Mac上运行Eclipse,Tomcat 9.0时遇到了同样的问题。我花了好几个小时看到(这个小代码),我错了。

但是,我能够使用Eclipse和Tomcat 8.5和9.0在Windows机器上运行。

我在https://github.com/shortduck/ManningChapter5_SpringMVC

的GitHub上托管了代码

这是一个Maven项目而不是Gradle。另请参阅HomeController的值为value = "/home",此功能与/&#39;也会工作。如果您有价值,那就是&{39; /&#39;确保index.jsp或任何其他&#34; home&#34;页面不在根目录上。

我的下一个目标是找出为什么此代码无法在Mac上运行。