Java 第二次访问时忽略属性值的JSP页面

Java 第二次访问时忽略属性值的JSP页面,java,jsp,session,Java,Jsp,Session,我有一个JavaWebApp,它有一个类似SpringMVC的结构 我对jsp页面有一个问题,它在我第一次调用它时运行良好,但在第二次调用时,它只是无法从名为“student\u subjects”的会话属性中读取值 这是teacher-edit-student-view-content.jsp: <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@page import="dbbroke

我有一个JavaWebApp,它有一个类似SpringMVC的结构

我对jsp页面有一个问题,它在我第一次调用它时运行良好,但在第二次调用时,它只是无法从名为
“student\u 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>

好的,我终于明白了。问题是我从
学生主题
课中引用了错误的字段。也就是说,JPA创建了一些奇怪的
StudentsubjectsPK
字段,这实际上是我访问所需字段所需的,这些字段是主键(PK)的一部分;bean验证应该提供更多信息。使用您自己的非实体类,而不是原始的student_主题,其他Bean也是如此。发布您的java类问题是,只有在第二次调用jsp页面之前更新session属性时才会发生这种情况。如果我不更新它,页面就会呈现得很漂亮。
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;
    }

}