当前位置: 首页 > 知识库问答 >
问题:

带Spring Boot的JSP

蓝华皓
2023-03-14

我一直在从事一个用spring initialzr初始化的spring boot项目。生成的包没有/webapp目录,因此必须添加/webapp>/code>文件夹。我从spring文档中读到,spring从/static资源中检测静态文件。我在索引中放置了3个不同的。jsp测试我的控制器显示哪一个。下面是代码片段。

目录树:

├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── databasedisplay
│   │   │           └── app
│   │   │               ├── AppApplication.java
│   │   │               ├── config
│   │   │               │   ├── WebAppInitializer.java
│   │   │               │   └── WebConfig.java
│   │   │               ├── controller
│   │   │               │   ├── HomeController.java
│   │   │               │   └── IndexController.java
│   │   │               ├── repository
│   │   │               └── ServletInitializer.java
│   │   ├── resources
│   │   │   ├── application.properties
│   │   │   ├── index.jsp
│   │   │   ├── static
│   │   │   │   └── index.jsp
│   │   │   └── templates
│   │   └── webapp
│   │       └── WEB-INF
│   │           └── views
│   │               └── index.jsp
│   └── test
│       └── java
│           └── com
│               └── databasedisplay
│                   └── app
│                       └── AppApplicationTests.java
└── target
    ├── classes
    │   ├── application.properties
    │   ├── com
    │   │   └── databasedisplay
    │   │       └── app
    │   │           ├── AppApplication.class
    │   │           ├── config
    │   │           │   ├── WebAppInitializer.class
    │   │           │   └── WebConfig.class
    │   │           ├── controller
    │   │           │   ├── HomeController.class
    │   │           │   └── IndexController.class
    │   │           └── ServletInitializer.class
    │   ├── index.jsp
    │   └── static
    │       └── index.jsp
    ├── generated-sources
    │   └── annotations
    ├── generated-test-sources
    │   └── test-annotations
    ├── maven-status
    │   └── maven-compiler-plugin
    │       ├── compile
    │       │   └── default-compile
    │       │       ├── createdFiles.lst
    │       │       └── inputFiles.lst
    │       └── testCompile
    │           └── default-testCompile
    │               ├── createdFiles.lst
    │               └── inputFiles.lst
    └── test-classes
        └── com
            └── databasedisplay
                └── app
                    └── AppApplicationTests.class

索引.jsp(在“/资源”中)

<html>
<head></head>
<body>
    <h1>This is the body of the sample view in /resources</h1>
</body>

index.jsp(在'/静态')

<html>
    <head></head>
    <body>
        <h1>This is the body of the sample view in /static</h1>
    </body>
</html>

index.jsp(在'/WEB-INF/views/')

<html>
    <head></head>
    <body>
        <h1>This is the body of the sample view in WEB-INF/views</h1>
    </body>
</html>

控制器

@Controller
public class IndexController {

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

配置类

WebConfig.java

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver
                = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return 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("/");
    }

}

问题是当我使用< code>mvn spring-boot:run或< code > mvn clean package spring-boot:run 运行时,目录树中显示的< code>\target目录没有来自< code>\WEB-INF\views\的< code>index.jsp(事实上,目标目录根本没有< code>WEB-INF目录)。但是当我< code > curl http://localhost:8080/indexA :< code >这是WEB-INF/views中的示例视图的主体时,我仍然得到以下输出

