JSP页面在第二次访问时省略属性值

时间:2017-06-26 20:56:14

标签: java jsp session

我有一个Java webapp,它有类似SpringMVC的结构。

Project structure

我有一个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>

jsp页面在我第一次调用它时显示所有字段:enter image description here

但是,在我第二次调用页面时,循环似乎跳过student_subjects会话属性中的所有变量,即使我检查了属性并且它包含所有值: enter image description here

从该特定视图的操作类中调用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;
    }

}

1 个答案:

答案 0 :(得分:0)

好的,我终于明白了。问题是我从Studentsubjects类引用了错误的字段。也就是说,JPA会创建一些奇怪的StudentsubjectsPK字段,这实际上是我访问所需字段所需的字段,这些字段是主键(PK)的一部分。