Thymeleaf表单对接GetMapping,无重定向接收输入查询数据库
酒店搜索去重定向改造实现
核心逻辑说明
你现在的实现多了一次完全没必要的重定向:表单本来就会把GET参数直接发给/search接口,完全没必要在这个接口里拿了参数再跳一次到路径格式的地址。只要把/search接口的逻辑从“中转参数跳走”改成“直接查库返回结果”,就能完全去掉中间跳转步骤。
具体实现步骤
- 表单配置确认
你当前的表单代码完全不需要修改action配置:
因为这是GET方法提交的Thymeleaf表单,<form data-th-object="${findHotel}" method="get" data-th-action="@{/search}"> <input class="searchBoxTextEditor" type="text" placeholder="Enter name of the hotel" data-th-field="*{name}"> <input type="submit" value="find"> </form>data-th-field="*{name}"会自动给输入框生成name="name"属性,用户输入内容提交时,浏览器会自动生成类似/search?name=用户输入的酒店名的请求,直接匹配/search路径的接口,不需要额外调整表单路径。 - 控制器逻辑调整
删掉原来的重定向逻辑,直接让/search接口承担查询和结果返回的职责,原来带路径变量的/search/{text}接口可以直接移除。调整后的控制器代码示例:@GetMapping("/search") public String getSearchResult(FindHotel findHotel, Model model) { // 直接获取表单绑定的酒店名参数,不需要手动从路径取值 String keyword = findHotel.getName(); List<Hotel> matchHotels = hotelService.findHotelByNameLike(keyword); model.addAttribute("hotels", matchHotels); // 直接返回结果页,不做任何重定向 return "hotels"; }
常见踩坑提醒
- 不要尝试修改表单action为
/search/就指望输入值自动拼到路径上:原生HTML表单没有这种自动替换路径占位符的能力,所有GET提交的参数都会被拼到URL后面的查询串里,要是硬要实现路径格式的URL且不跳转,就得写JS拦截提交事件手动拼路径,反而提升了代码复杂度,不如直接用查询参数的形式。 - 改造后整个搜索链路仅需1次请求:用户输入关键词提交 → 后端直接接参、查库、返回结果页,没有302跳转带来的额外加载耗时。
内容的提问来源于stack exchange,提问作者Iroofeee
相关产品推荐
相关产品推荐

