PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem dem Zaehler in mein Java - Code



tom_cruise
09-12-2006, 21:20
Hallo, ich habe ein Problem ,dass mich wirklich stört , deine Hilfe wäre mir unvergesslich. Mein Problem ist folgendes : Ich muss für unsere Firma ein Programm schreiben , das unsere MySQL -Datenbank aktualisiert.Auf unsere firmeninterne Web-Server laufen unterschiedliche Webseiten von unseren Kunden . Mein Programm soll zählen wie oft jede Webseite aus unserem Server aufgerufen wird, und das Ergebnis in eine MySQL - Datenbank speichern .Ich habe dafuer eine Klasse SessionObject implementiert,die die aufgerufene Seite und die dazugehörige Session ID über die Attribute page und sessionID 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 . Die Klasse SessionArray wird von einem Filter LiveStatReceiver ausgeführt .In der Klasse LiveStatReceiver werden die folgenden Variablen deklariert counter(speichert aktuelle Grösse des Arrays) , pagecounter(speichert wie oft eine Seite im Array vorhanden ist) , objectArray(Array von Typ SessionObject in dem alle aufgerufenen Seiten und zugehoerige Session ID angelegt sind);diese Variablen werden an einer Instanz der Klasse SessionArray als Konstruktor-Parameter übergeben werden.Die Variable pagecounter sollte angeben wie oft das aktuelle Object sessionObject(d.h die aufgerufene Seite und dazugehörige Session-ID) im Array vom Typ SessionObject vorhanden ist.Wenn z.B die aufgerufene Seite www.bucho.de schon 5 Male aufgerufen wurde,wird pagecounter den Wert 5 haben,leider gibt pagecounter immer den Wert 0 (null) an. Da pagecounter immer den Wert null angibt, dann können Daten in die Datenbank nicht richtig eingetragen werden.
Die Datenbankzugriffe werden über Jdbc-Template vom Spring durchgeführt.
Hier ist mein Code,ich bitte dich einen Blick auf den Variable pagecounter zu werfen,bei Rückfragen stehe ich immer gern zur Verfügung.
Im Voraus vielen Dank.
Lecorniaud.
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.WebApplica tionContextUtils;
import org.springframework.jdbc.datasource.*;

public class LiveStatReceiver implements Filter{
protected final Log log = LogFactory.getLog(getClass());
protected FilterConfig config;
private int counter = 0;
private int pagecounter = 0;
/*maximale Groesse des Arrays*/
private static final int MAX = 1000;
private static SessionObject[] objectArray = new SessionObject[MAX];
String page = "";
String sessionID = "";
DriverManagerDataSource dataSource = new DriverManagerDataSource();
private SessionArray sessionArray;
public SessionArray getSessionArray(){
if (sessionArray == null){
sessionArray = new SessionArray(counter,pagecounter,objectArray,dataS ource);
}
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.getWebApplicationContex t(config.getServletContext());
dataSource = (DriverManagerDataSource)ctx.getBean("myDataSource");
}
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{
SessionObject sessionObject = new SessionObject(page,sessionID);
if(sessionObject != null){
/*wenn counter null ist,bedeutet dass,die aufgerufene Seite noch nicht im Array angelegt ist,dann pagecounter ist auch null.*/
if(counter < 1){
pagecounter = 0;
}else{ /*wenn eine Seite schon aufgerufen wurde,inkrementiert sich pagecounter,was leider nicht funktioniert.*/
for(int i=0; i<counter; i++){
if(objectArray[i].getPage() == page && objectArray[i].getSessionID()==sessionID){
pagecounter++; }
}
}
SessionObject newObject;
newObject = sessionObject;
objectArray[counter] = newObject;
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.DriverManagerD ataSource;
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,dat aSource).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;
}
}

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`)
) ENGINE=MyISAM AUTO_INCREMENT=1;


<?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.DriverManagerD ataSource">
<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>
__________________________________________________ ______
<?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.ContextLoaderListe ner</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>

mehlvogel
11-12-2006, 09:28
Grob ins blaue getippt bei dem ganzen Code (den ich mir nicht komplett durchgesehen habe):



if(objectArray[i].getPage() == page && objectArray[i].getSessionID()==sessionID)


Verwende an Stelle der '==' doch '.equals()'. Dafür ist die Methode nämlich gedacht '==' prüft üblicherweise nur, ob es die gleichen Objekte sind (also ob die Referenz auf das gleiche Objekt zeigt) und nicht ob die Objekte gleich (= äquivalent) sind.

Ein allgemeiner Tipp noch: Poste nur den relevanten Code und mit den [ code] Tags. Es ist so wie jetzt sehr unübersichtlich. Auch bei dem Text täte der ein oder andere Absatz der Lesbarkeit wegen nicht schlecht.

vocki72
13-12-2006, 10:38
Ich bin ja noch ein Java Anfänger aber uns wurde beigebracht wir sollten viel Kommentieren, damit dritte auch die möglichkeit haben den quelltext zu verstehen.

peschmae
13-12-2006, 22:42
Es hat auch niemand was gegen die Kommentare gesagt!

Nur gegen die fehlenden [ code ] Tags rund um den Code in deinem Posting (d.h. vor dem Beginn des Codes fügst du ein [ code ] (ohne die Leerschläge) und nach dem Code ein [ / code ] ein). Und dagegen dass es etwas viel Code ist.

Und ich sag jetzt noch etwas gegen fehlende Absätze *im* Code und auch fehlende Einrückung des Codes. Beides steigert die Übersichtlichkeit enorm.

MfG Peschmä