【问题标题】:How to map all calls to *.html in a springboot controller?如何将所有调用映射到 springboot 控制器中的 *.html?
【发布时间】:2016-01-25 18:16:33
【问题描述】:

我正在尝试使用 Thymeleaf 模板和 springboot api 提供动态 html 页面。这是我想要实现的场景。

当有人提出以下请求时:hostname/client,另一方面,如果有人提出以下请求,应用程序将返回一个 Json 对象:hostname/client.html ,这个请求在不同的控制器中被捕获,以便我可以操作将返回的视图。

客户端控制器 这个类按预期工作,它返回一个 Json 对象

@RestController
public class ClientController {

    @Autowired
    public ClientService clientServiceImp;

   @RequestMapping("/client")
    public Client get(@RequestParam(value="name", defaultValue="World") String name){
        return clientServiceImp.getClient(name);
    }
}

家庭控制器 此类的方法不会将调用映射到 *.html

@Controller
public class HomeController {
    @RequestMapping(value={"/*.html"},  produces="text/html")   
    public String getIndex(Model model, HttpServletRequest request){

     // I will set here the thymeleaf fragment location based on the resource requested.
        return "index";
    }

*这是我在调用 hostname/client.html 后收到的错误 白标错误页面 *此应用程序没有显式映射 /error,因此您将其视为后备。 2016 年 1 月 25 日星期一 16:04:56 出现意外错误(类型=不可接受,状态=406)。 找不到可接受的代表**

Springboot基本配置

@SpringBootApplication(scanBasePackages = {"com.serviceira"})
public class App {
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
}

重要的是要指出我没有为应用程序设置任何其他配置。提前感谢您的帮助。

【问题讨论】:

  • 你需要为.html设置servlet映射。你是用xml还是java配置

标签: java json spring-mvc thymeleaf


【解决方案1】:

ClientController 正常工作的原因是因为您将其标记为@RestController,您是在告诉 Spring 直接将响应写入 html 页面。

但是,您的HomeController 找不到映射,因为您尚未设置 servlet 映射。

如果您在 Java 配置中:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("*.html");  // HERE YOU ARE SETTING THE .html mapping
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("your package name here");
        return context;
    }

}

如果您使用的是 XML,除了设置您的 servelt,您还需要这样的映射:

 <servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/servlet-config.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

【讨论】:

  • 感谢伙伴的快速回复。但是它没有工作,我如图所示实现了,但它仍然无法在控制器中捕获请求。我只使用 java conf... 我可以使用 html 扩展名调用任何东西,然后控制器 getIndex() 可以工作,但如果我调用 client.html 它就不起作用。
【解决方案2】:

问题已解决

我通过为每个控制器的 RequestMapping 注解添加不同的“produces”参数解决了这个问题,除了将 getIndex 的值从 /.html 更改为 .html。

HomeController

 @RequestMapping(value={"*.html"},  produces="text/html")   

客户端控制器

 @RequestMapping(value="/client" produces="application/json")

现在,每个包含 *.html 的请求都由 HomeController 类的 getIndex 方法接收和处理,而其他请求则由其自己的控制器处理。例如:

请求: GET:本地主机/客户端
控制器

 @RequestMapping(value="/client" produces="application/json")
        public Client get(@RequestParam(value="name", defaultValue="World") String name){
            return clientServiceImp.getClient(name);
        }

请求: GET:localhost/client.html
控制器

  @RequestMapping(value={"*.html"},  produces="text/html")   
        public String getIndex(Model model, HttpServletRequest request){

         // I will set here the thymeleaf fragment location based on the resource requested.
            return "index";
        }

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多