Как передать параметр в JSP в этом случае

У меня есть структура БД, как:

Это doGet() Сервлет Контроллера как:

protected void doGet(HttpServletRequest request,
                    HttpServletResponse response) throws ServletException, IOException {
    getSubjects(request, response);
}

и getSubjects(запрос, ответ) - это:

private void getSubjects(HttpServletRequest request,
                    HttpServletResponse response) throws ServletException{
            try {
                    List<Subject> subjects = subjectDAO.subjectList();// I'm sending subjects List as Arttribute and, Please SEE *** below
                    ### HERE by passing subject ID Here.
                    List<Page> pages = pageDAO.topicList(subjectId); // Now I want to send pages List as Arttribute as well and, Please SEE### below
                    request.setAttribute("subjects", subjects);
                    request.setAttribute("pages", pages);
                    getServletContext().getRequestDispatcher("/view.jsp").forward(
                                    request, response);
            } catch (Exception e) {                        
                    throw new ServletException("Error ", e.getCause());
            }
    }

а это мой JSP

<ul class="subjects">    *** HERE below I'm getting that subjects List.
                        <c:forEach items="${subjects}" var="subject">
                          <li
                            <c:catch>
                              <c:choose>
                                <c:when test="${subject.subjectId == param.subj_id}">
                                <c:out value=" class=\"selected\""/>
                                </c:when>
                              </c:choose>    
                            </c:catch>><a href='/contexct/super-controller?action=view-content&subj_id=
                           <c:out value="${subject.subjectId}"/>'>
                           <c:out value="${subject.subjectName}" />
                           </a></li>
                           <ul class="pages">
                            ### HERE below I can get that pages List .But how can I get value of subjectId So that I can get pages from DB, Please SEE$$$ above.
                            <c:forEach items="${pages}" var="page">
                                <li
                                  <c:catch>
                                     <c:choose>
                                        <c:when test="${page.pageId == param.topic_id}">
                                        <c:out value=" class=\"selected\""/>
                                       </c:when>
                                     </c:choose>    
                                   </c:catch>><a href='/contexct/super-controller?action=view-content&amp;topic_id=
                             <c:out value="${page.pageId}"/>'>
                             <c:out value="${page.pageName}" />
                           </a></li>
                         </c:forEach>
                       </ul>
                     </c:forEach>
                    </ul>

Как я получаю данные субъекта в JSP через:

<c:forEach items="${subjects}" var="subject">

Теперь, как я могу передать идентификаторы темы в эту строку в getSubjects():

 List<Page> pages = pageDAO.topicList(subjectId);

Так что я могу получить страницы, соответствующие теме и установить этот список как:

 request.setAttribute("pages", pages);

Надеюсь, теперь вы можете понять мою проблему

ОБНОВИТЬ

Я отлажен таким образом:

private void getSubjects(HttpServletRequest request,
        HttpServletResponse response) throws ServletException{
    try {
        List<Subject> subjects = subjectDAO.subjectList();
        List<Page> pages = null;
        for (int i = 0; i < subjects.size(); i++) {
            pages = pageDAO.topicList(subjects.get(i).getSubjectId());
            System.out.println("List id is " + subjects.get(i).getSubjectId());
                            for (int i = 0; i < subjects.size(); i++) {
            pages = pageDAO.topicList(subjects.get(i).getSubjectId());
            System.out.println("List id is " + subjects.get(i).getSubjectId());
            for (int j = 0; j < pages.size(); j++) {                    
                System.out.println("Topics are " +pages.get(j).getTopicName());
            }
        }
        }
        request.setAttribute("subjects", subjects);
        request.setAttribute("pages", pages);
        getServletContext().getRequestDispatcher("/content.jsp").forward(
                request, response);
    } catch (Exception e) {             
        throw new ServletException("Cannot obtain subjects from DB", e.getCause());
    }
}

я получил Console как:

List id is 1
Topics are App User Interface
List id is 2
Topics are Java Basics
Topics are OOP
List id is 3
List id is 4

что правильно, но не смог получить эту работу

<c:forEach items="${pages}" var="page">
     <li
       <c:catch>
         <c:choose>
           <c:when test="${page.pageId == param.topic_id}">...

учитывая выше..

означает, что ничего не возвращается туда.

2 ответа

Если вы хотите получить страницы с карты, попробуйте следующий подход (Not Tested):

private void getSubjects(HttpServletRequest request, HttpServletResponse response) 
throws ServletException{

    try {
        List<Subject> subjects = subjectDAO.subjectList();
        List<Page> pages = null;
        Map<String, ArrayList<Page>> subjectPageMap = null;

        if(subjects!= null && subjects.size() > 0){
            subjectPageMap = new HashMap<String, ArrayList<Page>>();
            for(Subject subject : subjects){
                pages = pageDAO.topicList(subject.getSubjectId());
                pages = pages != null && pages.size() > 0 ? pages : new ArrayList<Page>();
                subjectPageMap.put(subject.getSubjectId(), pages);
            }
        }

        request.setAttribute("subjects", subjects);
        request.setAttribute("subjectPageMap", subjectPageMap);
        getServletContext().getRequestDispatcher("/view.jsp").forward(
                                request, response);
    } catch (Exception e) {
        throw new ServletException("Error ", e.getCause());
    }
}

Хорошо, я должен был выполнить аналогичную задачу. Я использовал контроллер сервлета. Затем объект базы данных, который использовал классы для обработки извлечения данных из базы данных. Похоже, что вы не проверяете параметр "action", отправляемый сервлету.

if (action.equalsIgnoreCase("getTopic")){
            int SubjectId = Integer.parseInt(request.getParameter("SubjectId"));
            dao.getTopic(SubjectId);
            forward = "myjsp.jsp";
            request.setAttribute("subjects", dao.getAllSubjects());    
        } else if (action.equalsIgnoreCase("listSubjects")){
            forward = "myjsp.jsp";
            request.setAttribute("categories", dao.getAllSubjects());

        } else {
            forward = "myjsp.jsp";
        }

        RequestDispatcher view = request.getRequestDispatcher(forward);
        view.forward(request, response);
    }
Другие вопросы по тегам