带Thymeleaf的Spring mvc Ajax搜索表单
我正试图在我的spring mvc web应用程序的每个页面的导航栏中添加一个搜索表单,就像stackoverflow上的表单一样,我遇到了一些问题。现在,我在我的几个页面上使用了一个有效的搜索功能,使用典型的mvc表单。我获取输入的字符串并将名为“searchString”的变量存储在我创建的名为“searchForm.java”的对象中。然后,我尝试使用spring数据的FindByContain方法查询数据库中输入的字符串,然后将结果放在模型上,然后使用thymeleaf在视图上表示。然而,我认为导航栏应该使用ajax来完成,因为它在每个页面和其他表单的页面上 因此,我想我正在将提交到导航栏中搜索表单的字符串发送到控制器,在那里我在存储库中查询它以返回搜索结果,然后我尝试将搜索结果放在模型上,但我什么也没有得到,它所做的只是将我重定向到搜索页面。我可能没什么道理,但我会展示我的代码,如果有人能让我知道我是否以正确的方式处理我的问题,如果你们看到我的代码中有任何错误。提前谢谢 下面是我提交表单的ajax和jquery带Thymeleaf的Spring mvc Ajax搜索表单,ajax,spring-mvc,spring-data,thymeleaf,Ajax,Spring Mvc,Spring Data,Thymeleaf,我正试图在我的spring mvc web应用程序的每个页面的导航栏中添加一个搜索表单,就像stackoverflow上的表单一样,我遇到了一些问题。现在,我在我的几个页面上使用了一个有效的搜索功能,使用典型的mvc表单。我获取输入的字符串并将名为“searchString”的变量存储在我创建的名为“searchForm.java”的对象中。然后,我尝试使用spring数据的FindByContain方法查询数据库中输入的字符串,然后将结果放在模型上,然后使用thymeleaf在视图上表示。然而
<script th:inline="javascript">
/*<![CDATA[*/
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
$(document).ready(function(){
$("#searchButton").on("click", function(ev) {
$.ajax({
url : "navSearch",
type : "post",
data : {
"newSearch" : $("#newSearch").val()
},
success : function(data) {
console.log(data);
},
error : function() {
console.log("There was an error");
}
});
});
});
/*]]>*/
</script>
这是我的searchForm.java类,我临时将要查询的字符串存储在数据库中
public class SearchForm {
private String searchString;
public String getSearchString()
{
return searchString;
}
public void setSearchString(String searchString)
{
this.searchString = searchString;
}
}
这是我的控制器,我试图处理ajax提交,并将其作为搜索结果返回到setSearch.html页面。我在这里想的是,表单中的字符串“newSearch”可以使用Spring数据查询方法进行匹配,然后能够返回它并将其添加到模型中,但它不起作用,它只是将我重定向到没有数据的/searchSet页面,因为这是表单操作的所在,也是我告诉它返回的内容。所以老实说,我不确定是否有任何数据达到了这一点
@RequestMapping(value="setSearch/navSearch", method=RequestMethod.POST)
public @ResponseBody String navSearch (@RequestParam String newSearch, ModelMap model)
{
List<QuestionAnswerSet> questionAnswerSetByQuestion = (List<QuestionAnswerSet>) questionAnswerSetRepo.findByQuestionContaining(newSearch);
model.put("searchResult", questionAnswerSetByQuestion);
return "setSearch";
}
这是我的工作指南
<script th:inline="javascript">
/*<![CDATA[*/
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
$(document).ready(function(){
$("#searchButton").on("click", function(ev) {
$.ajax({
url : "/setSearch/search",
type : "post",
data : {
"newSearch" : $("#newSearch").val()
},
success : function(data) {
console.log(data);
},
error : function() {
console.log("There was an error");
}
});
});
});
/*]]>*/
</script>
/**/
但它不起作用,它只是将我重定向到/searchSet页面
没有数据,因为那是表单操作的地方
我对它说什么让它回来
您是对的,这是因为您正在提交表单,并且在操作中指定表单提交到
setSearch
,这就是页面被重定向到同一页面的原因。只需将button type=“submit”
替换为button type=“button”
,这样在单击searchButton
时表单就不会提交。一些事情,搜索应该是一个GET而不是POST请求(遵循Restfull原则)。接下来单击控制台本身中的错误,并查看其来源。它是来自javascript还是您的服务器代码?然后复制错误代码部分并将其放入问题中。错误来自jquery.min.js:5
请求是否已发布?我没有看到你发布的代码有任何错误。可能是由其他代码引起的。这很奇怪,但现在它说它在第9026行,当我点击它时,它与这一节有关setRequestHeader:function(name,value){var lname=name.toLowerCase();if(!state){name=requestHeadersNames[lname]=requestHeadersNames[lname]| | name;requestHeader[name]=value;}
我明白了,所以问题就在这里xhr.setRequestHeader(header,token)
。可能没有定义名为\u csrf
和csrf\u头
的元?好的,我更改了,现在它不再重定向,但我得到错误未捕获类型错误:仍然无法读取控制台中未定义的的属性“toLowerCase”。
@RequestMapping(value="/setSearch", method=RequestMethod.GET)
public String searchGet(ModelMap model) {
SearchForm searchForm = new SearchForm();
model.put("searchForm", searchForm);
return "setSearch";
}
@RequestMapping(value="/setSearch", method=RequestMethod.POST)
public String searchPost(@ModelAttribute SearchForm searchForm, ModelMap model) {
List<QuestionAnswerSet> questionAnswerSetByQuestion = (List<QuestionAnswerSet>) questionAnswerSetRepo.findByQuestionContaining(searchForm.getSearchString());
model.put("searchResult", questionAnswerSetByQuestion);
return "setSearch";
}
@RequestMapping(value="/setSearch/search", method=RequestMethod.POST)
public @ResponseBody String search (@RequestParam String newSearch, ModelMap model)
{
List<QuestionAnswerSet> questionAnswerSetByQuestion = (List<QuestionAnswerSet>) questionAnswerSetRepo.findByQuestionContaining(newSearch);
model.put("searchResult", questionAnswerSetByQuestion);
return "setSearch";
}
<script th:inline="javascript">
/*<![CDATA[*/
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
$(document).ready(function(){
$("#searchButton").on("click", function(ev) {
$.ajax({
url : "/setSearch/search",
type : "post",
data : {
"newSearch" : $("#newSearch").val()
},
success : function(data) {
console.log(data);
},
error : function() {
console.log("There was an error");
}
});
});
});
/*]]>*/
</script>