# Verwendung von DynActionForm (Struts)



## Bigelo (9. Aug 2006)

Hallo.

Ich habe bisher für meine kleine Webanwendung mit eigen erstellten Action Forms gearbeitet. Nun wollte ich mal DynActionForms verwenden um mir die lästige Erstellung von Java Klassen, welche für jedes Form bean von nöten sind, zu ersparen.

Ich greife dann in meiner Action auf folgendem Wege duf die Elemente zu:

DynaActionForm df = (DynaActionForm)form;
String name = (String)df.get("name");
String passwort = (string)df.get("passwort");


Wen ich nun meine Anwendung ausführe, kommt folgender Fehler:

_javax.servlet.ServletException: org.apache.struts.action.DynaActionForm
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.ClassCastException: org.apache.struts.action.DynaActionForm
	login_package.LoginAction.execute(LoginAction.java:40)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs._ 




Ich glaube nicht das es mit dem Zugriff auf die Elemente zu tun hat, habe aber auch keine Idee woran es liegen könnte.

Wäre echt super, wenn mir jemand helfen könnte.

P.S.: Gibt es eigentlich einen Nachteil an DynActionForms gegenüber selbsteschriebenen ActionForms?


Danke


----------



## KSG9|sebastian (9. Aug 2006)

poste mal bitte die struts-config


----------



## Bigelo (9. Aug 2006)

struts-config.xml:


<form-bean	 name="loginForm" 
    			type="org.apache.struts.action.DynaActionForm"
    			dynamic="true">
    		<form-property  name="name"
    					type="java.lang.String"
    					initial="Peter"/>
    		<form-property 	name="password"
    					type="java.lang.String"
    					initial=""/>
</form-bean>


----------



## clemson (9. Aug 2006)

hmm, und wie schaut das action-mapping aus (da, wo du festlegst, welche actio welche actionform hat)?


```
DynaActionForm df = (DynaActionForm)form;
String name = (String)df.get("name");
String passwort = (string)df.get("passwort");
```

das kleingschriebene string ist nur ein rechtschreibfehler von dir beim posten, oder?


ps.: es gibt auch die DynaActionForm#getString(String) methode, welche dir das casten erspart...


----------



## Bigelo (9. Aug 2006)

ja, das war nur ein Rechtschreibfehler vom posten

Hier ist das action-mapping:

<action	path="/login"
               	type="login_package.LoginAction"				
               	name="loginForm"								
				scope="request"									
              	input="/login.jsp"								
              	validate="true">								
			<forward name="failure" path="/login.jsp"/>
  			<forward name="success" path="/loggedin.jsp"/>
    	</action>


----------



## KSG9|sebastian (9. Aug 2006)

hm..sicher das die Anwendung auch neu deployt wurde aufm server?


----------



## Bigelo (9. Aug 2006)

ja, auf jeden Fall


----------



## clemson (9. Aug 2006)

hmm, soweit schaut alles in ordnung aus...

überprüfe mal, was denn für ein typ zurückgegeben wird!


```
DynaActionForm daf = (DynaActionForm) form;
Object o = daf.get("name");
System.out.println( o.getClass().getName() );
```


----------



## Bigelo (9. Aug 2006)

Hmm..., scheint damit nichts zu tun zu haben.

Es handelt sich bei dem Teil der Anwendung, in dem ich die DynActionForm verwende, um eine Login Maske. Wenn ich mich mit korrektem Passwort einlogge, wird direkt die obige Fehlermeldung angezeigt und egal wie ich den Code in der Action ändere, wird immer Zeile 40 in meiner Action Klasse als Fehlerstelle angezeigt.


----------



## KSG9|sebastian (10. Aug 2006)

post mal den code der login-klasse plz


----------



## Bigelo (10. Aug 2006)

Hi!
Hier ist die LoginAction:


```
package login_package;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynActionForm;



/** the purpose of a Action subclass is to process the user's request
 * 
 * @author Benjamin
 *
 */
public class LoginAction extends Action 
{
	/**
	 * Handles user's request for login
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @throws Exception
	 * @return ActionForward
	 */
	public ActionForward execute( 	ActionMapping mapping,
									ActionForm form,
									HttpServletRequest request,
									HttpServletResponse response)
									throws Exception
	{
		
		DynaActionForm df = (DynaActionForm)form;
		Object o = df.get("name");
		System.out.println (o.getClass().getName());
		
		
		// create a new LoginBean with valid users in it. It represents the Model and holds the data regarding    
                authorized users
		LoginBean lb = new LoginBean(getDataSource(request, "kms_db"));
		
		
		
		
		
		
			
		
		
		
		UserDTO user = lb.validateUser(	name,passwort);

		
		
		
		
		
		if (user != null){
			//Save UserDTO in the Session
			request.getSession().setAttribute("user", user);
			return (mapping.findForward("success"));
		}
		//if username an password not validated
		else{
			// create ActionError and save in the request
			ActionErrors errors = new ActionErrors();
			ActionError error = new ActionError("error.login.invalid");
			errors.add("login",error);
			saveErrors(request,errors);
			return (mapping.findForward("failure"));
		}
	}
}
```


----------

