# struts2: vom value stack zum servlet



## JRookie (18. Aug 2009)

Hi zusammen,
ich komm hier nicht weiter:
ich hab eine kleine struts Anwendung: in der client Eingabemaske wird ein Funktionsname eingegeben, in der business logic Klasse werden die Funktionswerte berechnet und als 2 double arrays auf den value stack gelegt.
Meine Ergebnis jsp soll ein servlet rufen, dass ein Koordinatensystem und die Kurve als Grafik darstellt.
Ich kann mittlerweile 1) mit
        		       		<h4><sroperty value="dx"/></h4><br>
        		       		<h4><sroperty value="dy"/></h4><br>
die arrays in voller Schönheit als strings auf der Maske ausgeben (was ich nicht will)
und 2) meinem servlet ein paar Daten explizit übergeben, dann wird das Koordinatensystem mit der (Test)kurve ausgegeben. Ich rufe das servlet so auf

```
<%
		int i ;
		webzei z5  = new webzei();
		z5.los(request, response, i, dx, dy);
%>
```
Die Fehlermeldung, die ich bekomme heisst "Could not resolve dx, dy" Er kennt sie irgendwie nicht.
Wie kann ich diese Datenübergabe hinbekommen? Kann ich von dem servlet aus auf getdx() und getdy() zugreifen, oder kann ich die Parameter vom jsp ans servlet übergeben ???
Vielen Dank im voraus!
JRookie


----------



## JRookie (21. Aug 2009)

ups


----------



## JRookie (23. Aug 2009)

Entweder meine Frage ist so überflüssig und jeder kennt die Antwort und verrät sie nicht,
oder ich bin hier ganz alleine auf der Welt .....
Ich hab jetzt auch schon getter und setter für dx und dy in meine servlet Klasse gepackt und versuche vom servlet direkt auf den value stack zuzugreifen, dass gibt zwei leere arrays, d.h. mein servlet liefert nur das Koordinatenkreuz.
Schade, schade
JRookie


----------



## maki (23. Aug 2009)

Du instantiierst ein Servlet in einem JSP Skriptlet?

Kenne struts2 nicht, nur struts (1), aber so etwas wäre da auch schon daneben gewesen 

Möchtest du vielleicht nur ein img Tag nutzen, dessen URL auf das Servlet verweist?


----------



## JRookie (24. Aug 2009)

Ja,ja dass tu ich wohl. 
In meinem struts-in-action Buch werden immer jsp Seiten als result pages angegeben. Ich dachte mich daran zu halten um evt. Schwierigkeiten aus dem Weg zu gehen.
Wenn ich ein img tag benutzen würde, hätte ich immer noch das Problem einer Parameterübergabe (das ist mein eigentliches Problem!!).
Ich kann mir die Daten im jsp vom value stack holen mit 
<sroperty value="dx"/>
aber dx scheint doch nur eine Referenz auf den value stack Bereich zu sein. Die ganzen array Werte erscheinen auf dem screen (= output des jsp) , können aber nicht einer Variablen zugeordnet werden, die ich ans servlet übergeben könnte.
Würde ich mein servlet umbauen, so dass es sich selbst die Daten vom value stack holt, hätte ich immer noch das Problem, dass ich nicht weiss wie ....
Wenn mein servlet die entsprechenden getter und setter bekommt (die eigentlich in der java Klasse liegen, die die Funktionswerte berechnen), gibt's einen leeren array, d.h. ich bekomme immerhin ein leeres Koordinatenkreuz als Ergebnis. Auch nicht schlecht. Aber nicht ganz das, was ich will.
Any ideas, anyone ???
Viele Grüße und Danke für die Antwort
JRookie


----------



## Atze (24. Aug 2009)

JRookie hat gesagt.:


> "Could not resolve dx, dy" Er kennt sie irgendwie nicht.



woher kommen dx und dy nochmal? sind die in der jsp deklariert?


----------



## JRookie (25. Aug 2009)

jawohl, die kommen aus dem jsp. Das sieht so aus:

```
<h4><s:property value="funcname"/></h4><br>
        		 <h4><s:property value="dx"/></h4><br>
        		 <h4><s:property value="dy"/></h4><br>
```
Die Werte werden schön säuberlich auf der Maske als string ausgegeben. 
Es ist also eigentlich alles da.
Ich glaube, du willst wissen wo die Daten entstehen:
Ich habe eine action, die zeigt auf die Klasse fuzeicomp

```
<action name="compute" class="fuzeicomp">
		<result name="SUCCESS">/jsp/zeig.jsp</result>
    		</action>
```
In dieser Klasse werden Funktionswerte berechnet und mit getter und setter für dx und dy auf den value stack geschoben.

