# Parameterübergabe an Servlet und Aufruf von Servlets per Java Code



## andyx1975 (16. Dez 2011)

Hallo,

ich habe ein Servlet geschrieben das Dateien vom Webserver runterlädt. Wenn ich "http://127.0.0.1:8888/download/" im browser eingebe funktioniert das Servlet. Ich habe den gewünschten Dateinamen im Servlet fest hinterlegt (fileName= "text.txt"). Ich möchte jetzt aber, dass der Dateiname vom WebBrowser an das Servlet übergeben wird. Kann mir jemand verraten wie ich das anstelle? Bin ziemlich neu was Servlets und Webprogrammierung angeht.

Des weiteren ist mir momentan unklar, wie ich das Servlet per JavaCode aufrufen kann. Kann mir jemand weiterhelfen?

Danke
Andy



*Mein Java Servlet:*

```
package com.uds.webadmin.server;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CFileDownload
    extends HttpServlet
{

    @Override
    protected void doGet( HttpServletRequest req, HttpServletResponse resp )
        throws ServletException, IOException
    {
        
        //Der hier fix eingetragene Wert soll beim Aufruf des Servlets vom WebBrowser (Client übergeben werden). Wie muss ich das machen? 
        // Und wie muss ich das Servlet per Java Code aufrufen?
        String fileName= "text.txt"; // 
        
        
        String path = getServletContext().getRealPath( "/" ) + "uploads/";
        
        File                f        = new File(path + fileName);
        int                 length   = 0;
        ServletOutputStream op       = resp.getOutputStream();
        ServletContext      context  = getServletConfig().getServletContext();
        String              mimetype = context.getMimeType( fileName );


        resp.setContentType( (mimetype != null) ? mimetype : "application/octet-stream" );
        resp.setContentLength( (int)f.length() );
        resp.setHeader( "Content-Disposition", "attachment; filename=\"" + fileName + "\"" );


        byte[] bbuf = new byte[1024];
        DataInputStream in = new DataInputStream(new FileInputStream(f));

        while ((in != null) && ((length = in.read(bbuf)) != -1))
        {
            op.write(bbuf,0,length);
        }

        in.close();
        op.flush();
        op.close();
    }
    

}
```

*Meine web.xml*
[XML]
<!-- FileDownload -->
	<servlet>
     	<servlet-name>FileDownload</servlet-name>
     	<servlet-class>com.uds.webadmin.server.CFileDownload</servlet-class>
	</servlet>
	<servlet-mapping>
     	<servlet-name>FileDownload</servlet-name>
     	<url-pattern>/download/*</url-pattern>
	</servlet-mapping>
[/XML]


----------



## SlaterB (16. Dez 2011)

puh, gar keine Grundlagen zum Web an sich, Formulare,
Paramter der Form "link?name=xy" unbekannt?

das ist ja nicht so leicht, auch Paramter aus HttpServletRequest-auslesen muss gelernt werden..

das kann man ja nicht in einem Forum besprechen, lies dir Links wie
Servlet Tutorial: Handling Form Data
durch oder gleich ein 300 Seiten-Grundlagenbuch (zu J2EE)..

-----

ein Servlet per Java-Code aufrufen ist normalerweise nicht vorgesehen, was bezweckst du damit?
du könntest Code in separate Klassen stecken, die entweder von deinem Servlet oder eben von beliebiger andere Stelle aufgerufen werden


----------



## nillehammer (16. Dez 2011)

Parameter können an eine Webanwendung z.B. über folgende Wege übergeben werden:
- Als Parameter in der URL in einem GET-Request, bspw. so:

```
http://meinHost:meinPort/FileDownload?file=meinFile
```
 - Als Parameter in einem POST-Body. Dafür wäre dann ein html-Formular zu programmieren. Z.B. so:

```
<form action="http://meinHost:meinPort/FileDownload" method="post">
  <label for="file">Namen der Datei eingeben</label><input type="text" id="file" />
  <input type="submit">Downloaden</input>
</form>
```

Die Parameter werden dann in der entspr. handler-Methode des Servlets ausgelesen (also doGet bei der URL-Variante und doPost bei der Formularvariante). Das sieht dann in beiden Fällen etwa so aus:

```
final String fileName = req.getParameter("file");
```

Habe den Code aus dem Gedächtnis getippt. Kann also sein, dass ein paar Syntaxfehler drinnen sind. Aber das Prinzip sollte klar sein. Abgesehen davon noch ein Sicherheitshinweis. Du musst die Parameter unbedingt validieren oder auf eine bestimmte Menge einschränken. Sonst öffnest Du bösen Hackern damit ein Tor auf Dein Filesystem.


----------



## andyx1975 (16. Dez 2011)

Danke das funktioniert soweit auch jetzt...jetzt muss ich nur erhausfinden wie ich das Servlet in den Action Listener einbinden kann. Ich hab keine HTML Formular...ich muss mir quasi einen Link bauen der wie folgt aussieht:

http://127.0.0.1:8888/download?file=text.txt

Gibt es eine Möglichkeit das Servlet so aufzurufen?


----------



## SlaterB (16. Dez 2011)

html - How to send HTTP request in java? - Stack Overflow


----------



## andyx1975 (21. Dez 2011)

ok über die folgende Methode lässt sich das Servlet aufrufen:

Window.Location.replace("/download?file=test.txt");


----------



## SlaterB (21. Dez 2011)

das klingt nach JavaScript?


----------



## andyx1975 (21. Dez 2011)

Ja genau... ich benutze SmartGWT bzw. GWT...sind beides JavaScript Frameworks. Dadurch funktioniert einiges anders als bei herkömmlichen JSP und Servlets.

Gruß
Andy


----------

