基本上我现在的工作是为学校提供一些不同的.jsp。 我可以添加课程,我可以添加学生,也可以添加学生到特定的课程。我想学习的是如何仅向学生展示用户(我)点击的具体课程。
<form action="http://localhost:8080/School/add" method="POST">
Kurs:
<select name="coursedrop">
<c:forEach items="${allCourses}" var="course">
<option value="${course.id}">${course.id}: ${course.coursename}</option>
</c:forEach>
</select>
Student:
<select name="studentdrop">
<c:forEach items="${allStudents}" var="student">
<option value="${student.id}">${student.id}: ${student.studentname}</option>
</c:forEach>
</select>
<input type="submit" value="Add"/>
</form>
上面显示的表格是两个下拉列表,一个用于课程,另一个用于学生。我可以将学生nr.3添加到我的数据库的课程nr.5。所以至少那个有用..
我的下一步是向特定学生展示他们的特定课程。 我所拥有的是一个.jsp页面,它将所有课程列为可点击链接。像这样:
<tbody>
<c:forEach items="${allCourses}" var="course">
<tr>
<td><a href="http://localhost:8080/School/course?id=${course.id}">${course.coursename}</a></td>
</tr>
</c:forEach>
</tbody>
当我点击其中一个名为coursenames的链接时,我会进入另一个目前列出所有学生的.jsp页面,即使它们不在我点击的特定课程中。
这就是我的servlet的样子。 (我很抱歉,如果它太可怕了)
@Inject
SchoolBoundary sb;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String path = request.getServletPath();
String redirect = "/home.jsp";
String forward = null;
switch(path) {
case "/student":
request.setAttribute("allStudents", sb.getAllStudents());
forward = "/student.jsp";
break;
case "/course":
request.setAttribute("allStudents", sb.getAllStudents());
forward = "/course.jsp";
break;
case "/add":
request.setAttribute("allCourses", sb.getAllCourses());
request.setAttribute("allStudents", sb.getAllStudents());
forward = "/add.jsp";
break;
case "/home":
request.setAttribute("allCourses", sb.getAllCourses());
forward = "/home.jsp";
break;
default:
request.setAttribute("allCourses", sb.getAllCourses());
forward = "/home.jsp";
}
request.getRequestDispatcher(forward).forward(request, response);
我可以看到我的“getAllStudents”将显示所有学生而不是id(这是我认为我需要但我不知道如何......)。 而我的“getAllStudents”来自我的边界:
public Set<Student> getAllStudenter() {
return new HashSet(studentFacade.findAll());
}
概括。我希望能够只展示每个特定课程的学生,而不是所有课程中的所有学生。感谢您的帮助:(
答案 0 :(得分:1)
首先,我建议不要使用嵌入式PK(除非您真的必须高度优化数据库模型,否则您无法更改现有模型,因为它超出了您的职责范围)。如果添加简单ID(例如tyoe Long)并在课程ID和学生ID的字段上添加唯一约束,则会有几乎相同的行为。它将需要更多的内存在数据库中,但除非我们没有在这个&#34;连接表&#34;中讨论很多行。这种额外的记忆是可以忽略不计的。但是你获得的回报是一个更容易处理的实体模型。
如果您想让所有参加特定课程的学生参加,您可以为此编写简单的JPQL查询。
首先获得课程的参考。在Kursinfo
之后所有学生的查询,其中课程等于您感兴趣的课程。基本上这样(它没有经过测试,可能包含小错误,但我想向您展示一般的想法) :
String query = "SELECT k.student FROM Kursinfo k WHERE k.kurs = :kurs";
TypedQuery<Student> q = entityManager.createQuery(query, Student.class);
q.setParameter("kurs", entityManager.getReference(kursId, Kurs.class));
return q.getResultList();
答案 1 :(得分:0)
您需要在后端(而不是servlet)中实现一个名为findAllByCourseId(Long courseId)
的方法 - 类似于以下内容:
public Set<Student> findAllByCourseId(Long courseId) {
return new HashSet(studentFacade.findAllByCourseId(courseId));
}
然后你需要打开StudentFacade
(我不确定,但它可以是一个接口并为这个方法添加一个定义。喜欢:
Set<Student> findAllByCourseId(Long courseId);
最后,添加接口的实现(如果有)并实现新方法。有点像:
// filter the all list or use your own query
public Set<Student> findAllByCourseId(Long courseId) {
// this is filtering
List<Student> allStudents = findAll();
List<Student> filteredList = new ArrayList<Student>();
for(Student student : allStudents ){
if( student.getCourseId() == courseId ){
filteredList.add(student);
}
}
return new HashSet(filteredList);
}