Hallo zusammen,
ich muss ein Programm schreiben , das zählt wie oft jede Webseite aus unserem Server aufgerufen wird, und das Ergebnis in eine MySQL – Datenbank speichert . Ich habe in der Klasse SessionObject 2 Variablen erzeugt,die die aufgerufene Webseite und die dazugehörige Session-ID speichert , eine Klasse SessionArray die alle aufgerufene Seiten und Session-ID in einem Puffer(Array) anlegt, und die Daten in die Datenbank über einen Thread schreibt . In der Klasse LiveStatReceiver wird eine Instanz der Klasse SessionArray erzeugt,die Variable pagecounter sollte angeben wie oft ein Element im Array vorhanden ist.Wenn z.B die aufgerufene Webseite www.bucho.de schon 5 Male aufgerufen wurde,sollte pagecounter den Wert 5 haben,leider gibt pagecounter immer den Wert 0, und ich verstehe nicht warum. Die Datenbankzugriffe werden über Jdbc-Template vom Spring durchgeführt.
Hier ist mein Code,bei Rückfragen stehe ich natürlich zur Verfügung.
Im Voraus vielen Dank.
Alles anzeigen
ich muss ein Programm schreiben , das zählt wie oft jede Webseite aus unserem Server aufgerufen wird, und das Ergebnis in eine MySQL – Datenbank speichert . Ich habe in der Klasse SessionObject 2 Variablen erzeugt,die die aufgerufene Webseite und die dazugehörige Session-ID speichert , eine Klasse SessionArray die alle aufgerufene Seiten und Session-ID in einem Puffer(Array) anlegt, und die Daten in die Datenbank über einen Thread schreibt . In der Klasse LiveStatReceiver wird eine Instanz der Klasse SessionArray erzeugt,die Variable pagecounter sollte angeben wie oft ein Element im Array vorhanden ist.Wenn z.B die aufgerufene Webseite www.bucho.de schon 5 Male aufgerufen wurde,sollte pagecounter den Wert 5 haben,leider gibt pagecounter immer den Wert 0, und ich verstehe nicht warum. Die Datenbankzugriffe werden über Jdbc-Template vom Spring durchgeführt.
Hier ist mein Code,bei Rückfragen stehe ich natürlich zur Verfügung.
Im Voraus vielen Dank.
Quellcode
- import javax.servlet.*;
- import javax.servlet.http.*;
- import java.io.IOException;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import org.springframework.jdbc.datasource.*;
- public class LiveStatReceiver implements Filter{
- protected final Log log = LogFactory.getLog(getClass());
- protected FilterConfig config;
- //aktuelle Groesse des Arrays
- private int counter = 0;
- // zählt wie oft ein Object im Array vorhanden ist
- private int pagecounter = 0;
- /*maximale Groesse des Arrays*/
- private static final int MAX = 1000;
- /* Array zur Speicherung aufgerufenen Webseiten und deren Session IDs */
- private static SessionObject[] objectArray = new SessionObject[MAX];
- /*speichert die aktuelle Webseite*/
- String page = "";
- /*speichert die Session ID*/
- String sessionID = "";
- /*fuer die Datasourcen*/
- DriverManagerDataSource dataSource = new DriverManagerDataSource(); private SessionArray sessionArray;
- public SessionArray getSessionArray(){
- if (sessionArray == null){
- sessionArray = new SessionArray(counter,pagecounter,objectArray,dataSource);
- }
- return sessionArray;
- }
- public FilterConfig getConfig() {
- return config;
- }
- public void setConfig(FilterConfig config) {
- this.config = config;
- }
- public void init(FilterConfig config) throws ServletException{
- this.config = config;
- log.info("-----LiveStatReceiver : init ---> Filtername : " + config.getFilterName());
- ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
- dataSource = (DriverManagerDataSource)ctx.getBean("myDataSource");
- }
- @SuppressWarnings("static-access")
- public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
- throws ServletException,IOException,NullPointerException{
- HttpServletRequest req = (HttpServletRequest)request;
- page = req.getRequestURI();
- HttpSession session = req.getSession();
- sessionID = (String)session.getId();
- if((page != null && !page.equals("")) && (sessionID != null &&
- !sessionID.equals(""))){
- try{
- /*Erzeugung einer Instanz von SessionObject,das Object sessionObject wird spaeter im Array objectArray angelegt.*/
- SessionObject sessionObject = new SessionObject(page,sessionID);
- if(sessionObject != null){
- /*wenn counter null ist,bedeutet dass,die aufgerufene Seite noch nicht im Array angelegt ist,das Array ist noch leer,dann pagecounter ist auch null.*/
- if(counter < 1){
- pagecounter = 0;
- }else{
- for(int i=0; i<counter; i++){
- if(objectArray[i].getPage() == page && objectArray[i].getSessionID()==sessionID){
- /*pagecounter sollte sich inkrementieren sobald das Array objectArray nicht mehr leer,was leider hier nicht der Fall ist.Beim Testen hat pagecounter immer den Wert null*/
- pagecounter++; }
- }
- }
- /*hier wird ein neus Object im Array angelegt*/
- SessionObject newObject;
- newObject = sessionObject;
- objectArray[counter] = newObject;
- // counter inkrementiert sich
- counter++;
- getSessionArray().setCounter(counter);
- getSessionArray().setPagecounter(pagecounter);
- getSessionArray().setSessionObject(objectArray);
- }
- }catch(NullPointerException e){
- System.out.println("NullPointerException : "+e.getMessage());
- }
- }
- try {
- getSessionArray().doThreadCountdown();
- log.info("--- Thread starten.");
- }catch (InterruptedException e) {
- e.printStackTrace();
- for (StackTraceElement trace : new Throwable().getStackTrace() ){
- log.info(" STRACK TRACE - ERROR : " + trace);
- }
- }
- chain.doFilter(request,response);
- }
- public void destroy(){}
- }
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.datasource.DriverManagerDataSource;
- public class SessionArray extends Thread{
- /*aktuelle Groesse des Arrays*/
- private int counter;
- /*maximale Groesse des Arrays*/
- private static final int MAX = 1000;
- /*incrementiert sich falls eine Seite schon aufgerufen wird.*/
- private int pagecounter;
- /*Puffer zur Speicherung aller aufgerufene Seiten und Session_ID*/
- private SessionObject[] sessionObject = new SessionObject[MAX];
- protected final Log log = LogFactory.getLog(getClass());
- DriverManagerDataSource dataSource ;
- //jdbcTemplate fuer den Datenbankzugriff
- private JdbcTemplate jdbcTemplate;
- public SessionArray(int counter,int pagecounter,SessionObject[] sessionObject,DriverManagerDataSource dataSource){
- this.counter = counter;
- this.pagecounter = pagecounter;
- this.sessionObject = sessionObject;
- this.dataSource = dataSource;
- }
- public void run(){
- try{
- jdbcTemplate = new JdbcTemplate(dataSource);
- String stringCounter = "";
- String stringSessionCounter ="";
- /*wählt in dem Puffer die letzte aufgerufene Seite,und ermittelt ob sie schon in der Tabelle existiert*/
- List list = jdbcTemplate.queryForList("select page,counter,sessioncounter from statistik where page =?",new Object[] {sessionObject[counter-1].getPage()});
- log.info("######## SessionArray run --> List-Size : "+list.size());
- Iterator it = list.iterator();
- /*Ergebnis der Datenbankabfrage.*/
- while(it.hasNext()) {
- Map userMap = (Map) it.next();
- /*Umwandlung counter in String*/
- stringCounter = userMap.get("counter").toString();
- /*Umwandlung sessioncounter in String*/
- stringSessionCounter =userMap.get("sessioncounter").toString();
- }
- int newCounter = 1;
- int newSessionCounter = 1;
- /*falls die aufgerufene Seite noch nicht in der Tabelle vorhanden ist,wird sie eingetragen*/
- if(list.size() == 0){
- jdbcTemplate.update("insert into statistik (page,counter,sessioncounter)" +
- " values (?,?,?)",new Object[]{sessionObject[counter-1].getPage(),newCounter,newSessionCounter});
- }else{
- /*falls die Seite schon existiert,wird ein Update der Tabelle durchgeführt,was hier leider nicht funktioniert.*/
- newCounter = Integer.parseInt(stringCounter)+1 ;
- if(pagecounter == 0){
- log.info("pagecounter: " + pagecounter);
- newSessionCounter = Integer.parseInt(stringSessionCounter) + 1;
- }else{
- newSessionCounter = Integer.parseInt(stringSessionCounter);
- }
- jdbcTemplate.update("update statistik set page = ?,counter = ?," +
- "sessioncounter =? where page = ?",new Object[] {sessionObject[counter-1].getPage(),newCounter,
- newSessionCounter,sessionObject[counter-1].getPage()});
- }
- }catch(Exception e){
- log.info("ERROR :" + e.getCause());
- for (StackTraceElement trace : new Throwable().getStackTrace() ){
- log.info("STRACK TRACE - ERROR : " + trace);
- }
- }
- }
- public void doThreadCountdown() throws java.lang.InterruptedException {
- try {
- Thread.sleep(2);
- } catch(InterruptedException e) {
- log.info("Thread interrupted!");
- }
- new SessionArray(counter,pagecounter,sessionObject,dataSource).start();
- }
- public int getPagecounter() {
- return pagecounter;
- }
- public void setPagecounter(int pagecounter) {
- this.pagecounter = pagecounter;
- }
- public int getCounter() {
- return counter;
- }
- public void setCounter(int counter) {
- this.counter = counter;
- }
- public SessionObject[] getSessionObject() {
- return sessionObject;
- }
- public void setSessionObject(SessionObject[] sessionObject) {
- this.sessionObject = sessionObject;
- }
- }
- public class SessionObject {
- String page;
- String sessionID;
- public SessionObject(String myPage,String sessionID){
- setPage(myPage);
- setSessionID(sessionID);
- }
- public String getSessionID() {
- return sessionID;
- }
- public void setSessionID(String sessionID) {
- this.sessionID = sessionID;
- }
- public String getPage() {
- return page;
- }
- public void setPage(String page) {
- this.page = page;
- }
- }
- CREATE TABLE `statistik` (
- `id` int(10) NOT NULL auto_increment,
- `page` varchar(250) NOT NULL,
- `counter` int(10) NOT NULL,
- `sessioncounter` varchar(250) NOT NULL,
- PRIMARY KEY (`id`)
- ) TYPE=MyISAM AUTO_INCREMENT=1;
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
- <display-name>Test für das Statistik-Projekt</display-name>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext-jdbc.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet>
- <servlet-name>action</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>action</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
- <jsp-config>
- <jsp-property-group>
- <url-pattern>*.jsp</url-pattern>
- <scripting-invalid>false</scripting-invalid>
- <!-- <el-ignored>false</el-ignored>-->
- </jsp-property-group>
- <taglib>
- <taglib-uri>http://www.springframework.org/tags</taglib-uri>
- <taglib-location>/WEB-INF/spring.tld</taglib-location>
- </taglib>
- </jsp-config>
- <servlet>
- <description>Added by JBuilder to compile JSPs with debug info</description>
- <servlet-name>debugjsp</servlet-name>
- <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
- <init-param>
- <param-name>classdebuginfo</param-name>
- <param-value>true</param-value>
- </init-param>
- <load-on-startup>3</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>debugjsp</servlet-name>
- <url-pattern>*.jsp</url-pattern>
- </servlet-mapping>
- <filter>
- <filter-name>liveStatReceiver</filter-name>
- <filter-class>src.sessionSave.LiveStatReceiver</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>liveStatReceiver</filter-name>
- <url-pattern>*.html</url-pattern>
- </filter-mapping>
- </web-app>
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
- <property name="url"><value>jdbc:mysql://localhost/pagecounter</value></property>
- <property name="username"><value>root</value></property>
- <property name="password"><value></value></property>
- </bean>
- </beans>