【问题标题】:Spring boot application returning the string name of the JSP rather than the JSP itselfSpring Boot 应用程序返回 JSP 的字符串名称而不是 JSP 本身
【发布时间】:2018-02-19 04:26:23
【问题描述】:

我正在使用 Spring Boot 开发一个 Web 应用程序。

用例是,如果用户访问主页,他每次都会被重定向到一个新的唯一 URL。例如:www.qqd.com --> www.qqd.com\jsdh。 下次它会有所不同,比如 www.qqd.com\dkjfbd

但在这两种情况下,它都会显示相同的 JSP。 我将它作为一个 REST 框架来做,以便将来我也可以扩展到移动应用程序开发。

package com.example.qqd;

import org.apache.log4j.Logger;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

@RestController
public class QDetailsService {

    Logger log = Logger.getLogger(QDetailsService.class);

    @GetMapping("/")
    public ModelAndView getNewUrl(ModelMap model){
       log.info("URL generated is: ");
       return new ModelAndView("redirect:/"+"abcde", model);
    }

    @RequestMapping(value="/{url}")
    public String addDetails(@PathVariable String url){
        log.info("URL: " + url + " , detail: " );
        //return new ModelAndView("home.jsp");
        return "home";
    }
}

ServletInitializer.java

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(QqdApplication.class);
    }
}

QQdApplication.java

@SpringBootApplication //This annotation means, it is the starting point of the app. 
public class QqdApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(QqdApplication.class, args);
    }
}

【问题讨论】:

  • 您正在使用@RestController 注释。应该是@Controller。 RestController 具有 @ResponseBody 注释,使其将响应绑定到正文,而不是解析视图。
  • 如果我使用@Controller,addDetails()应该返回String还是ModelAndView()?
  • 您可以使用 String 或 ModelAndView。随心所欲。
  • 我都试过了,我得到了出现意外错误(类型=内部服务器错误,状态=500)。圆形视图路径 [home]:将再次分派回当前处理程序 URL [/Qqd/home]。检查您的 ViewResolver 设置! (提示:由于默认视图名称生成,这可能是未指定视图的结果。)
  • 这是因为您的@RequestMapping(value="/{url}") 映射基本上捕获了所有URL。

标签: spring jsp spring-mvc spring-boot


【解决方案1】:

您是否尝试过返回 ModelAndView 对象?请注意,我从 home.jsp 中删除了 .jsp

@RequestMapping(value="/{url}")
public ModelAndView addDetails(@PathVariable String url){
    log.info("URL: " + url + " , detail: " );
    return new ModelAndView("home");
}

【讨论】:

  • 如果这样做,我会收到此错误:此应用程序没有 /error 的显式映射,因此您将其视为后备。出现意外错误(类型=内部服务器错误,状态=500)。圆形视图路径 [home]:将再次分派回当前处理程序 URL [/Qqd/home]。检查您的 ViewResolver 设置! (提示:由于默认视图名称生成,这可能是未指定视图的结果。)
  • 我没有像 web.xml 这样的解析器或任何东西。我只有 pom.xml。在 Spring 启动之前,在通常的 Spring MVC 中,我使用 xml 进行配置。
【解决方案2】:

好的,我自己找到了解决方案,以下确实有效 Step1:在application.properties中有以下几行

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

第 2 步:我没有看到 Spring 工具套件在 src/webapp 下创建 WEB-INF/jsp 文件夹。所以创建它并将jsp移动到该文件夹​​下。

这就像一个魅力。谢谢大家帮助我。

【讨论】:

    【解决方案3】:

    这是一个大问题,我几乎花了2个多小时,但终于解决了。

    第 1 步:添加到 application.properties:-

         - spring.mvc.view.prefix=/WEB-INF/pages/
         - spring.mvc.view.suffix=.jsp
    

    第 2 步:添加到 pom.xml:-

         -dependency 
          <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
          </dependency>
    

    控制器

            @RequestMapping(value="/homepage",method=RequestMethod.GET)
                public String hello(Model model)
                {
                    model.addAttribute("message","Hello");
                    return "myjsppage";
                }
    

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2021-01-06
      • 2020-01-13
      • 2019-05-10
      • 2018-11-07
      • 2021-08-14
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多