我正在尝试学习 Java、Hibernate 和 MVC 模式。 按照各种在线教程,我设法映射了我的数据库,我创建了几个主要方法来测试它并且它有效。此外,我使用 MVC 模式创建了几个页面,并且我也能够在 View 中显示一些模拟数据。问题是我无法连接两者。这就是我的
我的观点是这样的
<%@ 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>
我的 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;
}
}
我的 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>
最后是访问数据库的类
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;
}
}
数据库连接发生在这个文件中
<?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>
UserServiceImplementation 类看起来像这样
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.");
}
}
你能帮我解决这个问题吗我在过去的4天4夜都在这个问题上没有成功
谢谢
最佳答案
经过一个星期日以继夜地解决这个问题后,我设法解决了这个问题。我不确定我提出的解决方案是否正确,但在这个学习阶段它有效并且对我来说足够好。
这是我所做的:
我修改 bean userServiceImplementation 如下
<bean id="userServiceImplementation" class="com.rssFeed.ServiceImplementation.UserServiceImplementation">
<property name="userDao" ref="userDao" />
</bean>
它现在引用 userDao bean
<bean id="userDao" class="com.rssFeed.dao.hibernate.HibernateUserDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Controller 保持不变,而 HibernateUserDao 如下更改
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;
}
}
希望对大家有所帮助!!
关于Java Mvc 和 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932995/