# mehrere Message Resources in Struts ansprechen



## Sebastian123 (15. Aug 2006)

Ich wüsste gerne, wie man aus einer ActionForm heraus auf mehrere verschiedene Message Resources unterscheidet.

Meine Klasse sieht so aus:


```
package MEINPROJEKT.ui.form;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Array;
import java.net.MalformedURLException;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.imageio.stream.FileImageInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.taglib.bean.MessageTag;
import org.apache.struts.util.MessageResources;
import org.apache.struts.util.MessageResourcesFactory;

import de.tsystems.dcag.cm.ui.action.LoginAction;

import sun.misc.Resource;
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;


public class LoginForm extends AbstractActionForm {

	private static Log log = LogFactory.getLog(LoginForm.class);
	
	private String username;
	private String password;
	
	public String getPassword() {
	
		return password;
	}
	
	public void setPassword(String password) {
	
		this.password = password;
	}
	
	public String getUsername() {
	
		return username;
	}
	
	public void setUsername(String username) {
	
		this.username = username;
	}
	
	public void reset ( ActionMapping mapping, HttpServletRequest request) {
		username =  null;
		password = null;
		log.trace("reset");
	}

	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
		ActionErrors errors = new ActionErrors();
		
		if (username == null || username.trim().equals("")){

			errors.add("username", new ActionMessage ("MEINPROJEKT.login.loginform.username_empty"));
		}
		if (password == null || password.trim().equals("")){
//			errors.add("password", new ActionError("MEINPROJEKT.login.loginform.password_empty"));
		}
		
		
		return errors;
	}
	

	
}
```

Nur so funktioniert's halt nicht, da ich 2 Message Resources angegeben habe und er nicht weiß, welche er nehmen soll. Ich habe keine Ahnung, wie ich das mitteilen kann. Bitte helft mir, ich hänge hier schon den ganzen Tag. In der Firma weiß es echt keiner. Dumme Sache.

Also meine struts config sieht übrigens dann so aus:

 <message-resources key="MR" parameter="MessageResources" null="false"/>
  <message-resources key="CM" parameter="CMResources" null="false"/>

Also wo gebe ich in der ActionForm die Keys "CM" oder "MR" an? In jsp's komme ich damit zurecht.

Edit sebastian: Code-Tags


----------



## SlaterB (15. Aug 2006)

na das ist ja was, wieso glaubst du dass das überhaupt funktionieren kann?
ich würde ja eher sagen, Struts scheißt alle messages auf einen Haufen, und Doppelte werden nur einmal gespeichert,
aber ist natürlich nur eine Ansicht, weiß auch nichts genaueres,

ganz simpel wäre, das CM in die PropertyDatei reinzuschreiben,
also einma
MR.login.loginform.username_empty,
MR.x.y
..

und in der anderen Datei

CM.login.loginform.username_empty,
CM.x.y
..

notfalls bleiben die Dateien ohne Prefix und dieser wird erst beim Deployment aus dem Dateinamen heraus automatisch eingefügt (mit selbstgebastelten Programm natürlich)

kommt das nicht in Frage?

------

edit: oha, deinen letzten Satz habe ich erst überlesen, wie funktioniert es denn in JSPs?
das wäre interessant zu wissen und vielleicht auch ein Ansatz für eine google-Suche

es gibt auch noch den Konstruktor

ActionMessage
public ActionMessage(java.lang.String key,
                     boolean resource)Construct an action message with the specified replacement values.

Parameters:
key - Message key for this message
resource - Indicates whether the key is a bundle key or literal value


http://struts.apache.org/1.2.7/api/org/apache/struts/action/ActionMessage.html


----------



## clemson (15. Aug 2006)

vielleicht hilft dir org.apache.struts.action.Action#getResources(HttpServletRequest,String) weiter...


----------



## Sebastian123 (16. Aug 2006)

Hallo SlaterB:

der Aufruf in der JSP ist:

<bean:message bundle="CM" key="MEINPROJEKT.irgendwas"/>

Hallo clemson:

da es sich um eine ActionForm und keine Action handelt und die Funktion in der ActionForm nicht unterstützt wird, hilft es mir leider nicht weiter 

Vielen Dank euch beiden für die schnellen Antworten. Ich werde mir jetzt erst nochmal den Unterschied in der Mehrsprachigkeit ansehen und dann nochmal nachsehen ob jemand mehr weiß.


----------



## Sebastian123 (16. Aug 2006)

Ich komme wie folgt an die Nachricht:

	        resources=((MessageResources) request.getAttribute("CM")); 

	        String fieldName = resources.getMessage("MEINPROJEKT.login.loginform.username_empty"); 

ABER:
Wie füge ich die Nachricht zu der Errorliste hinzu?


----------



## daLenz (16. Aug 2006)

Hi,
versuchs mal so:

```
MessageResources messages = MessageResources.getMessageResources("MessageResources");
messages.getMessage("key");
```

greetz


----------



## SlaterB (16. Aug 2006)

is ja langsam gut 
es geht doch um ein ActionMessage/ ActionError-Konstrukt, da muss man den Property angeben, nicht die Nachricht selber,

da nützt alle Arbeit in der Action nix
(oder ich irre mich, kann auch sein  )
----

@Sebastian123: ich habe ja einen Konstruktor gepostet, der was mit bundle zu tun zu haben scheint,
hast du mit dem ein wenig probiert?, was ist wenn du 
'CM.key...' als key angibst?


mit dem Stichwort bundle + ActionError ließe sich vielleicht auch was bei google finden,
z.B.
http://mail-archives.apache.org/mod...8099902.4351.255.camel@localhost.localdomain>


----------



## clemson (16. Aug 2006)

die getResources(HttpServletRequest,String) methode aus der struts Action ist folgendermaßen implementiert:


```
/**
* 

Return the specified message resources for the current module.</p>
*
* @param request The servlet request we are processing
* @param key The key specified in the
*  <code>&message-resources&</code> element for the
*  requested bundle
*
* @since Struts 1.1
*/
protected MessageResources getResources(
HttpServletRequest request,
String key) {

          // Identify the current module
          ServletContext context = getServlet().getServletContext();
          ModuleConfig moduleConfig =
          ModuleUtils.getInstance().getModuleConfig(request, context);

          // Return the requested message resources instance
          return (MessageResources) context.getAttribute(
                    key + moduleConfig.getPrefix());

}
```

innerhalb der ActionForm kommst du mit #getServlet() an das Servlet heran...


----------

