2014-11-01 47 views
0

我想寫一些關於打開我創建的Web應用程序的用戶的信息。網絡應用程序很簡單。打開它時,它會顯示用戶ip,用戶代理和上次登錄應用程序的時間。我用這些技術製作了這個應用程序:Spring,Maven,Tomcat,Hibernate和MySQL。似乎一切工作正常,但當我打開瀏覽器中的應用程序做注意做一個記錄到數據庫,我必須手動啓動Main.java做一個記錄,但記錄是不正確的,因爲它沒有記錄真實的信息但它到處都記錄NULL。我有兩個問題 - 如何自動完成所有這些(當我打開Web應用程序以在數據庫中創建記錄)以及爲什麼我的記錄每次都是NULL。休眠不能正確地將數據寫入到mysql

public class Main { 

    public static void main(String[] args) { 

     UserInfo user = new UserInfo(); 
     user.setRollNo(7); 
     user.setIp(UserController.ip); 
     user.setUserAgent(UserController.userAgent); 
     user.setDate((Date) UserController.date); 

     SessionFactory sessionFactory = new AnnotationConfiguration() 
       .configure().buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     session.beginTransaction(); 

     session.save(user); 

     session.getTransaction().commit(); 
     session.close(); 
    } 
} 

UserController.java

@Controller 
    public class UserController { 

     public static String ip; 
     public static String userAgent; 
     public static Date date; 

     @Autowired 
     private HttpServletRequest request; 

     @RequestMapping(value = "/connection") 
     public ModelAndView getUserInfo() { 

      ModelAndView modelandView = new ModelAndView("UserInfo"); 

      ip = request.getRemoteAddr(); 
      modelandView.addObject("msg1", "Your IP is " + ip); 

      userAgent = request.getHeader("User-Agent"); 
      modelandView.addObject("msg2", "Your User agent is " + userAgent); 

      date = new java.util.Date(); 
      /* 
      * Calendar calendar = Calendar.getInstance(); java.sql.Date startDate = 
      * new java.sql.Date(calendar.getTime() .getTime()); 
      */ 
      modelandView.addObject("msg3", "Your last log was at " + date); 

      return modelandView; 

     } 

    } 

UserInfo.java

@Entity 
@Table(name = "USER_INFORMATION") 
public class UserInfo { 

    @Id 
    private int rollNo; 
    private String ip; 
    private String userAgent; 
    private Date date; 

    public int getRollNo() { 
     return rollNo; 
    } 

    public void setRollNo(int rollNo) { 
     this.rollNo = rollNo; 
    } 

    public String getIp() { 
     return ip; 
    } 

    public void setIp(String ip) { 
     this.ip = ip; 
    } 

    public String getUserAgent() { 
     return userAgent; 
    } 

    public void setUserAgent(String userAgent) { 
     this.userAgent = userAgent; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

} 

的hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost:3306/browserinfo</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password"></property> 

     <property name="connection.pool_size">1</property> 

     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <property name="show_sql">true</property> 

     <property name="hbm2ddl.auto">validate</property> 

     <mapping class="com.nikola.hellocontroller.UserInfo" /> 

    </session-factory> 
</hibernate-configuration> 
+0

我不明白你的問題。你想實現什麼?你想從數據庫中獲取一些數據並將其顯示在視圖中?或者可能創建新用戶並將其存儲在數據庫中?你想如何實現這個沒有任何數據訪問層? – slnowak 2014-11-01 10:09:46

+1

你執行「記錄」的方式真的很奇怪。爲什麼你要將'getUserInfo'中的信息存儲在'static'變量中?每個請求都會覆蓋它們。是的,你必須手動觸發'main'方法,因爲你的數據庫處理只在那裏。如果你不先訪問'/ connection',那麼數據庫條目將包含'null'。現在我想知道爲什麼如果你不需要這樣實現它的話。 – Tom 2014-11-01 10:18:38

+0

在這個例子中使用數據庫的目的是什麼?您正在從請求中檢索用戶信息,然後是什麼?你想創建新的用戶並將其存儲在數據庫?接下來呢?從數據庫中檢索它?通過什麼方式?通過主鍵你不知道? – slnowak 2014-11-01 10:23:15

回答

0

根據此:

@ novy154我正在嘗試使用用戶IP,用戶代理信息以及用戶在應用程序中的最後一次使用時的時間向數據庫進行記錄。之後,我想顯示應用程序中的所有記錄。

首先,你需要有一些DataAccessLayer。像

public interface UserInfoRepository { 
    void save(UserInfo userInfo); 
    Collection<UserInfo> findAll(); 
} 

它的實現。

然後可能有一些服務在Repository上,但在這種情況下並不重要,所以讓我們跳過它。

你需要注入你的資料庫到控制器:

1)調用userInfoRepository.save(newlyCreatedUserInfo)

2)通過所有UserInfos到您的視圖(通過調用userInfoRepository.findAll()並把結果在ModelAndView中),並以某種方式顯示。

讓我知道如果你需要幫助實現這一點。

但是,這只是爲了學習如何使簡單的類似crud的應用程序,因爲這沒有任何意義。你甚至無法識別你的用戶,你只想跟蹤每個訪問者的ip,用戶信息等等。

//編輯: 庫的實現將是這樣的:

@Repository 
@Transactional 
public class UserInfoRepositoryImpl implements UserInfoRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public void save(UserInfo userInfo) { 
     getCurrentSession.save(userInfo); 
    } 

    @Override 
    public Collection<UserInfo> findAll() { 

     final Criteria root = getCurrentSession().createCriteria(UserInfo.class); 
     return Collections.checkedList(root.list(), UserInfo.class); 
    } 

    private Session getCurrentSession() { 
     return sessionFactory.getCurrentSession(); 
    } 
} 

然後在您的控制器的方法需要調用save(newlyCreatedUserInfo)來存儲信息的數據庫和

modelAndView.addObject("userInfos", repository.findAll()); 

檢索所有數據並將其傳遞給視圖。

當然記得

... 
@Autowired 
private UserInfoRepository userInfoRepository; 
... 
在控制器

請注意,由於spring-data-jpa爲您提供了更多功能強大的軟件倉庫,因此重新發明了一個輪子。

+0

我不想識別用戶。我想讓它變得簡單。我想在數據庫中記錄所有用戶信息(ip,user-agent ..)並顯示它。現在我不想爲用戶進行註冊和識別。 – Gentiluomo 2014-11-01 10:41:05

+0

然後實現某種數據訪問層是一種方式。 – slnowak 2014-11-01 10:43:26

+0

請問你會給我一個例子來理解如何做到這一點,因爲我已經閱讀了很多信息並觀看了很多教程......現在它在我頭腦中變得非常混亂...... :( – Gentiluomo 2014-11-01 10:46:38