在网络开发方面,我是一个绝对的菜鸟。但我得到了一些C / C ++ / Java的背景知识,所以我对MVC控制器没有任何问题。这种配置让我很头疼。
我正在使用Spring Boot。根据教程,它可以神奇地解决所有问题,甚至无需打开编辑器并键入单个字符。显然不是。
我有一个视图解析器配置如下:
@Configuration
@ComponentScan (basePackages = {"my.test.controller"})
@EnableAutoConfiguration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Bean
public InternalResourceViewResolver getViewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
public static void main(String[] args) throws Exception {
SpringApplication.run(WebConfig.class, args);
}
}
我有一个像这样的控制器:
@Controller
public class PageController {
@RequestMapping(value = "/index")
public String doSomething() {
//.. do Something
return "/index";
}
我的主要问题是,如果地址中有jsp扩展名,则无法找到该文件。 如果我键入没有像localhost:8080 / index这样的扩展名的网址,页面会正确显示。 如果我输入带有localhost:8080 / index.jsp的扩展名的url,页面将返回404错误。对于控制器中声明的所有页面,这都是相同的。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
Spring Boot中有一个JSP样本可供您使用。如果我是你,我不会定义ViewResolver
,因为Boot已经为你做了(但如果你想使用前缀和后缀解析,你需要设置spring.view.prefix
和spring.view.suffix
)。
您的@Controller
应该返回视图名称(而不是路径),因此“index”将使用您现有的设置解析为“/WEB-INF/views/index.jsp”。我也不打扰“/ resources”映射,因为一个已经由Spring Boot提供,虽然它与你定义的不同(通常人们把静态资源放在“classpath:/ static”中但是“classpath:/ resources”有效)同样,HTTP端点中的资源路径没有前缀。)
JSP在很多方面都不如其他视图技术,所以不幸的是它无处不在。存在许多限制,包括对打包和运行Boot应用程序的方式的限制(有关详细信息,请参阅here)。如果你能节省时间,那么值得你努力忘掉JSP。
答案 1 :(得分:1)
我记得当我开始使用spring时遇到同样的问题,你使用的“url”需要对应于特定的Request Mapping,而不一定是特定的页面 例如
@RequestMapping(value = "/home")
public String doSomething() {
//.. do Something
return "/index";
}
将在 localhost:8080 / home 而不是localhost:8080 / index或localhost:8080 / index.jsp
中公开端点一个很好的示例项目位于: https://github.com/mariuszs/spring-boot-web-jsp-example
答案 2 :(得分:1)
嗯,我不确定这个答案对你有帮助,因为这个问题是在2014年发布的。为了帮助人们解决这个问题,我提供了一些解决方案。希望这会有所帮助。
确保您的@Controller
配置 @RequestMapping("/xx")
不能与您的视图(jsp或模板)相同
例如,您有一个名为home.html
的视图。您不能让@RequestMapping()
与视图名称相同。这将导致 循环错误 ( - >圆形视图路径,在下面添加)。
如何修复此错误,路径不能是名称。 (这是JSP文件大多发生)
当您输入相同的名称时,您将得到:
循环视图路径[preference]:将再次调度回当前处理程序URL [/ preference]。检查您的ViewResolver设置! (提示:由于默认的视图名称生成,这可能是未指定视图的结果。)
以下链接解释了this error would happen。
此类错误仅适用于HTML5文件。如果您遇到一些页面错误并且您正在使用HTML5文件但无法找到其他错误,则可能会出现以下错误 创建HTML文件时,基本文件将是以下代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
<meta charset="UTF-8">
并未以/>
或</meta>
结尾。
在HTML5文件中,这是正确的。但是Thymeleaf使用XHTML加载文件,因此应该关闭<meta>
。
答案 3 :(得分:-1)
如果您从web.xml将所有请求映射到调度程序servlet,那么它将检查适当的控制器映射。
您已将请求映射到/ index,因此无法处理/index.jsp
然后内部视图解析器将返回视图,就像您配置一样。
你可以尝试
@RequestMapping(value = {"/index","/index.jsp"})
最好避免在网络应用中使用.jsp扩展名。