6.5. Using XML Namespaces
Previous examples have alternated between two component declaration methods: with and without using XML namespaces. The following shows a typical
components.xml
file that does not use namespaces:
<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xsi:schemaLocation= "http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd"> <component class="org.jboss.seam.core.init"> <property name="debug">true</property> <property name="jndiPattern">@jndiPattern@</property> </component> </components>
As you can see, this code is verbose. More importantly, the component and attribute names cannot be validated at development time.
Using namespaces gives us:
<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xmlns:core="http://jboss.com/products/seam/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd"> <core:init debug="true" jndi-pattern="@jndiPattern@"/> </components>
Although the schema declarations are verbose, the XML content itself is lean and easy to understand. The schemas provide detailed information about each component and the available attributes, allowing XML editors to offer intelligent auto-completion. Using namespaced elements makes it easier to generate and maintain correct
components.xml
files.
This works well for built-in Seam components, but for user components there are two available options. First, Seam supports mixing both models, allowing the use of generic
<component>
declarations for user components, and namespaced declarations for built-in components. More importantly, Seam lets you quickly declare namespaces for your own components.
Any Java package can be associated with an XML namespace by annotating the package with
@Namespace
. (Package-level annotations are declared in a file named package-info.java
in the package directory.) An example of this from the seampay demo is:
@Namespace(value="http://jboss.com/products/seam/examples/ seampay") package org.jboss.seam.example.seampay; import org.jboss.seam.annotations.Namespace;
Using the namespaced style in
components.xml
is that simple. Now we can write:
<components xmlns="http://jboss.com/products/seam/components" xmlns:pay="http://jboss.com/products/seam/examples/seampay" ... > <pay:payment-home new-instance="#{newPayment}" created-message="Created a new payment to #{newPayment.payee}" /> <pay:payment name="newPayment" payee="Somebody" account="#{selectedAccount}" payment-date="#{currentDatetime}" created-date="#{currentDatetime}" /> ... </components>
Or:
<components xmlns="http://jboss.com/products/seam/components" xmlns:pay="http://jboss.com/products/seam/examples/seampay" ... > <pay:payment-home> <pay:new-instance>"#{newPayment}"</pay:new-instance> <pay:created-message> Created a new payment to #{newPayment.payee} </pay:created-message> </pay:payment-home> <pay:payment name="newPayment"> <pay:payee>Somebody"</pay:payee> <pay:account>#{selectedAccount}</pay:account> <pay:payment-date>#{currentDatetime}</pay:payment-date> <pay:created-date>#{currentDatetime}</pay:created-date> </pay:payment> ... </components>
The previous examples illustrate the two usage models of a namespaced element. In the first declaration,
<pay:payment-home>
references the paymentHome
component:
package org.jboss.seam.example.seampay; ... @Name("paymentHome") public class PaymentController extends EntityHome<Payment> { ... }
The element name is the hyphenated form of the component name. The attributes of the element are the hyphenated forms of the property names.
In the second declaration, the
<pay:payment>
element refers to the Payment
class in the org.jboss.seam.example.seampay
package. In this case, Payment
is an entity that is being declared as a Seam component:
package org.jboss.seam.example.seampay; ... @Entity public class Payment implements Serializable { ... }
A schema is required for validation and auto-completion to work for user-defined components. Seam cannot yet generate a schema for a set of components automatically, so schema must be manually created. You can use schema definitions for standard Seam packages for guidance.
The following are the namespaces used by Seam:
- components —
http://jboss.com/products/seam/components
- core —
http://jboss.com/products/seam/core
- drools —
http://jboss.com/products/seam/drools
- framework —
http://jboss.com/products/seam/framework
- jms —
http://jboss.com/products/seam/jms
- remoting —
http://jboss.com/products/seam/remoting
- theme —
http://jboss.com/products/seam/theme
- security —
http://jboss.com/products/seam/security
- mail —
http://jboss.com/products/seam/mail
- web —
http://jboss.com/products/seam/web
- pdf —
http://jboss.com/products/seam/pdf
- spring —
http://jboss.com/products/seam/spring