>

  • 有人能解释一下视图解析器如何将视图名称映射到相应的视图吗?(我已经研究了<code>InternalResourceViewResolver

    有人能指出mvn sping-boo: runmvn清洁包sping-boo: run之间的区别吗,因为后者的目标中有WEB-INF目录。

    为什么我得到了对应于< code>/WEB-INF的< code>index.jsp,但没有得到关于< code>curl的其他视图?

  • 共有1个答案

    宋景福
    2023-03-14

    JSP是传统Java企业应用程序的一部分,不是Spring Boot/MVC的核心,它是更现代的模板引擎方法(尽管Spring基于JavaEE)。如果你有任何好的理由使用JSP,它可以工作。但是对于Spring,MVC方法/实现是使用更现代的模板引擎,包括Thymeleaf、FreeMarker、Groovy Markup和Mustache等技术。

    问题1:您是否已配置pom。正确地说,您可以使用不同的启动器来配置应用程序的部署/运行方式。JSP不是Spring的标准解决方案,应该单独配置,它需要配置为将JSP编译到各自的位置,以便Tomcat从webapps文件夹中读取。编译并呈现JSP的pom。xml既需要spring boot starter web又需要tomcat嵌入jasper,包括标记

    问题2 Spring带有一个嵌入式Tomcat服务器(spring-boot-starter-web)。当您运行mvn spring-boot: run时,它将启动一个Tomcat服务器并将您的Spring Boot应用程序部署在Tomcatlocalhost:8080上。mvn net,在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中。WEB-INF/classes/MyServlet.class中的类。

    例如,通过使用Thymeleaf(spring boot starter Thymeleaf),如果您构建了您的工件,IDE将从<code>/resources/templates</code>编译模板,并从那里开始在MVC项目中工作,您可以无缝集成REST控制器。

    Tomcat对于企业应用程序的部署方式至关重要,只是您需要在Spring中调整您的项目,以便它将正确的文件映射并编译到. WAR在部署之前。

    我的建议是,对于MVC,使用模板引擎而不是遗留的JSP。当然,在Spring项目中会有JSP的用例,但它需要不同的结构和依赖关系。

     类似资料:
    • 有没有办法绕过授权?

    • 我正在尝试将vaadin与spring(没有Spring Boot)和基于java注释的spring部分配置结合起来。 自动连接似乎适用于vaadin ui部分,但不适用于“自定义ui类”(例如,“公共类LoginScreen扩展自定义组件”)。我在SysOut上得到一个NPE或一个空对象。 此外,我注意到“@ComponentScan(base Packages={"net.myapp"})”没

    • 首先要说的是,我一直在寻找解决方案,现在我非常绝望。 当由Spring Boot运行时,我无法从html页面访问css文件。 html。文件 应用JAVA 文件夹结构: 我尝试过将文件夹放入文件夹和/或删除addResourcesHandler,通过相对路径引用css和其他一些东西。似乎没有什么能解决这个问题。请告诉我,如果你试图解决这个问题,但没有找到解决方案,这样我就知道,我不会被忽视。

    • 我将使用Ehcache和Springboot。我只是想知道在处理大量请求时,什么会是最佳配置。 在直播期间,我们可能会收到超过30000 req/h。虽然在开发中,我们无法生成此方案。 你能帮我如何计算内存,以创建一个最佳配置,应在Prod中完美工作。 我检查了Postman中的响应大小,在Dev中为3-5 kb,因此我保留了以下配置,但不确定它会有多好。我们的内存大小为2GB(在prod中,我们

    • 问题内容: 我必须在SpringBoot应用程序中使用@PathValiable从URL获取参数。这些参数通常带有 斜线 。我无法控制用户在URL中输入的内容,因此我想获取他输入的内容,然后我就可以对其进行处理。 我已经在这里浏览过材料和答案,我认为对我而言,好的解决方案不是要求用户以某种方式对输入的参数进行编码。 SpringBoot代码很简单: 因此,URL如下所示: 问题在于,参数 modu

    • 我尝试使用bytebuddy在springboot中实现aop。代码如下: springboot的监听器如下: 最后,在springboot启动中注册侦听器: 当我启动应用程序时,调试记录器显示良好。然而,当请求被处理时,aop不起作用。我做错了什么?我很困惑。。。

    • 我必须在SpringBoot应用程序中使用@PathValiable从URL获取参数。这些参数通常有斜线。我没有一个关于用户将输入URL的控制,所以我想要得到他输入的内容,然后我可以处理它。 我已经看过了这里的资料和答案,我不认为对我来说,好的解决方案是要求用户以某种方式编码输入参数。