```
dx[0]  =  -40.0 ; 
    		for (i=0 ; ; i++, dx[i]= dx[i-1] + 0.1 )  {

    			dy[i]  = pow(dx[i],2.0) + 0.0*a* pow(dx[i],2.0) + b*dx[i] + 0.0  ;
    	    	System.out.println ("dx[" + i + "] = " + dx[i] + "   dy[" + i + "] = " + dy[i] );	
    			if (dx[i] >= 40.0)  break;
    		}
 
    	
    	setdx(dx);
    	setdy(dy);
    	
    	return "SUCCESS";
    }


        
    private String name;
    private String func;

     // -----------------------------------    
    public String getfunc() {
        return func;
    }

    public void setfunc(String func) {
        this.func = func;
    }
    // -----------------------------------
    
    private String funcname;
    // -----------------------------------
    public String getfuncname()
    {
    	return funcname;
    }
    
    public void setfuncname( String funcname ){
    	this.funcname = funcname;
    }
    // -----------------------------------
    
	private double [] dx = new double [srcBufSize];
	private double [] dy = new double [srcBufSize];    
 
	public double [] getdx()
    { return dx ; }
    
    public void setdx( double [] dx )
    {	this.dx = dx; }
    
    
	public double [] getdy()
    { return dy ; }
    
    public void setdy( double [] dy )
    {	this.dy = dy; }    
    // -----------------------------------
```
 
JRookie


----------



## Atze (25. Aug 2009)

ich kenne mich mit den tags nicht ganz so aus, habe nur mit scriptlets gearbeitet, aber was du da machst ist nur einen wert ohne referenz ausgeben

müsste es nicht so aussehen?:

<c:set var="dx" scope="request"><sroperty value="wert1" /></c:set> 
<c:set var="dy" scope="request"><sroperty value="wert2" /></c:set> 

??


----------



## JRookie (25. Aug 2009)

Kann gut sein, dass du recht hast; ich werde es heute abend ausprobieren.
eine Frage noch: Bei mir steht oben im jsp
<%@ taglib prefix="s" uri="/struts-tags" %>  
damit ist das Prefix s erklärt.
Muß ich was deklarieren, um dein "c" prefix klarzumachen ??
Grüße
JRookie


----------



## Atze (25. Aug 2009)

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


----------



## JRookie (25. Aug 2009)

alles klar,
wird getestet.
Schönen Dank erstmal, ich meld mich wieder.
JRookie


----------



## JRookie (25. Aug 2009)

Tja, leider ist das Ergebnis dasselbe:

```
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
....
....
                <c:set var="dx2" scope="request"><s:property value="dx" /></c:set> 
                <c:set var="dy2" scope="request"><s:property value="dy" /></c:set> 

<%
		int i=500 ;
		webzei z5  = new webzei();
  		z5.los(request, response,i,dx2,dy2);
%>
```
gibt im Betrieb:

```
org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 55 in the jsp file: /jsp/zeig.jsp
dx2 cannot be resolved
52: <%
53: 		int i=500 ;
54: 		webzei z5  = new webzei();
55:   		z5.los(request, response,i,dx2,dy2);
56: %>      		
57: 
58: 	</body>
An error occurred at line: 55 in the jsp file: /jsp/zeig.jsp
dy2 cannot be resolved
52: <%
53: 		int i=500 ;
54: 		webzei z5  = new webzei();
55:   		z5.los(request, response,i,dx2,dy2);
56: %>      		
57: 
58: 	</body>
```
Ich habe noch jstl.jar und standard.jar ins WEB-INF/lib kopiert. Hab ich im net gefunden.
Muss ich dem jsp nicht irgendwie erklären, dass die empfangenden Variablen dx2 und dy2 double [] sein müssen ???

Gruß 
JRookie


----------



## Atze (25. Aug 2009)

versuch mal
<c:set var="dx2" value="wert" />

sonst fällt mir nix mehr ein!  wie gesagt, hab mit der taglib noch nicht wirklich gearbeitet!


----------



## JRookie (30. Aug 2009)

Nö, geht auch nicht ...
Hat sonst irgendjemand eine Idee ???
JRookie


----------



## JRookie (6. Sep 2009)

Hallo alle,
hab's ! endlich .....
Im jsp muss es so aussehen:

```
<c:set var="fn" value="${funcname}" ></c:set>
       		<h4><s:property value="funcname"/></h4><br>
 
 
      	<c:set var="dx2">			               geht !!!  
   			<s:property value="dx" />
	</c:set>
        <c:set var="dy2">			                geht !!!  
   			<s:property value="dy" />
		</c:set>
```
Allerdings bekomme ich die neuen Variablen nicht in den scriptlet Teil der jsp, wo ich sie dann als Parameter an das servlet weiterreichen wollte.
Ich hab jetzt im servlet ein import auf die Klasse in der getter und setter liegen und greif im servlet auf die Daten zu.
Im servlet webzei.java:

```
import pack.fuzeicomp;
.........

      double xt[]		= fuzeicomp.getdx();
      double yt[]		= fuzeicomp.getdy();
```
Damit ist das Ding erledigt.
Danke an alle
JRookie


----------

