Autor Thema: Servlet: doGet und doPost  (Gelesen 6110 mal)

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Servlet: doGet und doPost
« am: 08.11.06 - 10:16:05 »
ich nutze ein Servlet auf Apache Tomcat. Den Code dafür habe ich aus irgendeinem Javabuch entnommen. In diesem Servlet wird die Post-Anfrage automatisch an GET weitergeleitet.
Ist es sinnvoll, das so zu machen? Kann ich das aus dem GET einfach entfernen und den Code direkt im POST ausführen? Ich nutze das Servlet nur für POST-Aufrufe...

Code
protected void doGet(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException {
		
		BufferedReader in = request.getReader();
		String key = in.readLine();
		
		if (key != null) {
		
		result = ovp.processInput(key, s);
		out.println(result);
		}
	}

	/*
	 * (non-Java-doc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
	 *      HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Servlet: doGet und doPost
« Antwort #1 am: 08.11.06 - 12:59:11 »
Du kannst auch den Code in das doPost schreiben und das doGet auf doPost umleiten.
Das ist dann einfach offensichtlicher für spätere Erweiterungen, Bugfixing.
Performancemässig merkst du von solchen Methoden-Indirections sowieso praktisch nichts.
Du kannst auch in doGet auf eine Fehlerpage umleiten (um sicherzugehen, dass das wirklich nie angesprochen wird).
Falls ich mich recht erinnere gibts auch eine Methode doService(HttpServletRequest, HttpServletResponse). Die kannst du auch überschreiben. Die ruft nämlich doGet und doPost erst auf.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Servlet: doGet und doPost
« Antwort #2 am: 08.11.06 - 14:01:47 »
danke, das beruhigt mich schon mal. Gibt es eine bäst präktiß wie man den request parsed? Schreibe dich die möglichen Felder in eine properties-Datei um etwas dynamisch zu bleiben? Ich will mir alle Felder von einem Formular geben lassen und die dann nach Openview schreiben (in einen Servicecall). Nun sind das etwa 50 Felder die grösstenteils leer sind (mal die einen mal die anderen) und sich sicher auch mal ändern werden.
sagt Mark.



slowfood.de

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Servlet: doGet und doPost
« Antwort #3 am: 08.11.06 - 14:33:40 »
der ServletRequest hat eine Methode getParameterMap(), die alle Parameter des Requests in einer Map zurückgibt. Du musst nichts selber parsen.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Servlet: doGet und doPost
« Antwort #4 am: 08.11.06 - 15:46:49 »
Imho ist das iterieren durch
Zitat
public java.util.Enumeration getParameterNames()

    Returns an Enumeration of String objects containing the names of the parameters contained in this request. If the request has no parameters, the method returns an empty Enumeration.

    Returns:
        an Enumeration of String objects, each String containing the name of a request parameter; or an empty Enumeration if the request has no parameters
gebräuchlicher.
Da stehen alle Felder des Requests drin.
Die heute sehr ungewöhnliche Enumeration hat historische Gründe.
« Letzte Änderung: 08.11.06 - 15:49:20 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Servlet: doGet und doPost
« Antwort #5 am: 08.11.06 - 15:53:18 »
ich kann noch nicht überschauen welcher Weg für mich am Besten ist. Ich brauche einige der 50 Felder als explizite Werte (hartkodierter Name) wie z B Personalnummer. Alle anderen Werte kann ich unspezifisch als Wertepaare in ein grosses Textfeld schreiben.
Daher wäre mein Ansatz:
eine Map holen. Dann die spezifischen Werte mit map.get(Object key) holen und dann aus map löschen. Dann die verbleibende Map mit Iterator durchgehen und alle map.Entry() als Feld-Wert ins Textfeld schieben. Ist das so üblich?
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Servlet: doGet und doPost
« Antwort #6 am: 08.11.06 - 18:26:40 »
Ich find diesen Ansatz einfacher:
1. die Namen der benötigten Felder in einen java.util.Set schreiben (name hier: setRequiredFields). Am besten natürlich extern auslesbar. In web.xml, spring-config.xml (in meinem Fall ist es bei so was meist das) oder properties Datei.
Dann ungefähr so:
Code
       Map mResOpenView = New HashMap ();
Enumeration allReqParamNames = request.getParameterNames(); 

while (allReqParamNames.hasMoreElements()) {
 String reqParamName = allReqParamNames.nextElement().toString(); 
 if (setRequiredFields.contains(reqParamName) {
      String value = req.getParameter(reqParamName);
      mResOpenView.put(reqParamName, value); 
}
}
// mResOpenView irgendwie nach openView übergeben. 

halte das für am einfachsten und transparentesten.

Gruß Axel


Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Servlet: doGet und doPost
« Antwort #7 am: 09.11.06 - 07:22:32 »
das sieht schon gleich Java-mäßig aus  :D

Ich werde mal probieren ob ich das so hinbekomme. Beim Schreiben des Wortes hartkodiert hatten sich meine Finger eh schon gesträubt  :-X
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Servlet: doGet und doPost
« Antwort #8 am: 09.11.06 - 08:48:35 »
das java.util.Set möchte ich in eine properties-Datei auslagern. Schreibe ich die Klasse dafür manuell oder gibts sowas schon in Apache oder so? Ich habe bereits eine messages.properties, die mir Eclipse automatisch über 'Externalize Strings' generiert hat (inkl. der Klasse Messages.java). Soll ich das als Vorbild nehmen?

Ich habe bereits Java ist eine Insel und 80% des bekannten Internets durchforstet aber ich finde da nix passendes zu. Natürlich kann ich alles auch selbst schreiben aber ich habe keinen Bock das irgendwie super kompliziert zu machen wo jeder Javaprogrammierer sagt: Wieso machst du das nicht einfach so anstatt alles neu zu erfinden: .....
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Servlet: doGet und doPost
« Antwort #9 am: 09.11.06 - 09:19:07 »
du kannst z.B. die zu überprüfenden Parameter als komma-separierte Liste in einen Tag der web.xml schreiben.

https://wiki.imise.uni-leipzig.de/Themen/WebApp/WebXml#h686-7

In deinem Fall wäre das so ungefähr:
Code
<context-param>
  <param-name>requiredFields</param-name>
  <param-value>name,strasse, plz, ort</param-value>
  <description>list of names of request Parameters to monitor.</description>
</context-param>

Dann die Liste als Property der Klasse.

Code
class MyServlet extends Servlet {

private Set setRequiredFields = new HashSet(); 

//@override von GenericServlet
public void init( ServletConfig config) {
    ServletContext context = config.getServletContext(); // muss nicht sein. 
    String rawInitParameter = context.getInitParameter("requiredFields"); 
    String[] initParametersAsArray = rawInitParameters.split(","); 
    for (int i=0; i <initParametersAsArray.length; i++) {
       String param = initParametersAsArray[i].trim(); 
        if ((param!=null) && (param.length() > 0))
                 setRequiredFields.add(initParametersAsArray[i].trim()); 
    }
}

    setRequiredFields = new HashSet()

  public void doPost (HttpServletRequest req, HttpServletResponse res) 
[...]

} 
Das Servlet läuft ja Multithreaded. D.h. es bedient mehrere Requests (sogar quasi gleichzeitig). Die init-Methode wird aber nur genau einmal beim Start des Servlets aufgerufen.

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz