Ist es möglich die Request paramter auf "null" zu setzen?



  • hallo,

    ich programmiere gerade an einem Servlet, das Formularfelder mittels der Methode -neuerEintrag- einlesen und die eingelesenen Parameter in eine Datei schreiben soll, anschließend erfolgt mittels der Methode -leseEintraege- die Ausgabe aller gespeicherten Einträge auf einer Html Seite, die das Servlet selbst generiert.

    Das Problem ist, dass bei der Aktualisierung der angezeigten Seite bzw. bei dem wiederholtem Aufruf des Servlets ohne Formulareintrag die Requestparameter des vorherigen Formulareintrags übernommen werden und die Datei bzw. html Ausgabe dadurch jedesmal um die vorherigen Einträge erweitert wird.
    Meine Lösung wäre gewesen, die Request Parameter nach jedem Eintrag wieder auf null zu setzen, aber leider hat es nicht geklappt. Ich hatte es beispielsweise mit req.removeAttributes("artikelNr") ausprobiert, leider ohne Erfolg.

    Danke vielmals für jederlei Hilfe.

    Hier sind die Methoden neuerEintrag und leseEintraege:

    public void neuerEintrag(HttpServletRequest req, HttpServletResponse res,PrintWriter out) throws IOException{	
    		String artikelNr=req.getParameter("artikelNr");
    		String beschreibung=req.getParameter("beschreibung");
    		String preis=req.getParameter("preis");		
    		if((!(artikelNr==""||beschreibung==""||preis==""))){					
    			artikelNr = URLEncoder.encode(req.getParameter("artikelNr"),"UTF-8");
    			beschreibung = URLEncoder.encode(req.getParameter("beschreibung"),"UTF-8");
    			preis = URLEncoder.encode(req.getParameter("preis"),"UTF-8");				
    			String deleteLine=req.getParameter("delete");					
    			try{				
    				FileWriter fw= new FileWriter(f,true);
    				PrintWriter pw= new PrintWriter(fw);
    				pw.print(artikelNr+"|");
    				pw.print(beschreibung+"|");
    				pw.println(preis);
    				pw.close();	            
    			}// zu try
    			catch(IOException e){
    				res.sendError(500,"IO Fehler\n"+e.getMessage());			
    			}			
    			out.println("<h1>IM2 - Aufgabe 17: Artikelverwaltung</h1><form action='/IM2/servlet/A17' method='post' style='background-color:gray;width:300px'><table cellpadding='5' cellspacing='5' border='0' ><tr>	<td ><font color='#ffffff'>Artikel-Nummer</font></td>	<td><input type='text' name='artikelNr'></td></tr><tr>	<td><font color='#ffffff'>Beschreibung</font></td>	<td><input type='text' name='beschreibung'></td></tr><tr>	<td><font color='#ffffff'>Preis</font></td>	<td><input type='text' name='preis' style='width:80'>&nbsp;<font size='5' color='#ffffff'>€</font> </td></tr><tr>	<td></td>	<td style='vetical-align:bottom'><input type='submit' name='hinzufuegen' value='Hinzufuegen'>	<input type='reset' name='reset' value='Reset' style='width:50'></td></tr></table></form>");
    			out.println("Danke für den Eintrag<br>");
    
    		}//zu if artikelNr
    		else{			
    		out.println("<h1>IM2 - Aufgabe 17: Artikelverwaltung</h1><form action='/IM2/servlet/A17' method='post' style='background-color:gray;width:300px'><table cellpadding='5' cellspacing='5' border='0' ><tr>	<td ><font color='#ffffff'>Artikel-Nummer</font></td>	<td><input type='text' name='artikelNr'></td></tr><tr>	<td><font color='#ffffff'>Beschreibung</font></td>	<td><input type='text' name='beschreibung'></td></tr><tr>	<td><font color='#ffffff'>Preis</font></td>	<td><input type='text' name='preis' style='width:80'>&nbsp;<font size='5' color='#ffffff'>€</font> </td></tr><tr>	<td></td>	<td style='vetical-align:bottom'><input type='submit' name='hinzufuegen' value='Hinzufuegen'>	<input type='reset' name='reset' value='Reset' style='width:50'></td></tr></table></form>");
    		out.println("Formular nicht vollständig ausgefüllt<br>");
    		}
    	}// zu neuer Eintrag
    
    public void leseEintraege (HttpServletRequest req, HttpServletResponse res,PrintWriter out) throws IOException,ServletException{		
    		try{			
    			if (f.canRead()){				
    				FileReader fr = new FileReader(f);
    				LineNumberReader lnr = new LineNumberReader(fr);
    				String line;
    				StringTokenizer st;
    				int i=1;
    				String artNr;
    				String artBesch;
    				String artPreis;			
    				while((line=lnr.readLine())!=null){						
    					st= new StringTokenizer(line,"|");					
    					while(st.hasMoreTokens()){
    						artNr=URLDecoder.decode(st.nextToken(),"UTF-8");
    						artBesch=URLDecoder.decode(st.nextToken(),"UTF-8");
    						artPreis=URLDecoder.decode(st.nextToken(),"UTF-8");
    						out.println("<tr>");
    						out.println("<td>"+artNr+"</td>");
    						out.println("<td>"+artBesch+"</td>");
    						out.println("<td>"+artPreis+"</td>");
    						out.println("<td>&nbsp;&nbsp;&nbsp;&nbsp;<a href='/IM2/servlet/A17?delete="+i+"'>Artikel löschen</a></td>");
    						out.println("</tr>");						
    						i++;						
    					}				
    				}				
    				lnr.close();
    				fTemp.renameTo(f);				
    			}// zu if f.canread			
    		}// zu try
    			catch(IOException e){
    				res.sendError(500,"IO Fehler\n"+e.getMessage());
    			}			
    		}// schließt leseEinträge
    


  • da du noch keine experten-antwort hast gebe ich dir meinen Rat:

    erzeuge eine Klasse AntwortObjekt in der du die Properties in entsprechenden Objekten abspeicherst.

    wenn du auf einn Fehler stösst erzeuge ein neues Antwort-Objekt und schiebe es der Methode unter
    oder gib der Antwort-Klasse eine Methode clearData() zum zurücksetzen.
    besser scheint mir jedoch nur die fehlerhaften Daten zurückzusetzen, damit die Seite nicht nervt, weil sie völlig senil alle gültigen Einträge löscht.

    und spendiere der Klasse eine Methode toString() mit der sie "druckfähig" wird. diese Methode sollte also die Daten für die Ausgabe formatieren.

    Ansonsten hab ich noch nicht verstanden warum die Daten so resistent sind. WO werden denn diese Daten gespeichert?

    /*edit: muss mir deinen Post nochmal angucken*/

    Wenn ich mir deine leseEinträge-Methode angucke, da fällt mir auf: dass sie ihrem Namen nach "Einträge lesen" soll. Wenn ich mir jedoch den Code angucke, entdecke ich "KnowHow" um diese Einträge aus einem antwort-Objekt zu lesen, zu prüfen und zur visuellen Ausgabe in HTML zu formatieren. Ich schhlage generell vor zumindest den Code für die Erzeugung von HTML-Code in der Art von toString() in einer Methode toHTML() zu exportieren. Da macht den Code übersichtlicher und lässt ihn leichter wiederverwenden bzw er muss nicht erneut in anderen Methoden geschrieben werden:

    Regel:
    Know-How sollte immer genau einmal geschrieben (in einer Methode) geschrieben werden!
    Wenn dieses KnowHow gebraucht wird, wird die entsprechende Methode aufgerufen.
    Muss dieses KnwoHow geändert werden, muss es genau einmal geändert werden!

    Falls dir dieses noch nicht weiterhilft:
    WO stehen denn die Daten die auf null gesetzt werden sollen? Warum sind sie nicht null bzw. wo werden sie gestellt und wo müssten sie umgestellt werden?

    Wenn ich die Sache Richtig sehe machst du folgendes:
    Aus einem Request erzeugst du direkt eine Response. Lege doch eine AbstraktionEbene ein, in der die Angelegenheit ohne HTML-Aspekte der Eingabe sowie HTML-Aspekte der Ausgabe behandelt werden, sondern davon losgelösst (abstrakt also) die Angelegenheit an sich.

    im Moment=> HTML-REQ (=> ? ) => HTML-RESPONSE
    besser: HTML-REQ => REQ-Object => REQ-CHECK => RESPONSE-Objekt => HTML-RESPONSE

    Dadurch hast du zwar mehr Klassen, aber die Methoden werden schlanker und durch ihr reduziertes AufgabenFeld wird der Code verständlicher und leichter handbar bzw. wiederverwendbar.

    Ich hoffe ich konnte dir etwas weiterhelfen.


Anmelden zum Antworten