これは私が作成しようとしているオンライン図書館のウェブサイトです。複数の入力を取ることができる高度な検索では、すべての出版物の配列から始め、ユーザーの入力と一致しない項目を削除します。これは、配列がちょうど正しい配列に短縮される最初の、うまく動作します。したがって、誰かが "プログラミング"をタイプした場合、そのタイトルでプログラミングされているすべての出版物が表示されます。ユーザーがNavBar上の "Advance Search"ボタンを再度クリックすると(welcome.jspに示されているように)、入力が "UML"と表示されると、私のコードは短縮された配列上でUMLの検索を実行します。 "私は(制御サーブレットで)JSPを再インスタンス化しない
SearchResult sr = new SearchResult(); sr.searchContains = publications;
上記のprint文を入れているし、それが入力UMLとプログラミングの両方に出力しますが、すべての出版物を使用して新しい配列を作成しないようにどちらかのようですか?
searchResult.jsp:
<c:forEach var="current" items="${sr.searchContains}"> Title: ${current.title} </c:forEach>
ControllerServlet.java:
if (action.equals("advSearch")) {
SearchResult sr = new SearchResult();
sr.searchContains = publications;
nextPage = "searchResult.jsp";
String titleString = request.getParameter("titleString");
if (!titleString.equals("")){
ArrayList<Publication> toRemove = new ArrayList<Publication>();
for (Publication p : sr.searchContains){
if (!p.title.contains(titleString)){
toRemove.add(p);
}
}
sr.searchContains.removeAll(toRemove);
}
request.getSession().setAttribute("sr", sr);
RequestDispatcher rd = request.getRequestDispatcher("/"+searchResult.jsp);
rd.forward(request, response);
のwelcome.jsp:
<ul class="nav navbar-nav">
<li class="active"><a href="advancedSearch.jsp">Advance Search <span class="sr-only">(current)</span></a></li>
</ul>
advancedSearch.jsp:
<form action="controller" method="POST">
<div class="form-group">
<label for="title">Title:</label>
<input type="text" class="form-control" name="titleString">
<input type="hidden" name="action" value="advSearch" />
</div>
<button type="submit" class="btn btn-default">Advanced Search</button>
</form>
SearchResult.jsp:
public class SearchResult {
public ArrayList<Publication> searchContains = new ArrayList<Publication>();
public ArrayList<Publication> getSearchContains(){
return this.searchContains;
}
}