我是Spring MVC的新手,我发现一些疑问与一个以奇怪的方式处理Hibernate DAO的项目(在教程中找到)有关。
情况如下:
有2个XML配置文件,第一个是描述servlet映射的 spring-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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.demo.controllers"></context:component-scan>
<bean id="viewresolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:resources location="/WEB-INF/images/" mapping="/img/**"></mvc:resources>
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"></mvc:resources>
</beans>
第二个是包含Spring Security设置的 spring-security.xml 。没有像 root-context.xml (或 applicationContext.xml )文件那样包含在webapp中的所有servlet之间共享的bean。
顺便说一句,正如您所看到的,我的XML配置中没有Hibernate配置或DAO bean声明。
要配置\使用DAO类,它按以下方式执行,这是一个控制器方法(处理注册fomr,用户可以在系统中注册新帐户):
@RequestMapping(value="/signup" , method=RequestMethod.POST)
public ModelAndView doSignUpProcess(HttpServletRequest request)
{
ModelAndView mav = new ModelAndView("signup");
String message = "";
if(ServletFileUpload.isMultipartContent(request))
{
try
{
List<FileItem> data = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
String username = data.get(0).getString();
String password = data.get(1).getString();
String repassword = data.get(2).getString();
String gender = data.get(3).getString();
String vehicle = data.get(4).getString();
String country = data.get(5).getString();
String image = new File(data.get(6).getName()).getName();
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setGender(gender);
user.setCountry(country);
user.setVehicle(vehicle);
user.setImage(image);
if(password.equals(repassword))
{
/*Signup_Model sm = new Signup_Model();
//message = sm.doSignUp(username, repassword, gender, vehicle, country, image);
message = sm.doHibernateSignUp(user);*/
message = RegisteryDAO.getUserDAO().doHibernateSignUp(user);
String path = request.getSession().getServletContext().getRealPath("/") + "//WEB-INF//images//";
data.get(6).write(new File(path + File.separator + image));
}
else
{
message = "Password does not match..please try again";
}
}
catch(Exception e)
{
System.out.println(e);
message = "Please try again....";
}
}
mav.addObject("message", message);
return mav;
}
正如您在上一个方法中所看到的,要以这种方式在数据库上存储新的用户用户对象:
message = RegisteryDAO.getUserDAO().doHibernateSignUp(user);
RegisteryDAO 类似于DAO工厂类:
public class RegisteryDAO {
public static com.demo.dao.layer.ProductsDAO productsDAO;
public static com.demo.dao.layer.UserDAO userDAO;
static{
productsDAO = new ProductsDAO();
userDAO = new UserDAO();
}
public static com.demo.dao.layer.ProductsDAO getProductsDAO() {
return productsDAO;
}
public static void setProductsDAO(com.demo.dao.layer.ProductsDAO productsDAO) {
RegisteryDAO.productsDAO = productsDAO;
}
public static com.demo.dao.layer.UserDAO getUserDAO() {
return userDAO;
}
public static void setUserDAO(com.demo.dao.layer.UserDAO userDAO) {
RegisteryDAO.userDAO = userDAO;
}
}
声明并创建了一个新的静态 UserDAO 对象来实现我的DAO,这个:
public class UserDAO implements com.demo.dao.layer.UserDAO{
public String doHibernateLogin(String username, String password){
try{
SessionFactory sessionFactory = HibernateConnection.doHibernateConnection();
Session session = sessionFactory.openSession();
session.beginTransaction();
List<User> user = session.createQuery("From User where username='"+username+"' and password='"+password+"'").list();
session.close();
if(user.size() == 1) return "login success" ;
else return "Please try again...";
}
catch(Exception e){
return "Please try again...";
}
}
public String doHibernateSignUp(User user){
try{
Session session = HibernateConnection.doHibernateConnection().openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
session.close();
return "Sign Up Successfully...";
}
catch(Exception e){
e.printStackTrace();
return "User is already there with this username";
}
}
public User getUserByUsername(String username){
try{
Session session = HibernateConnection.doHibernateConnection().openSession();
List<User> users = session.createQuery("From User where username = :username")
.setParameter("username", username).list();
session.close();
if(users != null && users.size() == 1){
return users.get(0);
}else{
return null;
}
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
}
正如您在 UserDAO 类中看到的那样,Hibernate SessionFactory(用于检索Hibernate Session以将对象存储在DB上)以这种方式检索:
SessionFactory sessionFactory = HibernateConnection.doHibernateConnection();
Session session = sessionFactory.openSession();
在 HibernateConnection 类上调用 doHibernateConnection(),在该类中配置与数据库的连接
public class HibernateConnection {
public static SessionFactory sessionFactory;
public static SessionFactory doHibernateConnection(){
Properties database = new Properties();
database.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
database.setProperty("hibernate.connection.username", "root");
database.setProperty("hibernate.connection.password", "");
database.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/spring");
database.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
Configuration cfg = new Configuration()
.setProperties(database)
.addPackage("com.demo.pojo")
.addAnnotatedClass(User.class)
.addAnnotatedClass(Products.class);
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
sessionFactory = cfg.buildSessionFactory(ssrb.build());
return sessionFactory;
}
}
所以我在Spring中很新,我对架构方面没有多少经验,但在我看来这个例子非常可怕,因为它手动处理数据库配置和DAO对象创建(它创建了一个工厂,但是Spring依赖注入是一个工厂)。
所以在我看来它非常糟糕,因为它是一个Spring项目,但它没有使用最重要的Spring功能。
我的推理是正确还是我错过了什么? (也许这很平常)