如何使用Spring提供.html文件

Gle*_*eeb 66 java spring spring-mvc

我正在使用Spring开发一个网站,并且我正在尝试提供不是.jsp文件的资源(例如.html)

现在我已经注释掉了我的servlet配置的这一部分

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
Run Code Online (Sandbox Code Playgroud)

并试图从控制器返回资源的完整路径.

@Controller
public class LandingPageController {

protected static Logger logger = Logger.getLogger(LandingPageController.class);

@RequestMapping({"/","/home"})
public String showHomePage(Map<String, Object> model) {
    return "/WEB-INF/jsp/index.html";   
   }
}
Run Code Online (Sandbox Code Playgroud)

index.html文件存在于该文件夹中.

注意:当我将index.html更改为index.jsp时,我的服务器现在正确地提供页面.

谢谢.

and*_*dyb 100

最初的问题是配置指定了一个属性,suffix=".jsp"因此ViewResolver实现类将添加.jsp到从方法返回的视图名称的末尾.

但是,由于您注释掉了InternalResourceViewResolver那时,根据应用程序配置的其余部分,可能没有注册任何其他ViewResolver.您可能会发现现在没有任何工作.

由于.html文件是静态的,并且不需要servlet处理,因此使用<mvc:resources/>映射更有效,也更简单.这需要Spring 3.0.4+.

例如:

<mvc:resources mapping="/static/**" location="/static/" />
Run Code Online (Sandbox Code Playgroud)

这将通过启动与所有请求/static/webapp/static/目录.

因此,通过从您的方法index.html中输入webapp/static/和使用return "static/index.html";,Spring应该找到视图.

  • 只是一点点评论.我甚至不必在方法中返回"page.html",因为不再需要该方法.如果用'method'表示一个响应GET请求的@Controller类的方法,我们不再需要它们,就像`<mvc:resources mapping>`我们将拦截对/ static /的所有请求...并将它们直接重定向到/ webapp/static中的资源,因此甚至不调用控制器的"onHttpGet"方法.所以我评论了这种方法,它仍然有效;-)谢谢 (4认同)
  • 令人惊讶的是这有效.只需要一个小的更改,你需要返回"static/index.html". (3认同)
  • 一万感谢!它解决了我在项目上遇到的很多问题 (2认同)

Iva*_*van 8

我只是补充一点,你不需要为它实现一个控制器方法,因为你可以在servlet配置文件中使用view-controller标签(Spring 3):

<mvc:view-controller path="/" view-name="/WEB-INF/jsp/index.html"/>
Run Code Online (Sandbox Code Playgroud)


wal*_*ros 8

问题的背景

首先要理解的是:它不是渲染jsp文件的spring.它是JspServlet(org.apache.jasper.servlet.JspServlet).这个servlet附带Tomcat(jasper编译器)而不是spring.这个JspServlet知道如何编译jsp页面以及如何将它作为html文本返回给客户端.默认情况下,tomcat中的JspServlet只处理匹配两种模式的请求:*.jsp和*.jspx.

现在当spring用InternalResourceView(或JstlView)渲染视图时,确实发生了三件事:

  1. 从模型中获取所有模型参数(由控制器处理程序方法返回ie "public ModelAndView doSomething() { return new ModelAndView("home") }")
  2. 将这些模型参数公开为请求属性(以便JspServlet可以读取它)
  3. 转发请求到JspServlet.RequestDispatcher知道应该将每个*.jsp请求转发到JspServlet(因为这是默认的tomcat配置)

当您只是将视图名称更改为home.html时,tomcat将知道如何处理请求.这是因为没有servlet处理*.html请求.

怎么解决这个问题.有三个最明显的解决方案:

  1. 将html暴露为资源文件
  2. 指示JspServlet也处理*.html请求
  3. 编写自己的servlet(或传递给另一个现有的servlet请求到*.html).

有关完整的代码示例如何实现这一点,请在另一篇文章中回答我的答案:如何将请求映射到Spring MVC中的HTML文件?


Sas*_*shi 7

您仍然可以继续使用相同的View解析程序,但将后缀设置为空.

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/jsp/" p:suffix="" />
Run Code Online (Sandbox Code Playgroud)

现在您的代码可以选择返回index.html或index.jsp,如下面的示例所示 -

@RequestMapping(value="jsp", method = RequestMethod.GET )
public String startJsp(){
    return "/test.jsp";
}

@RequestMapping(value="html", method = RequestMethod.GET )
public String startHtml(){
    return "/test.html";
}   
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于.html文件.只有.jsp (6认同)

归档时间:

查看次数:

142889 次

最近记录:

5 年,11 月 前