【问题标题】:Spring MVC Ajax Search Form ThymeleafSpring MVC Ajax 搜索表单 Thymeleaf
【发布时间】:2016-03-14 11:17:21
【问题描述】:

所以我试图在我网站的导航栏中创建一个搜索表单,并且我正在使用 ajax 提交表单。我的网络应用程序中有其他可用的搜索表单,所以我知道该怎么做。而且我已经正确提交了ajax。我只是不知道如何从表单中获取数据并在控制器中使用它来获得我想要的结果。

我执行搜索功能的方式是创建一个 searchForm.java 对象,该对象具有一个名为 searchString 的字符串变量,然后我填充它,然后使用存储库类中的 spring 数据方法在控制器中的数据库中查询它。

这就是我的 jquery ajax 表单的样子,在 chrome 开发人员工具的控制台中,它返回“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>

这是我的 thymeleaf html 页面

<form action = "setSearch" class="navbar-form navbar-right">
            <div class="form-group">
            <input type="text" class="form-control" placeholder="Search" id="newSearch"></input>
            <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
            </div>
            <button type="button" class="btn btn-default" id="searchButton">Search</button>
</form>

这是我的 searchForm.java 对象

public class SearchForm {

private String searchString;

public String getSearchString()
{
    return searchString;
}

public void setSearchString(String searchString)
{
    this.searchString = searchString;
}
}

这是我的控制器,我知道这不起作用,因为我返回的是字符串而不是 json 对象(我认为这是正确的)。但是我试图改变它,我得到了很多错误,我不知道我应该怎么做。

 @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";
}

这是我的控制器中的非 ajax 搜索功能的工作示例,所以你们可以看到我正在尝试做什么。

@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";
}

如果我遗漏了任何内容,或者您​​是否需要查看更多代码来查看我的问题,请告诉我。提前致谢。

【问题讨论】:

    标签: ajax spring-mvc spring-data thymeleaf


    【解决方案1】:

    如果您只提交一个参数并且它将是restfull,则不需要表单或POST

    这是一个简单的示例,说明我将如何进行从数据库返回一组对象的搜索。我希望你可以用它来实现你所需要的。

    HTML

    <form>
    <label for="search_input">Search:</label>
    <input type="text" id="search_input">
    </form>
    

    Javascript

    <script>
    $.get("/search", {term: $('#search_input').val()}, function(data) {
    // do your data manipulation and transformation here
    });
    </script>
    

    控制器

    RequestMapping("/search")
    public @ResponseBody List searchPost(@RequestParameter("term") String query) {
    
        List<Object> retVal = getListOfObjectFromDbBasedOnQuery(query);
    
        return retVal;
    }
    

    更简单(从逻辑角度来看),记住在 RESTfull 术语中 post 用于创建对象。仅使用 GET 检索数据。

    【讨论】:

    • 这看起来确实简单多了,我是javascript部门的初学者,所以需要什么样的“数据操作和转换”,也可以重定向到搜索页面提交的数据?
    • “数据操作和转换”是为了表明你在那个空间内对返回的数据做任何你想做的事情。即显示它,转换它,随心所欲。是的,可以使用提交的数据重定向到另一个页面,但这是一个全新的问题,实际上你不应该这样做,除非你有像向导一样的流程,你可以在其中逐步注册。如果您只是要进行搜索,那么您应该在通过 HTML5 中的“必需”属性在客户端提交之前确保数据存在
    • 好的,我知道这可能是一个单独的问题,但是典型的导航栏搜索如何工作?
    • 那里没有适合所有人的答案。这确实是您需要搜索做什么的案例。基于导航栏的搜索表示快速搜索或基于单个参数的搜索。高级搜索,其庞大的形式是您在搜索中输入多个参数以供使用。示例 google.com 是单个参数,google.com.au/advanced_search 是一个复杂的形式。
    • @dochsner 如果有帮助你能接受答案吗,感谢支持
    猜你喜欢
    • 2016-03-13
    • 2017-11-13
    • 2023-03-25
    • 2014-01-25
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多