Author: rafabene
Date: Thu Jun 12 14:51:40 2014
New Revision: 1602186
URL: http://svn.apache.org/r1602186
Log:
DELTASPIKE-227
documentation for minimal type-safe messages
Modified:
deltaspike/site/trunk/content/core.mdtext
deltaspike/site/trunk/content/jsf.mdtext
Modified: deltaspike/site/trunk/content/core.mdtext
URL:
http://svn.apache.org/viewvc/deltaspike/site/trunk/content/core.mdtext?rev=1602186&r1=1602185&r2=1602186&view=diff
==============================================================================
--- deltaspike/site/trunk/content/core.mdtext (original)
+++ deltaspike/site/trunk/content/core.mdtext Thu Jun 12 14:51:40 2014
@@ -319,7 +319,7 @@ The following implementation uses the ke
org/apache/deltaspike/example/message/SimpleMessage_de.properties
...
- //content (as usual in message bundle files:
+ //content (as usual in message bundle files):
welcome_to_deltaspike=Welcome to DeltaSpike
The following implementation uses the key `welcome_to_deltaspike` to do a
lookup in a custom message bundle known by `CustomMessageResolver`.
Modified: deltaspike/site/trunk/content/jsf.mdtext
URL:
http://svn.apache.org/viewvc/deltaspike/site/trunk/content/jsf.mdtext?rev=1602186&r1=1602185&r2=1602186&view=diff
==============================================================================
--- deltaspike/site/trunk/content/jsf.mdtext (original)
+++ deltaspike/site/trunk/content/jsf.mdtext Thu Jun 12 14:51:40 2014
@@ -24,7 +24,7 @@ Notice: Licensed to the Apache Softwa
## Intro
### Historic Considerations
-Until the end of the 1990s web browsers are usually single threaded and only
had one window. But in the last years browsers supporting multiple windows or
even tab became the standard. Since those days lots of efforts went into
uniquely identifying a single browser window on the server side. Sadly browser
windows still lack of a native windowId, thus maintaining web application data
in @SessionScoped backing beans is still used in most of the cases.
+Until the end of the 1990s web browsers are usually single threaded and only
had one window. But in the last years browsers supporting multiple windows or
even tab became the standard. Since those days lots of efforts went into
uniquely identifying a single browser window on the server side. Sadly browser
windows still lack of a native windowId, thus maintaining web application data
in @SessionScoped backing beans is still used in most of the cases.
###How JSF-2 changed the world
@@ -90,7 +90,7 @@ If it's not matching, the view will be r
##### Disadvantage
- - It could happen that 2 tabs will share the same windowId for 1 request
because the `LAZY` mode will check lazily, after rendering the view, if the
windowId matches the `window.name`. Therefore it could happen that
@ViewAccessScoped or other scopes will unintentionally be destroyed.
+ - It could happen that 2 tabs will share the same windowId for 1 request
because the `LAZY` mode will check lazily, after rendering the view, if the
windowId matches the `window.name`. Therefore it could happen that
@ViewAccessScoped or other scopes will unintentionally be destroyed.
#### Workflow example
@@ -235,6 +235,63 @@ Furthermore, the managed-bean annotation
All these annotations are mapped automatically. So you won't face issues, if
you import a JSF 2 annotation instead of the corresponding CDI annotation.
+# Integration with DeltaSpike type-safe messages
+
+You can use [DeltaSpike type-safe messages](core.html#messages-i18n) with JSF
to provide i18n messages and test to an JSF appplicaton.
+
+JSF module is also capable to use messages provided through <message-bundle>
in faces-config.xml file. The <message-bundle> element allows you to override
JSF default messages (Section 2.5.2.4 of the JSF specification contains the
list of all JSF default messages that could be override.).
+
+You can also use the same file to provide type-safe messages.
+
+Example:
+
+ :::java
+ @MessageBundle
+ public interface SimpleMessage
+ {
+ @MessageTemplate("{welcome_to_deltaspike}")
+ String welcomeToDeltaSpike();
+ }
+
+ @Model
+ public class PageBean
+ {
+
+ @Inject
+ private SimpleMessage messages;
+
+ public void actionMethod(){
+ FacesContext.getCurrentInstance().addMessage(null,new
FacesMessage(messages.welcomeToDeltaSpike()));
+ }
+
+ }
+
+
+ org.apache.deltaspike.example.message.SimpleMessage
+
+ ->
+
+ org/apache/deltaspike/example/message/SimpleMessage.properties
+ org/apache/deltaspike/example/message/SimpleMessage.properties
+ org/apache/deltaspike/example/message/SimpleMessage_en.properties
+ org/apache/deltaspike/example/message/SimpleMessage_de.properties
+
+ ...
+
+ //content (as usual in message bundle files):
+ welcome_to_deltaspike=Welcome to DeltaSpike
+ //Overrided JSF messages
+ javax.faces.component.UIInput.REQUIRED = {0}: Please enter a value
+
+On faces-config.xml file:
+
+ <faces-config>
+ <application>
+
<message-bundle>org.apache.deltaspike.example.message.SimpleMessage</message-bundle>
+ </application>
+ </faces-config>
+
+
# Type-safe View-Configs
## Intro
@@ -491,7 +548,7 @@ and depending on additional meta-data yo
:::java
@View(navigation = REDIRECT)
- interface Pages extends ViewConfig
+ interface Pages extends ViewConfig
{
interface Wizard1 extends Pages
{
@@ -758,7 +815,7 @@ In case of
}
it's possible to navigate with `DefaultErrorView.class` instead of hardcoding
it to `Pages.CustomErrorPage.class`.
-
+
:::java
@Model
public class PageController
@@ -1008,7 +1065,7 @@ Example - Separated DeltaSpike conversat
{
//...
}
-
+
@GroupedConversationScoped
public class DemoBean3 implements Serializable
{
@@ -1023,14 +1080,14 @@ Example - Grouped conversation scoped be
:::java
interface Wizard1 {}
-
+
@GroupedConversationScoped
@ConversationGroup(Wizard1.class)
public class DemoBean4 implements Serializable
{
//...
}
-
+
@GroupedConversationScoped
@ConversationGroup(Wizard1.class)
public class DemoBean5 implements Serializable
@@ -1049,7 +1106,7 @@ Example - Injecting a conversation scope
@Inject
@ConversationGroup(Group1.class)
private CustomBean2 demoBean;
-
+
@Inject
@ConversationGroup(Group2.class)
private CustomBean2 demoBean;
@@ -1062,7 +1119,7 @@ Example - Producer methods which produce
:::java
interface Group1 {}
interface Group2 {}
-
+
public class CustomBean2
{
@Produces
@@ -1072,7 +1129,7 @@ Example - Producer methods which produce
{
return new CustomBean2();
}
-
+
@Produces
@GroupedConversationScoped
@ConversationGroup(Group2.class)
@@ -1094,23 +1151,23 @@ Example - Injecting and using the curren
{
@Inject
private GroupedConversation conversation; //injects the conversation
of DemoBean6 (!= conversation of DemoBean7)
-
+
//...
-
+
public void finish()
{
this.conversation.close();
}
}
-
+
@GroupedConversationScoped
public class DemoBean7 implements Serializable
{
@Inject
private GroupedConversation conversation; //injects the conversation
of DemoBean7 (!= conversation of DemoBean6)
-
+
//...
-
+
public void finish()
{
this.conversation.close();
@@ -1121,16 +1178,16 @@ Example - Injecting and using the explic
:::java
interface Wizard2 {}
-
+
@GroupedConversationScoped
@ConversationGroup(Wizard2.class)
public class DemoBean8 implements Serializable
{
@Inject
private GroupedConversation conversation; //injects the conversation
of Wizard2 (contains DemoBean8 and DemoBean9)
-
+
//...
-
+
public void finish()
{
this.conversation.close();
@@ -1143,9 +1200,9 @@ Example - Injecting and using the explic
{
@Inject
private GroupedConversation conversation; //injects the conversation
of Wizard2 (contains DemoBean8 and DemoBean9)
-
+
//...
-
+
public void finish()
{
this.conversation.close();
@@ -1160,9 +1217,9 @@ Example - Terminating a grouped conversa
{
@Inject
private GroupedConversationManager conversationManager;
-
+
//...
-
+
public void finish()
{
this.conversationManager.closeConversationGroup(Wizard2.class);
//closes the conversation of group Wizard2.class
@@ -1177,9 +1234,9 @@ Example - Terminate all conversations:
{
@Inject
private GroupedConversationManager conversationManager;
-
+
//...
-
+
public void finish()
{
this.conversationManager.closeConversations(); //closes all
existing conversations within the current window (context)
@@ -1198,24 +1255,24 @@ Example - Explicitly listing beans of a
:::java
public class MyGroup{}
-
+
@GroupedConversationScoped
@ConversationGroup(MyGroup.class)
public class BeanA {}
-
+
@GroupedConversationScoped
@ConversationGroup(MyGroup.class)
public class BeanB {}
-
+
@GroupedConversationScoped
@ConversationGroup(MyGroup.class)
public class BeanC {}
-
+
@ConversationSubGroup(subGroup = {BeanA.class, BeanB.class})
public class MySubGroup extends MyGroup {}
-
+
//or
-
+
@ConversationSubGroup(of = MyGroup.class, subGroup = {BeanA.class,
BeanB.class})
public class MySubGroup {}
@@ -1236,12 +1293,12 @@ Example - Implicit sub-group:
:::java
public interface Wizard {}
-
+
@ConversationSubGroup(of = MyGroup.class, subGroup = Wizard.class)
public class ImplicitSubGroup
{
}
-
+
@Named("myWizard")
@GroupedConversationScoped
@ConversationGroup(MyGroup.class)
@@ -1249,7 +1306,7 @@ Example - Implicit sub-group:
{
//...
}
-
+
this.conversationManager.closeConversationGroup(ImplicitSubGroup.class);
In the listing above all beans which implement the Wizard interface will be
closed as soon as you close the ImplicitSubGroup.