一些疑问涉及这个Spring MVC项目架构的架构。它没有使用Spring功能吗?

时间:2015-10-16 11:26:35

标签: java spring spring-mvc architecture spring-data

我是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功能。

我的推理是正确还是我错过了什么? (也许这很平常)

0 个答案:

没有答案