Java Mvc And Hibernate
i am trying to learn Java, Hibernate and the MVC pattern. Following various tutorial online i managed to map my database, i have created few Main methods to test it and it works. Furthermore i have created few pages using the MVC patter and i am able to display some mock data as well in a view. the problem is i can not connect the two. this is what i have
My view Looks like this
<%@ 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"> </a>
</body>
</html>
My controller
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;
}
}
My servelet definitions
<?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>
and finally this class to access the database
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;
}
}
the database connection occurs in this file
<?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>
and UserServiceImplementation Class looks like this
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("开发者_如何学Cmy 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.");
}
}
Could you help me to solve this problem i spent the last 4 days and nights on this issue without any success
Thanks
After a week working on this problem day and night i managed to solve the issue. I am not sure if the solution i am proposing is the right one but it works and is good enough for me at this learning stage.
this is what i have done:
i modified the bean userServiceImplementation as follow
<bean id="userServiceImplementation" class="com.rssFeed.ServiceImplementation.UserServiceImplementation">
<property name="userDao" ref="userDao" />
</bean>
it now reference the userDao bean
<bean id="userDao" class="com.rssFeed.dao.hibernate.HibernateUserDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
the controller remain the same while the HibernateUserDao is changed as follow
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;
}
}
I hope this will help you guys!!
Would've help some information about the error if you get any.
Something strikes me right away is your html - you have no form and no input fields? Perhaps you can start from there?
精彩评论