Java 播放框架IF语句和FOR循环

Java 播放框架IF语句和FOR循环,java,playframework,playframework-2.4,Java,Playframework,Playframework 2.4,我是MVC新手,下面我有一个使用Solr搜索pdf元数据的页面。html端的if语句和for循环不起作用 在models文件夹中搜索.java: public class Searching { public String q; public String outputTitle; public String outputAuthor; public String outputContent; public String outputPage;

我是MVC新手,下面我有一个使用Solr搜索pdf元数据的页面。html端的if语句和for循环不起作用

在models文件夹中搜索.java:

public class Searching {

    public String q;

    public String outputTitle;
    public String outputAuthor;
    public String outputContent;
    public String outputPage;
    public String outputPath;

}
Application.java中的搜索函数:

    final static Form<Searching> searchForm = form(Searching.class);
    final static List<Searching> searchList = new ArrayList<Searching>(); 

public static Result search() {
Form<Searching> filledForm = searchForm.bindFromRequest();
        Searching searched = filledForm.get();

....(database connection lines)

QueryResponse response = solr.query(query);
SolrDocumentList results = response.getResults();
    if(results.isEmpty())
                System.out.println("SEARCH NOT FOUND");
    else {
        for (int i = 0; i < results.size(); ++i) {

            searched.outputTitle = (String)results.get(i).getFirstValue("title");
            searched.outputAuthor = (String)results.get(i).getFirstValue("author");
            searched.outputPage =results.get(i).getFirstValue("pageNumber").toString();
            searched.outputContent = (String)results.get(i).getFirstValue("content");
            searched.outputPath =  (String)results.get(i).getFirstValue("path");    
            searchList.add(searched);   
        }
        System.out.println("\nresults.getNumFound(): "+ searched.outputFound);
        System.out.println("results.size(): "+results.size());
        }
    return play.mvc.Results.ok(search.render(searched, searchForm, searchList)); 
    }
final static Form searchForm=Form(Searching.class);
最终静态列表searchList=newarraylist();
公共静态结果搜索(){
Form filledForm=searchForm.bindFromRequest();
search search=filledForm.get();
..(数据库连接线)
QueryResponse response=solr.query(查询);
SolrDocumentList结果=response.getResults();
if(results.isEmpty())
System.out.println(“未找到搜索”);
否则{
对于(int i=0;i
search.scala.html

@(searched: Searching, searchForm: Form[Searching], searchList: List[Searching])
.. some buttons,a search bar...
@if(searchList.isEmpty()) {
                <h1>Error</h1>
            } else {
                @for(search <- searchList) {
                <ul>Title: @search.outputTitle</ul> 
                <ul>Author: @search.outputAuthor <a href="@search.outputPath" download>Download PDF</a></ul>
                <ul>Number of Page(s): @search.outputPage</ul>
                }   
            }
@(搜索:搜索,搜索表单:表单[搜索],搜索列表:列表[搜索])
.. 一些按钮,一个搜索栏。。。
@if(searchList.isEmpty()){
错误
}否则{
@对于(search我正在明确发布答案,即使我能够在聊天中帮助OP-可能其他人遇到了这样的问题,但没有检查聊天:

问题是,即使for循环中有该行,您仍在使用相同的
searched
变量。您需要做的是在进入循环时重新初始化变量。类似于:

for (...) {
    searched = new Searching();
    searched.outputTitle = (String)results.get(i).getFirstValue("title");
    ....
    searchList.add(searched);
}
这就解决了副本的问题,现在一切都好了。

即使我能够在聊天中帮助OP,我还是明确地发布了答案-可能其他人遇到了这样的问题,但没有检查聊天:

问题是,即使for循环中有该行,您仍在使用相同的
searched
变量。您需要做的是在进入循环时重新初始化变量。类似于:

for (...) {
    searched = new Searching();
    searched.outputTitle = (String)results.get(i).getFirstValue("title");
    ....
    searchList.add(searched);
}

这就解决了重复项的问题,现在一切都好了。

你真的应该给变量和参数命名。无论如何,
listForm:List[搜索]
模板中用于迭代的参数为空。要么用数据填充列表,要么迭代其他内容。什么是专有名称?然后我想我需要在应用程序中更改inside for loop。javaWell命名您的参数
listForm
,然后说它属于
List类型[搜索]
并不是很直观。关键是,您只是创建一些静态字段并将其传递给模板-当然它将不包含任何数据。Java代码中还有另一个问题-您迭代
结果
,但只使用一个变量(
搜索
)-这样,您总是覆盖数据。行
searchList.add(searched);
必须在for循环中。现在您有一个列表,但只有一个元素。您认为您有两个元素,因为您打印了
results.getNumFound()
,但实际上您应该比较
results.getNumFound()
searchList.size()
并查看它们是否不同。因此,将上面提到的行放入for-loopLet-us中。您应该为变量和参数指定正确的名称。无论如何,
listForm:List[搜索]
模板中用于迭代的参数为空。要么用数据填充列表,要么迭代其他内容。什么是专有名称?然后我想我需要在应用程序中更改inside for loop。javaWell命名您的参数
listForm
,然后说它属于
List类型[搜索]
并不是很直观。关键是,您只是创建一些静态字段并将其传递给模板-当然它将不包含任何数据。Java代码中还有另一个问题-您迭代
结果
,但只使用一个变量(
搜索
)-这样,您总是覆盖数据。行
searchList.add(searched);
必须在for循环中。现在您有一个列表,但只有一个元素。您认为您有两个元素,因为您打印了
results.getNumFound()
,但实际上您应该比较
results.getNumFound()
searchList.size()
并查看它们是否不同。因此,将上述行放入for循环中。