我一直在做一個用spring initialzr初始化的spring-boot專案。生成的包沒有/webapp目錄,因此不得不添加/webapp目錄。我從spring檔案中讀到,spring從/static、resources中檢測靜態檔案。我放置了3個不同的index.jsp來測驗哪一個會被我的控制器顯示。下面是這些代碼片段。
目錄樹:
├── HELP.md
├──mvnw
├── mvnw.cmd
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └──資料庫顯示
│ │ │ └──應用程式
│ │ │ ├──AppApplication.java
│ │ │ ├──配置
│ │ │ │ ├──WebAppInitializer.java
│ │ │ │ └── WebConfig.java
│ │ │ ├──控制器
│ │ │ │ ├── HomeController.java
│ │ │ │ └── IndexController.java
│ │ │ ├──儲存庫
│ │ │ └──ServletInitializer.java
│ │ ├──資源
│ │ │ ├──應用.屬性
│ │ │ ├── index.jsp
│ │ │ ├── static
│ │ │ │ └── index.jsp
│ │ │ └──模板
│ │ └── webapp
│ │ └── WEB-INF
│ │ └── views
│ │ └── index.jsp
│ └──測驗
│ └── java
│ └── com
│ └──基于資料庫的顯示
│ └──應用程式
│ └──AppApplicationTests.java
└──目標
├──類
│ ├──應用.屬性
│ ├── com
│ │ └──基于資料庫的顯示
│ │ └──app
│ │ ├──AppApplication.class
│ │ ├── config
│ │ │ ├──WebAppInitializer.class
│ │ │ └──WebConfig.class
│ │ ├──控制器
│ │ │ ├──HomeController.class
│ │ │ └── IndexController.class
│ │ └──ServletInitializer.class
│ ├── index.jsp
│ └── static
│ └── index.jsp
└────生成的資源
│ └──注釋
├──生成的測驗資源
│ └── test-annotations
├──maven-status
│ └── maven-compiler-plugin
│ ├── 編譯
│ │ └── default-compile
│ │ ├── createdFiles.lst
│ │ └── inputFiles.lst
│ └── testCompile
│ └── default-testCompile
│ ├── createdFiles.lst
│ └── inputFiles.lst
└── test-classes
└──com
└──基于資料庫的顯示
└──App
└──AppApplicationTests.class
index.jsp (in '/resources')
<html>
<head></head>
<body>
<h1>這是/resources中樣本視圖的主體</h1>/span>
</body>/span>
index.jsp (in '/static')
<html>
<head></head>
<body>
<h1>這是/static</h1>中示例視圖的主體。
</body>/span>
</html>
index.jsp(在'/WEB-INF/views/')
<html>
<head></head>
<body>
<h1>這是WEB-INF/views中樣本視圖的主體</h1>/span>
</body>/span>
</html>
Controller
@Controller
public class IndexController {
@RequestMapping(value = "/indexA", method = RequestMethod.GET)
public String index() {
回傳 "index"。
}
}
配置類
WebConfig.java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
?? @Bean
公共ViewResolver getViewResolver() {
InternalResourceViewResolver resolver
= new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/")。
resolver.setSuffix(".jsp")。
回傳resolver。
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable("testServlet")。
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/") .setCachePeriod(3600)
.resourceChain(true).addResolver(new PathResourceResolver())。
}
}
WebInitializer.java
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext()。
context.scan("com.databasedisplay.app")。
container.addListener(new ContextLoaderListener(context))。
ServletRegistration.Dynamic dispatcher = container.addServlet("mvc", new DispatcherServlet(context))。
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/")。
}
}
問題是當我用mvn spring-boot:run或mvn clean package spring-boot:run運行時,目錄樹中顯示的arget目錄沒有來自WEB-INFviews的index.jsp(事實上,目標目錄根本沒有WEB-INF目錄)。但是當我curl http://localhost:8080/indexA時,我仍然得到以下輸出。
這是WEB-INF/views中的示例視圖的主體
誰能解釋一下?
誰能解釋一下,視圖決議器是如何將視圖名稱映射到相應的視圖上的?(我已經研究了
InternalResourceViewResolver以及如何設定前綴和后綴,但這仍然不能解釋當jsp不在目標中時,它是如何渲染的)誰能指出
mvn spring-boot:run和mvn clean package spring-boot:run之間的區別,因為后者在目標中存在WEB-INF目錄。為什么我在
/WEB-INF中得到了index.jsp,而在curl中卻沒有得到其他視圖?
uj5u.com熱心網友回復:
JSP是傳統的Java企業應用程式的一部分,并不是Spring Boot/MVC及其更現代的模板引擎方法的核心(盡管Spring是基于Java EE的)。如果你有任何充分的理由使用JSP,它可以發揮作用。但是對于 Spring 來說,MVC 的方法/實作是使用更現代的模板引擎,其技術包括 Thymeleaf、FreeMarker、Groovy Markup 和 Mustache。
問題1如果你已經正確配置了你的pom.xml,你可以使用不同的啟動器來配置你的應用程式如何部署/運行。JSP不是Spring的標準解決方案,應該單獨配置,它需要被配置成將JSP編譯到各自的位置,以便Tomcat從webapps檔案夾中讀取它。為了編譯和渲染JSP,你的pom.xml需要spring-boot-starter-web和tomcat-embed-jasper包括標簽<scope>supported</scope>。
問題2 Spring帶有一個嵌入式Tomcat服務器(spring-boot-starter-web)。當你運行mvn spring-boot:run時,它將啟動一個Tomcat服務器,并將你的Spring Boot應用程式部署在Tomcat的localhost:8080上。mvn clean,在spring-boot:run之前,只是通過洗掉構建目錄來洗掉構建的輸出。
問題3每個.HTML模板或.JSP檔案在編譯前在專案中都有各自的位置,因此有些.JSP在你的檔案夾中沒有被編譯。
Java企業應用程式及其相應的JSP使用的專案結構與Spring不同。如果你有正確的依賴關系并運行spring-boot:run,所有的JSP都將從 "src/main/webapp/WEB-INF/jsp/"中被編譯。如果你手動創建一個專案,通過cmd編譯-jar,你應該把你的JSP放在"/webapp/"檔案夾中,把Java.class放在WEB-INF/classes/MyServlet.class。
通過使用,例如Thymeleaf(spring-boot-starter-thymeleaf),如果您構建您的工件,IDE將從/resources/templates中編譯模板,并從那里對您的MVC專案進行作業,在那里您可以無縫集成您的REST控制器。
Tomcat 在您的企業應用程式的部署方式中保持關鍵地位,只是您需要在 Spring 中調整您的專案,以便它在部署前將正確的檔案映射并編譯到 .WAR 中。
我的建議是,對于 MVC 來說,使用模板引擎而不是傳統的 JSP。當然,在 Spring 專案中也有使用 JSP 的情況,但它需要不同的結構和依賴性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315158.html
標籤:
