代码之家  ›  专栏  ›  技术社区  ›  schoon

SpringMVC如何决定HomeController和JSP之间的冲突?

  •  3
  • schoon  · 技术社区  · 5 年前

    我正在转换Spring MVC app 弹簧靴。 Spring应用程序有一个主控制器:

    @RestController
    public class HomeController {...
        ...
    @RequestMapping("/login")
    public String login(Principal p) {
        return "login";
        }
    }
    

    它应该只显示“登录”一词。但是,这似乎被忽略了,因为它在src/webapp/web-inf/views下也有一个login.jsp,它可以做更多的工作,这就是它运行时显示的内容。

    当我将简单的web应用程序剪切粘贴到一个引导应用程序中时,我只得到“登录”这个词。

    对于更复杂的JSP输出,Spring如何神奇地忽略“login”这个词?我怎么在靴子里模仿这个?

    我尝试添加的PS:

    <dependency> 
        <groupId>org.apache.tomcat.embed</groupId> 
        <artifactId>tomcat-embed-jasper</artifactId> 
        <scope>provided</scope> 
    </dependency>
    
    spring.mvc.view.prefix=/views/ 
    spring.mvc.view.suffix=.jsp
    
    2 回复  |  直到 5 年前
        1
  •  3
  •   bkis    5 年前

    @RestController 不用于返回渲染 JSP 这就是为什么弹簧靴只是用绳子来回应的原因。 login . 尝试将此更改为以下内容:

    @Controller
    public class HomeController {
    
        @RequestMapping("/login")
        public String login(Principal p) {
            //do something with your Principal if you want...
            return "login";
        }
    }
    

    如果您正确配置了所有其他内容,Spring将查找一个名为 登录 (你的 JSP )并以此作为视图。

    REST控制器 是用于生成 RESTful Web Service (在控制器中定义的REST API端点)。

    顺便说一句, here 您可以找到更多关于如何继续的信息,不幸的是,还有一些不将JSP用于Spring引导和嵌入式容器的原因,而是使用不同的模板引擎。

    希望这有帮助!

    编辑:这个问题的另一个答案提到视图解析器-这确实不是不重要的!但这是一种特殊的情况,带有弹簧引导和JSP。为了让它正确, this article 我刚找到可能会有帮助!

        2
  •  1
  •   alain.janinm    5 年前

    在Spring框架中,如果您想向响应主体写入一个字符串,那么您将使用关键字 @ResponseBody . 从 documentation

    @因此,ResponseBody注释直接写入响应主体,而不是视图分辨率,并使用HTML模板呈现。

    或者,在你的情况下, @RestController 注释,即

    使用@controller和@responsebody进行注释的便利注释。

    如果不使用此关键字,那么Spring将搜索具有给定路径的文件。为此,它使用 viewResolver . 见 16.5 Views and resolving them

    下面是一个示例,您可以在其中看到允许Spring解析文件的实际路径的属性:

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>