3 votes

Java Mvc et Hibernate

J'essaie d'apprendre Java, Hibernate et le modèle MVC. En suivant divers tutoriels en ligne, j'ai réussi à mapper ma base de données, j'ai créé quelques méthodes Main pour la tester et elle fonctionne. En outre, j'ai créé quelques pages en utilisant le modèle MVC et je suis capable d'afficher des données fictives dans une vue. le problème est que je ne peux pas relier les deux. voici ce que j'ai

Ma vue ressemble à ceci

    <%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
  <head>
      <title>Users</title>
      <%@ include file="/WEB-INF/jsp/head.jsp" %>
  </head>
  <body>
      <%@ include file="/WEB-INF/jsp/header.jsp" %>
      <img src="images/rss.png" alt="Rss Feed"/>      
      <%@ include file="/WEB-INF/jsp/menu.jsp" %>      
      <div class="ContainerIntroText">
      <img src="images/usersList.png" class="marginL150px" alt="Add New User"/>
      <br/>
      <br/>
        <div class="usersList">
            <div class="listHeaders">
                <div class="headerBox">
                    <strong>FirstName</strong>
                </div>
                <div class="headerBox">
                    <strong>LastName</strong>
                </div>
                <div class="headerBox">
                    <strong>Username</strong>
                </div>
                <div class="headerAction">
                    <strong>Edit</strong>
                </div>
                <div class="headerAction">
                    <strong>Delete</strong>
                </div>
            </div>
            <br><br>
        <c:forEach items="${users}" var="user">
            <div class="listElement">
                <c:out value="${user.firstName}"/>
            </div>
            <div class="listElement">
                <c:out value="${user.lastName}"/>
            </div>
            <div class="listElement">
                <c:out value="${user.username}"/>
            </div>
            <div class="listElementAction">
                <input type="button" name="Edit" title="Edit" value="Edit"/>
            </div>
            <div class="listElementAction">
                <input type="image" src="images/delete.png" name="image" alt="Delete" >
            </div>
            <br />            
            </c:forEach>
        </div>
      </div>

      <a id="addUser" href="addUser.htm" title="Click to add a new user">&nbsp;</a>
  </body>
</html>

Mon contrôleur

public class UsersController implements Controller {

    private UserServiceImplementation userServiceImplementation;

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {        

        ModelAndView modelAndView = new ModelAndView("users");        

        List<User> users = this.userServiceImplementation.get();
        modelAndView.addObject("users", users);

    return modelAndView;

    }
    public UserServiceImplementation getUserServiceImplementation() {
        return userServiceImplementation;
    }

    public void setUserServiceImplementation(UserServiceImplementation userServiceImplementation) {
        this.userServiceImplementation = userServiceImplementation;
    }
}

Mes définitions de servelet

<?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.5.xsd">

  <!-- the application context definition for the springapp DispatcherServlet -->

  <bean name="/home.htm" class="com.rssFeed.mvc.HomeController"/>
  <bean name="/rssFeeds.htm" class="com.rssFeed.mvc.RssFeedsController"/>
  <bean name="/addUser.htm" class="com.rssFeed.mvc.AddUserController"/>
  <bean name="/users.htm" class="com.rssFeed.mvc.UsersController">
        <property name="userServiceImplementation" ref="userServiceImplementation"/>
  </bean>

  <bean id="userServiceImplementation" class="com.rssFeed.ServiceImplementation.UserServiceImplementation">
        <property name="users">
            <list>
                <ref bean="user1"/>
                <ref bean="user2"/>
            </list>
        </property>
    </bean>

  <bean id="user1" class="com.rssFeed.domain.User">
        <property name="firstName" value="firstName1"/>
        <property name="lastName" value="lastName1"/>
        <property name="username" value="username1"/>
        <property name="password" value="password1"/>
    </bean>

  <bean id="user2" class="com.rssFeed.domain.User">
        <property name="firstName" value="firstName2"/>
        <property name="lastName" value="lastName2"/>
        <property name="username" value="username2"/>
        <property name="password" value="password2"/>
   </bean>

   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
       <property name="prefix" value="/WEB-INF/jsp/"></property>
       <property name="suffix" value=".jsp"></property>
   </bean>

</beans>

et enfin cette classe pour accéder à la base de données

public class HibernateUserDao extends HibernateDaoSupport implements UserDao {

    public void addUser(User user) {
        getHibernateTemplate().saveOrUpdate(user);
    }

    public List<User> get() {

        User user1 = new User();
        user1.setFirstName("FirstName");
        user1.setLastName("LastName");
        user1.setUsername("Username");
        user1.setPassword("Password");

        List<User> users = new LinkedList<User>();
        users.add(user1);
    return users;
    }

    public User get(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public User get(String username) {
        return null;
    }
}

la connexion à la base de données se fait dans ce fichier

<?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="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost/rss"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>com/rssFeed/domain/User.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties" >
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="userDao" class="com.rssFeed.dao.hibernate.HibernateUserDao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>    

</beans>

et la classe UserServiceImplementation ressemble à ceci

public class UserServiceImplementation implements UserService  {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
    }

    public void add(User user) throws UserAlreadyExistsException {

      if (userDao.get(user.getUsername()) != null) { //user already exists
          throw new UserAlreadyExistsException();
      }
      else{
          userDao.addUser(user);
      }
    }

    private static List<User> users;

    static {
        User user1 = new User();
        user1.setFirstName("FirstName");
                user1.setLastName("LastName");
                user1.setUsername("my username");
                user1.setPassword("my Password");

        users = new LinkedList<User>();
        users.add(user1);
    }

    public User createUser(User u) {
    User user = new User();
    user.setId(users.size() + 1);
    user.setFirstName(u.getFirstName());
        user.setLastName(u.getLastName());
        user.setUsername(u.getUsername());
        user.setPassword(u.getPassword());
        users.add(user);
    return user;
    }

    public List<User> get() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public User get(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

Pourriez-vous m'aider à résoudre ce problème ? J'ai passé les 4 derniers jours et nuits sur ce problème sans succès.

Gracias

1voto

GigaPr Points 1330

Après une semaine de travail jour et nuit sur ce problème, j'ai réussi à le résoudre. Je ne suis pas sûr que la solution que je propose soit la bonne, mais elle fonctionne et me suffit à ce stade de mon apprentissage.

Voici ce que j'ai fait :

J'ai modifié le bean userServiceImplementation comme suit

 <bean id="userServiceImplementation" class="com.rssFeed.ServiceImplementation.UserServiceImplementation">
        <property name="userDao" ref="userDao" />
  </bean>

il fait maintenant référence au bean userDao

<bean id="userDao" class="com.rssFeed.dao.hibernate.HibernateUserDao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>    

le contrôleur reste le même alors que le HibernateUserDao est modifié comme suit

public class HibernateUserDao extends HibernateDaoSupport implements UserDao {

    private static final String User = User.class.getName();

    public void addUser(User user) {
        getHibernateTemplate().saveOrUpdate(user);
    }

    public void save(User user){
        getHibernateTemplate().saveOrUpdate(user);
    }

    public List<User> get() {

        return getHibernateTemplate().find("from " + User);
    }

    public User get(int id) {
        return (User) (getHibernateTemplate().find("from " + User + " where id = " + id).get(0));
    }

    public User get(String username) {
        return null;
    }
}

J'espère que cela vous aidera !

0voto

deian Points 316

Il serait utile d'avoir des informations sur l'erreur si vous en obtenez une.

Ce qui me frappe d'emblée, c'est votre html - vous n'avez pas de formulaire ni de champs de saisie ? Peut-être pouvez-vous commencer par là ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X