サブジェクトとカテゴリを含む Java サーブレットと JSP ファイルを使用しています。ブラウザを使用して JSP ページにアクセスすると、doGET メソッドが使用されます。このメソッドでは、複数選択フォームに入力する必要があるサブジェクトとカテゴリのすべてのリストを宣言します。
私がやりたいことは、jQuery を使用して、ユーザーが適切な複数選択フォームで選択したカテゴリを変更するたびに、サブジェクトの複数選択の内容が自動的に変更され、Web ページを更新することなく変更されることです。
カテゴリとサブジェクトの関係は、HashMap (カテゴリ -> サブジェクト) で JSP ファイルに送信されますが、それをどのように使用できるかわかりませんでした。
友人は、複数選択でサブジェクトを動的に更新するには、jQuery で doPost メソッドを使用し、更新されたリストを JSP ページに送り返す必要があると教えてくれました (下記の doPOST メソッドを参照してください。 m 選択したカテゴリのリストを動的に表示しようとしています。
しかし、このコードは機能しません。私の POST は FireBug に従って送信されますが、複数選択は更新されません。私は何かを忘れましたか?
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
SubjectDAO subjectDao;
RelationDAO relationDao;
TripletDAO tripletDao;
CollectionDAO collectionDao;
try
{
//Récupération de la session courante
HttpSession session = request.getSession();
int idCollection = 1; //Integer.parseInt((String) session.getAttribute("idCollection"));
//TODO: Remplacer le 1 par le commentaire quand les collections marcheront bien
//Initialisation des DAO nécessaires
tripletDao = daoFactory.getTripletDAO();
collectionDao = daoFactory.getCollectionDAO(); //DAOFactory.getDAOFactory(DAOFactory.MYSQL).getCollectionDAO();
subjectDao = daoFactory.getSubjectDAO();
relationDao = daoFactory.getRelationDAO();
//Formation des listes nécessaires
List<Subject> listSubject = subjectDao.selectAll(false, collectionDao.selectId(idCollection)); //Tous les sujets de la collec' courante
List<Relation> listRelation = relationDao.selectAll(false, collectionDao.selectId(idCollection)); //Toutes les relations de la collec' courante
List<Triplet> listTriplet = tripletDao.selectAll(false, collectionDao.selectId(idCollection)); //Tous les triplets de la collec' courante
//TODO: Voir ce qu'on peut faire pour éviter l'utilisation des listes ci-dessous!
ArrayList<String> entitledOfSubjects = new ArrayList<String>(listOfSubjectsEntitled(session, listSubject));
ArrayList<String> entitledOfRelations = new ArrayList<String>(listOfRelationsEntitled(session, listRelation));
//Récupération de la liste des catégories (de la collection courante)
Subject sCategory = subjectDao.selectSystem("CATEGORY");
Relation rIs = relationDao.selectSystem("ISA");
Relation rIn = relationDao.selectSystem("IN CATEGORY");
//La liste listCategory2 contient tous les triplets qui contiennent "ISA CATEGORY". Elle s'appelle listCategory2 parce que listCategory c'est celle de la sidebar!
List<Triplet> listCategory2 = tripletDao.selectAll(-1, rIs.getId(), sCategory.getId(), TripletType.SUBJET, TripletType.SUBJET, false, true, collectionDao.selectId(idCollection));
//Liste des différents compléments des triplets de la collec' courante
ArrayList<Subject> listComplement = new ArrayList<Subject>();
for (int i=0; i<listTriplet.size(); i++)
{
Subject s = listTriplet.get(i).getSComplement();
if (!subjectIsInList(session, s, listComplement) && s!=null && subjectIsInList(session, listTriplet.get(i).getSSubject(), listSubject)
&& relationIsInList(session, listTriplet.get(i).getRelation(), listRelation))
{
listComplement.add(s);
}
}
//Liste des triplets de la collection courante qui ont pour relation "IN CATEGORY"
List<Triplet> listTripletSysteme = tripletDao.selectAllByRelation(rIn.getId(), collectionDao.selectId(idCollection)); //(true, collectionDao.selectId(idCollection));
//Liste des différentes catégories des compléments relevés précédemment
ArrayList<Subject> listComplementCategory = new ArrayList<Subject>();
for (int i=0; i<listTripletSysteme.size(); i++)
{
Subject s = listTripletSysteme.get(i).getSComplement();
if (!subjectIsInList(session, s, listComplementCategory) && s!=null && subjectIsInList(session, listTripletSysteme.get(i).getSSubject(), listComplement))
{
listComplementCategory.add(s);
}
}
//Variables à envoyer à la page JSP
request.setAttribute("listSubject", listSubject);
request.setAttribute("listRelation", listRelation);
request.setAttribute("listCategory2", listCategory2); //session au lieu de request pour la sidebar
request.setAttribute("listComplementCategory", listComplementCategory);
request.setAttribute("listComplement", listComplement);
//TODO: Use of these deprecated by Joe
request.setAttribute("entitledOfSubjects", entitledOfSubjects);
request.setAttribute("entitledOfRelations", entitledOfRelations);
//HashMap (Titre de Catégorie -> liste de titres de sujets lui appartenant)
HashMap<String, ArrayList<String>> categorySubjectsHashMap = new HashMap<String, ArrayList<String>>();
for (int i=0; i<listCategory2.size(); i++)
{
Subject categorie = listCategory2.get(i).getSSubject();
String entitled = categorie.getEntitled((String) session.getAttribute("lang"));
ArrayList<String> listeSujetsCategorie = new ArrayList<String>();
for (int j=0; j<listTripletSysteme.size(); j++)
{
Triplet tripletSysteme = listTripletSysteme.get(j);
if (tripletSysteme.getSComplement().getEntitled((String) session.getAttribute("lang")).equals(entitled) &&
!listeSujetsCategorie.contains(tripletSysteme.getSSubject().getEntitled((String) session.getAttribute("lang"))))
{
listeSujetsCategorie.add(tripletSysteme.getSSubject().getEntitled((String) session.getAttribute("lang")));
}
}
categorySubjectsHashMap.put(entitled, listeSujetsCategorie);
}
request.setAttribute("categorySubjectsHashMap", categorySubjectsHashMap);
//request.setAttribute("listTriplet", listTriplet);
//Subject sCategory = subjectDao.selectSystem("CATEGORY");
//Relation rIs = relationDao.selectSystem("ISA");
/*CollectionDAO collectionDao = DAOFactory.getDAOFactory(DAOFactory.MYSQL).getCollectionDAO();
//int idCollection = Integer.parseInt((String) session.getAttribute("idCollection"));
//List<Triplet> listCategory = tripletDao.selectAll(-1, rIs.getId(), sCategory.getId(), TripletType.SUBJET, TripletType.SUBJET, false, true, collectionDao.selectId(idCollection));
//request.setAttribute("listCategory", listCategory);
//Sert à "overrider" idCollection*/
//int id = add(request);
}
catch (DAOException e)
{
log.error("An error occured", e);
request.setAttribute("error", e.getMessage());
request.getRequestDispatcher("/WEB-PAGES/Other/error.jsp").forward(request, response);
return;
}
// Set page title
request.setAttribute("title", "Creation");
request.getRequestDispatcher("/WEB-PAGES/Creation/creation.jsp").forward(request, response);
//HttpSession session = request.getSession();
//String root = (String) session.getAttribute("root");
//response.sendRedirect(root + "creation");
//TODO: fix root = null
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
//ArrayList<String> al = new ArrayList<String>();
String[] selectedSubjectCategories = request.getParameter("selectedSubjectCategories").split(",");
ArrayList<String> entitledOfSubjects = new ArrayList<String>();
for (int i=0; i<selectedSubjectCategories.length; i++)
{
entitledOfSubjects.add(selectedSubjectCategories[i]);
}
request.setAttribute("entitledOfSubjects", entitledOfSubjects);
}
また、ここに 2 つの複数選択を含む JSP ファイルのスニペットがあります。1 つ目はカテゴリを選択するもので、2 つ目は選択したカテゴリに属するサブジェクトを動的に表示するものです。
<div id="subjectCategoriesDiv">
<select name="subjectCategories" multiple="multiple" id="subjectCategories">
<option value="None">-- NONE --</option>
<c:forEach items="${listCategory2}" var="triplet">
<option value="<c:out value="${triplet.SSubject.getEntitled(lang)}" />"><c:out value="${triplet.SSubject.getEntitled(lang)}" /></option>
</c:forEach>
</select>
<script>
$(document).ready(function ()
{
$('#subjectCategories').change(function()
{
var selectedOptions = $('#subjectCategories option:selected');
var selectedValues = $.map(selectedOptions ,function(option)
{
return option.value;
}).join(',');
$.ajax({
type: "POST",
url: "creation",
data: 'selectedSubjectCategories='+selectedValues
});
}
);
}).change();
</script>
</div>
<div class="subjectsListDiv">
<select name="subjectslist" multiple="multiple" id="subjectslist">
<c:forEach items="${entitledOfSubjects}" var="subject">
<option value="<c:out value="${subject}" />"><c:out value="${subject}" /></option>
</c:forEach>
</select>
<script>
$(document).ready(function ()
{
});
</script>
</div>
前もって感謝します。