Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неточность в Spring Annotations, не получаю ответа 
:(
    Опции темы
vovs
Дата 24.9.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

Репутация: нет
Всего: нет



Здравствуйте.
Разбираюсь с Spring Annotations.
Сначала использовал обычные xml'ы - все у меня работает.
А вот решил перевести в аннотации и тут не получается.
Подскажите пожалуйста, где я не прав.
есть страница, форма. На ней вопрос и ответы(радиоБуттоны).
выбираю вариант ответа, сабмитю форму(отправка сделана с помощью ajax'a, метод POST)
после этого в форму должен придти следующий вопрос, с своими вариантами ответа. 
Но этого не происходит. на странице остается тот-же вопрос, как будто не работает доставка данных к контроллеру.
Без спрингАннотаций это работает.
так как первый вопрос загружается, значить обмен с БД есть.
Проблема наверное в контроллере:

вот исходники:
контроллер:
Код

package com.testapp.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.testapp.dao.QuestionDAO;
import com.testapp.entity.Answer;
import com.testapp.entity.Question;
import com.testapp.service.QuestionSize;
import com.testapp.service.Score;

@Controller
public class QuestionController {
    
    private QuestionDAO questionDAO;
    private Score score;
    private QuestionSize questionSize; 
    
    @Autowired
    public void setQuestionDAO(QuestionDAO questionDAO){
        this.questionDAO = questionDAO;
    }
    
    @Autowired
    public void setScore(Score score){
        this.score = score;
    }
    
    @Autowired
    public void setQuestionSize(QuestionSize questionSize){
        this.questionSize = questionSize;
    }
    
    @RequestMapping(value = "/test.htm", method = RequestMethod.GET)
    public  ModelAndView test(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
            if ((request.getParameter("answers") != null) && (questionSize.getQuestionSize() >= -1)){
            byte answId = java.lang.Byte.parseByte(request.getParameter("answers"));
            for (Answer answ : questionDAO.listQuestion().get(questionSize.getQuestionSize()).getQuestionAnswers()){
                if ((answ.getId() == answId) && (answ.getIsTrue() == 1)){
                    score.incScore();
                }
            }
            questionSize.decQuestionSize();            
        }
        if (questionSize.getQuestionSize() == -1) return new ModelAndView("redirect:result.htm");
        ModelMap modelMap = new ModelMap();
        modelMap.addAttribute("questionList", questionDAO.listQuestion().get(questionSize.getQuestionSize()));
        modelMap.addAttribute("question", new Question());
        modelMap.addAttribute("answerSet", questionDAO.listQuestion().get(questionSize.getQuestionSize()).getQuestionAnswers());
        modelMap.addAttribute("answer", new Answer());
        
        return new ModelAndView("test", modelMap);
    }
    
    @RequestMapping(value = "/result.htm", method = RequestMethod.GET)
    public  ModelAndView result(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        return new ModelAndView("result", "score", Math.round(100*score.getScore()/questionSize.getQuestionSizeRes()));
    }
    
    @RequestMapping(value = "/restart.htm", method = RequestMethod.GET)
    public  ModelAndView restart(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        questionSize.setQuestionSize((byte)(questionDAO.listQuestion().size()-1));
        score.setScore((byte)0);
        return new ModelAndView("redirect:test.htm");
    }
}


test.jsp
Код

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<script type="text/javascript" src="javascript/jquery.js"></script>
<script type="text/javascript" src="javascript/func.js"></script>
<title>Система проверки знаний</title>
</head>
<script type="text/javascript">
<!--
// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function getCheckedValue(radioObj) {
    if(!radioObj)
        return "";
    var radioLength = radioObj.length;
    if(radioLength == undefined)
        if(radioObj.checked)
            return radioObj.value;
        else
            return "";
    for(var i = 0; i < radioLength; i++) {
        if(radioObj[i].checked) {
            return radioObj[i].value;
        }
    }
    return "";
}
//-->
$(document).ready(function(){  
    
    $('#myForm').live('submit', function(){  
     var idr = getCheckedValue(document.forms['testForm'].elements['answers']);
        $.ajax({ 
            type: "POST",  
            url: "test.htm",  
            data: "answers="+idr,  
            success: function(html){  
                $("#content").html(html); 
        }  
        });  
        return false;  
    }); 

//setInterval('gg()',7000);               
}); 

     </script>
<body >
<div id="content">
<div id="nifty"> 
    <form:form id="myForm" name="testForm" commandName="quest">
        <center>
            <table cellpadding=4 cellspacing=2 border=0>
            <tr>
                <td class="question" colspan="2">${questionList.question}</td>
            </tr>
                <c:forEach items="${answerSet}" var="answer" varStatus="status">
                    <tr >
                    <td width="20">
<input type="radio" name="answers" value="${answer.id}" checked "></td>
<td>
<label>${answer.answer}</label>
</td>
                </tr>
                </c:forEach>
                
            <tr>
                    <td colspan="2" align=center><input type="submit" id="subm" value="Дальше"></td>
            </tr>
            </table>
        </center>
    </form:form>
</div>

</div>
</body>
</html>

Работа с базой:
CustomHibernateDaoSupport
Код

package com.testapp.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public abstract class CustomHibernateDaoSupport extends HibernateDaoSupport
{    
    @Autowired
    public void anyMethodName(SessionFactory sessionFactory)
    {
        setSessionFactory(sessionFactory);
    }
}


QuestionDAOImpl
Код

package com.testapp.dao;

import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
import com.testapp.dao.CustomHibernateDaoSupport;
import com.testapp.dao.QuestionDAO;
import com.testapp.entity.Question;

@Repository
public class QuestionDAOImpl extends CustomHibernateDaoSupport implements QuestionDAO{

    @Override
    public void saveQuestion(Question question) {

        getHibernateTemplate().saveOrUpdate(question);
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public List<Question> listQuestion()throws DataAccessException {
    
        return getHibernateTemplate().find("from Question");
    }
}

dispatcher-servlet.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
            
       <!-- Auto scan the components -->
    <context:component-scan    base-package="com.testapp" />
         
    <bean id="viewResolver" 
         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
         <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
         <value>.jsp</value>
        </property>
    </bean>
</beans>

PM MAIL ICQ Skype Jabber   Вверх
vovs
Дата 24.9.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 22.9.2006
Где: Черкассы

Репутация: нет
Всего: нет



Проблему, описанную выше решили.
В контроллере был указан запрос GET, а в запросе был метод POST.
Заменив в запросе POST на GET получаем требуемую функциональность.

Но если в контроллере поставить POST вместо GET -- получаем:
Код

HTTP Status 404 -

type Status report

message

description The requested resource () is not available.

Почему так?

еще пользуясь моментом задам вопрос:
можно ли еще как-то сократить/оптимизировать количество бинов, описываемых в xml'ах?

При такой конфигурации, как я показал выше у меня есть еще
dispatcher-service.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
       
     <bean id="myScore" class="com.testapp.service.Score" >
        <property name="score" value="0"/>
     </bean>
    <bean id="myQuestionSize" class="com.testapp.service.QuestionSize" >
        <property name="questionSize" value="5"/>
    </bean>
     <bean name="questionDAO" class="com.testapp.web.QuestionController">
      <!--  <property name="sessionFactory" ref="mySessionFactory"/>  -->
    </bean>
    <bean name="questionSize" class="com.testapp.web.QuestionController" >
     <property name="questionSize" ref="myQuestionSize" />
    </bean>
    <bean name="score" class="com.testapp.web.QuestionController" >
         <property name="score" ref="myScore" />
    </bean>
</beans>


и два класса:

QuestionSize
Код

package com.testapp.service;

public class QuestionSize {

    private byte questionSize;
    private byte questionSizeRes=0;
    
    
    public byte getQuestionSize() {
        return questionSize;
    }

    public void setQuestionSize(byte questionSize) {
        this.questionSize = questionSize;
        this.questionSizeRes = 0;
    }
    
    public void decQuestionSize() {
        questionSize--;
        questionSizeRes++;
    }

    public byte getQuestionSizeRes() {
        return questionSizeRes;
    }
}

Score
Код

package com.testapp.service;

public class Score {

    private byte score;
    
    public Score(){}

    public byte getScore() {
        return score;
    }

    public void setScore(byte score) {
        this.score = score;
    };
    
    public void incScore(){
        score++;
    }
}


Просто в классе контроллера я использую два бина: score и questionSize, которые инициализируются из xml'а.
Плюс к этому в xml я дважды описываю эти бины - первый раз 
Код
<bean id="myScore" class="com.testapp.service.Score" >
        <property name="score" value="0"/>
     </bean>

и второй раз уже ссылаюсь на это описание:
Код

<bean name="score" class="com.testapp.web.QuestionController" >
         <property name="score" ref="myScore" />
    </bean>

Вроде не очень красиво - избыточность какая-то..
PM MAIL ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.