【问题标题】:Why does my database only update successfully on first two jsp form submissions?为什么我的数据库仅在前两个 jsp 表单提交时才成功更新?
【发布时间】:2015-06-12 00:52:09
【问题描述】:

好的,所以我有一个具有输入框的jsp,用户可以在其中插入整数。然后,我的 Java servlet 类获取这些整数,将它们添加到当前在数据库中的相应值中,然后将总数除以 formSubmissionCount 以获得平均数字。同一个用户第一次和第二次提交他们的统计数据时一切正常,但在第三次(以及此后的每次)统计数据都没有计算出正确的数字(提交到数据库的新值每次都会减少)。我不确定为什么会这样,这是我在 doPost() 中的逻辑:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    // 1. GET SUBMITTED JSP FORM VALUES
    String roundScore = req.getParameter("score_avg").toString();
    double roundScoreDouble = Double.parseDouble(roundScore);
    String roundPutts = req.getParameter("putts").toString();
    double puttsDouble = Double.parseDouble(roundPutts);*/
    // 2. GET LOGGED IN USER DETAILS
    Session session = HibernateUtil.createSessionFactory().openSession();
    session.setFlushMode(FlushMode.MANUAL);
    ManagedSessionContext.bind(session);
    session.beginTransaction();
    Criteria criteria = session.createCriteria(UserBean.class);
    Authentication authentication = SecurityContextHolder.getContext()
            .getAuthentication();
    String userLoggedIn = authentication.getName();
    List<UserBean> retrievedUser = criteria.add(
            Restrictions.like("username", userLoggedIn)).list();
    // 3. CREATE NEW UPDATED VALUES
    for (UserBean string : retrievedUser) {
        double calculateSubmitCount = string.getSubmitCount() + 1;
        double addRoundScoreValues = roundScoreDouble
                + string.getScore_avg();
        double newRoundScore = addRoundScoreValues / calculateSubmitCount;
        double truncatedRoundScore = new BigDecimal(newRoundScore)
                .setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
        string.setScore_avg(truncatedRoundScore);
        double addPuttsValues = puttsDouble + string.getPutts();
        double newPuttsTotal = addPuttsValues / calculateSubmitCount;
        double truncatedPutts = new BigDecimal(newPuttsTotal)
        .setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();               
        string.setPutts(truncatedPutts);
        string.setSubmitCount(string.getSubmitCount() + 1);
        ManagedSessionContext.unbind(HibernateUtil.createSessionFactory());
        session.flush();
        session.getTransaction().commit();
    }
    if (session.getTransaction().wasRolledBack()) {
        req.getRequestDispatcher("/WEB-INF/jsps/error.jsp").forward(req,
                resp);
    } else {
        session.close();
        req.getRequestDispatcher("/WEB-INF/jsps/analysisoutcome.jsp")
                .forward(req, resp);
    }
} 

【问题讨论】:

  • 关于代码质量的旁注:如果您只是将这段代码放在一起以显示“doPost”发生的所有事情,那么很好。否则:认真考虑重构你的代码;抱歉地说:但是现在,这段代码到处都是“脏”的(请参阅tud.ttu.ee/im/Kaarel.Allik/JOOP/…;如果您想“做得更好”)
  • 我很欣赏你的观点,是的,我的代码可能会更好,但这需要经验,现在我刚刚开始尝试让事情正常进行
  • 我倾向于不同意。编写好的代码是一项非常特殊的技能,需要专门的练习。在我看来,不应该从“我想学习如何让 xyz 运行”开始;然后很久以后从“现在,我想了解如何编写易于阅读、维护和扩展的程序”开始。换句话说:如果时间允许,应该很早就阅读相应的书籍(比如我链接的那本书)。为什么要先习惯不良做法;然后花时间在以后摆脱它们。从第一天开始学习良好做法似乎更有效率。
  • 如果你进行操作,你应该从一开始就使用 BigDecimal
  • 是的,我现在已经从 Double's 更改为 BigDecimal's 我只是没有更改它们,因为我还必须更改 Oracle 实例中的数据类型

标签: java hibernate jsp spring-mvc oracle11g


【解决方案1】:

问题在于我的逻辑而不是数据类型。我需要将数据库中的当前平均分数乘以当前提交计数值,然后将该值添加到用户输入的新值中,最后将该总和除以提交计数加一的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2012-03-07
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多