我有一个Java webapp,它有类似SpringMVC的结构。
我有一个jsp页面的问题,我第一次调用它时工作正常,但是第二次,它只是不会从名为"student_subjects"
的会话属性中读取值。
这是teacher-edit-student-view-content.jsp:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page import="dbbroker.DBBroker"%>
<body>
<!-- Problem when trying to modify data for the second time - it reports a bean validation error -->
<form action="./aplikacija" method="POST">
<table class="table" border="0" cellpadding="3" id="table-big-migrant">
<tbody id="new-subjects-container">
<tr>
<td rowspan="2"><img height="100px" src="./resources/profile.jpg"/></td>
<td>${migrant_logged_in.countryOfOrigin}</td>
</tr>
<tr>
<td>${migrant_logged_in.motherTongue}</td>
</tr>
<c:forEach var="subj" items="${student_subjects}">
<tr>
<td>${subj.subject.subjectName}</td>
<td>Evaluation: <textarea class="form-control" name="input${subj.subject.subjectName}" size="160">${subj.evaluation}</textarea></td>
<td>Level
<div class="radio">
<label>
<input type="radio" name="radio${subj.subject.subjectName}" ${subj.level == 'low' ? 'checked="checked"' : ''} value="low"> Low<br>
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="radio${subj.subject.subjectName}" ${subj.level == 'medium' ? 'checked="checked"' : ''} value="medium"> Medium<br>
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="radio${subj.subject.subjectName}" ${subj.level == 'high' ? 'checked="checked"' : ''} value="high"> High
</label>
</div>
</td>
</tr>
</c:forEach>
<tr>
<td>Enter new subject name: </td>
<td><input type="text" class="new-field-name" id="new-subject-name"/></td>
<td><input class="btn btn-default" type="button" value="Add new subject" onclick="addField()" /></td>
</tr>
</tbody>
</table>
<input class="btn btn-default pull-right" id="btn-edit-st-data" type="submit" value="Edit" name="editStudentView" />
<input type="hidden" id="akcija" name="akcija" value="izmeniStudentovPogled" />
</form>
</body>
但是,在我第二次调用页面时,循环似乎跳过student_subjects
会话属性中的所有变量,即使我检查了属性并且它包含所有值:
从该特定视图的操作类中调用jsp页面(它有execute(HttpRequest request)
方法,该方法接收来自FrontController
类的请求,此操作设置student_subjects
会话的属性。
请帮助,我正在为此奋斗两天,当我认为我得到它时,事实证明不再工作了。
我最接近的是当我放置一个if子句时,如果该会话的属性已经存在,则该子句告诉操作不要从数据库中提取student_subjects
的数据。数据显示正确,但它是旧数据,然后当我想再次编辑它时,我不会显示更新的值。
编辑:
使用新值更新数据库并将会话属性设置为新值的Java类:
package action;
import constants.WebConstants;
import dbbroker.DBBroker;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
import model.Migrant;
import model.Studentsubjects;
public class UpdateStudentViewDataAction extends AbstractAction {
public UpdateStudentViewDataAction() {
}
@Override
@Transactional
public String execute(HttpServletRequest request) {
Migrant m = (Migrant) request.getSession().getAttribute(WebConstants.MIGRANT_LOGGED_IN);
String studCode = m.getStudentCode();
System.out.println(m.getStudentCode());
List<Studentsubjects> listOfSubjects = new ArrayList<>();//DBBroker.getInstance().getSubjects(m.getStudentCode());
Map map = request.getParameterMap();
Enumeration en = request.getParameterNames();
List<String> listOfSubjectNames = new ArrayList<>();
for (Object parameter : Collections.list(en)) {
String parnam = (String) parameter;
if (parnam.startsWith("input")) {
listOfSubjectNames.add(parnam.substring(5));
}
}
for (String subjName : listOfSubjectNames) {
Studentsubjects ssub = new Studentsubjects(studCode, subjName);
String eval = Arrays.toString((String[]) map.get("input" + subjName)).replace("[", "");
eval = eval.replace("]", "");
ssub.setEvaluation(eval);
String level = Arrays.toString((String[]) map.get("radio" + subjName)).replace("[", "");
level = level.replace("]", "");
ssub.setLevel(level);
listOfSubjects.add(ssub);
}
DBBroker.getInstance().addSubjects(listOfSubjectNames);
System.out.println("Lista predmeta: " + listOfSubjects);
for (Studentsubjects subject : listOfSubjects) {
DBBroker.getInstance().updateSubjectStudent(subject);
}
request.getSession(false).setAttribute(WebConstants.STUDENT_SUBJECTS, listOfSubjects);
request.getSession(false).setAttribute(WebConstants.STUDENT_VIEW_DATA_SUCCESSFULLY_UPDATED, true);
return WebConstants.PAGE_TEACHER_SELECT_ACTION;
}
}
答案 0 :(得分:0)
好的,我终于明白了。问题是我从Studentsubjects
类引用了错误的字段。也就是说,JPA会创建一些奇怪的StudentsubjectsPK
字段,这实际上是我访问所需字段所需的字段,这些字段是主键(PK)的一部分。