Polishing the web integration sections of the reference manual.

master
Sam Brannen 15 years ago
parent 8a09c8e7da
commit 642549a1e7
  1. 57
      spring-framework-reference/src/web-integration.xml

@ -39,7 +39,7 @@
details of integrating your favorite web framework with Spring. One thing
that is often commented upon by developers coming to Java from other
languages is the seeming super-abundance of web frameworks available in
Java... there are indeed a great number of web frameworks in the Java
Java. There are indeed a great number of web frameworks in the Java
space; in fact there are far too many to cover with any semblance of
detail in a single chapter. This chapter thus picks four of the more
popular web frameworks in Java, starting with the Spring configuration
@ -63,15 +63,15 @@
<title>Common configuration</title>
<para>Before diving into the integration specifics of each supported web
framework, let us first take a look at the Spring configuration that
framework, let us first take a look at the Spring configuration that is
<emphasis>not</emphasis> specific to any one web framework. (This section
is equally applicable to Spring's own web framework, Spring MVC.)</para>
<para>One of the concepts (for want of a better word) espoused by
(Spring's) lightweight application model is that of a layered
architecture. Remember that in a 'classic' layered architecture, the web
layer is but one of many layers... it serves as one of the entry points
into a server side application, and it delegates to service objects
layer is but one of many layers; it serves as one of the entry points
into a server side application and it delegates to service objects
(facades) defined in a service layer to satisfy business specific (and
presentation-technology agnostic) use cases. In Spring, these service
objects, any other business-specific objects, data access objects, etc.
@ -82,7 +82,7 @@
a Spring container (a <classname>WebApplicationContext</classname>) that
contains all of the 'business beans' in one's application.</para>
<para>Onto specifics... all that one need do is to declare a <ulink
<para>On to specifics: all that one need do is to declare a <ulink
url="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/context/ContextLoaderListener.html"><classname>ContextLoaderListener</classname></ulink>
in the standard Java EE servlet <literal>web.xml</literal> file of one's web
application, and add a <literal>contextConfigLocation</literal>
@ -117,7 +117,7 @@
to load. Once the context files are loaded, Spring creates a <ulink
url="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/context/WebApplicationContext.html"><classname>WebApplicationContext</classname></ulink>
object based on the bean definitions and stores it in the
<interface>ServletContext</interface> of one's web application.</para>
<interface>ServletContext</interface> of the web application.</para>
<para>All Java web frameworks are built on top of the Servlet API, and so
one can use the following code snippet to get access to this 'business
@ -141,7 +141,7 @@
<para>Once you have a reference to the
<classname>WebApplicationContext</classname>, you can retrieve beans by
their name or type. Most developers retrieve beans by name, then cast them
their name or type. Most developers retrieve beans by name and then cast them
to one of their implemented interfaces.</para>
<para>Fortunately, most of the frameworks in this section have simpler
@ -209,7 +209,7 @@
<para>The <classname>DelegatingVariableResolver</classname> will first
delegate value lookups to the default resolver of the underlying JSF
implementation, and then to Spring's 'business context'
implementation and then to Spring's 'business context'
<classname>WebApplicationContext</classname>. This allows one to easily
inject dependencies into one's JSF-managed beans.</para>
@ -235,7 +235,7 @@
<para><classname>SpringBeanVariableResolver</classname> is a variant of
<classname>DelegatingVariableResolver</classname>. It delegates to the
Spring's 'business context' <classname>WebApplicationContext</classname>
<emphasis>first</emphasis>, then to the default resolver of the
<emphasis>first</emphasis> and then to the default resolver of the
underlying JSF implementation. This is useful in particular when using
request/session-scoped beans with special Spring resolution rules, e.g.
Spring <interfacename>FactoryBean</interfacename>
@ -541,10 +541,10 @@
<para>The recommended strategy is to use the approach that best suits
your project. Subclassing makes your code more readable, and you know
exactly how your dependencies are resolved. However, using the
<classname>ContextLoaderPlugin</classname> allow you to easily add new
exactly how your dependencies are resolved. In contrast, using the
<classname>ContextLoaderPlugin</classname> allows you to easily add new
dependencies in your context XML file. Either way, Spring provides some
nice options for integrating the two frameworks.</para>
nice options for integrating with Struts.</para>
</section>
</section>
@ -566,8 +566,9 @@
</para>
<para>WebWork is (in the opinion of this author) a very clean, elegant web
framework. Its architecture and key concepts are not only very easy to
understand, it has a rich tag library, nicely decoupled validation, and it
framework. Its architecture and key concepts are very easy to
understand, and the framework also has a rich tag library as well as
nicely decoupled validation. It
is (again, in the opinion of this author) quite easy to be productive in
next to no time at all (the documentation and tutorials are pretty good
too).</para>
@ -577,17 +578,17 @@
IoC container</ulink> to manage Webwork Actions, handle the "wiring" of
business objects, etc. Prior to WebWork version 2.2, WebWork used its own
proprietary IoC container (and provided integration points so that one
could integrate an IoC container such as Springs into the mix). However,
could integrate an IoC container such as Spring's into the mix). However,
as of WebWork version 2.2, the default IoC container that is used within
WebWork <emphasis>is</emphasis> Spring. This is obviously great news if
one is a Spring developer, because it means that one is immediately
familiar with the basics of IoC configuration, idioms and suchlike within
familiar with the basics of IoC configuration, idioms, and suchlike within
WebWork.</para>
<para>Now in the interests of adhering to the DRY (Dont Repeat Yourself)
principle, it would be foolish to writeup the Spring-WebWork integration
<para>Now in the interests of adhering to the DRY (Don't Repeat Yourself)
principle, it would be foolish to document the Spring-WebWork integration
in light of the fact that the WebWork team have already written such a
writeup. Please do consult the <ulink
writeup. Please consult the <ulink
url="http://www.opensymphony.com/webwork/wikidocs/Spring.html">Spring-WebWork
integration page</ulink> on the <ulink
url="http://wiki.opensymphony.com/display/WW/WebWork">WebWork wiki</ulink>
@ -595,11 +596,11 @@
<para>Note that the Spring-WebWork integration code was developed (and
continues to be maintained and improved) by the WebWork developers
themselves, so in the first instance please do refer to the WebWork site
and forums if you are having issues with the integration. Do feel free to
themselves. So please refer first to the WebWork site and forums if you are
having issues with the integration. But feel free to
post comments and queries regarding the Spring-WebWork integration on the
<ulink url="http://forum.springframework.org/forumdisplay.php?f=25">Spring
support forums</ulink> too.</para>
support forums</ulink>, too.</para>
</section>
<section id="tapestry">
@ -643,7 +644,7 @@
</quote>
</para>
<para>The key question then is... how does one supply Tapestry pages with
<para>The key question then is: how does one supply Tapestry pages with
collaborating services? The answer, ideally, is that one would want to
dependency inject those services directly into one's Tapestry pages. In
Tapestry, one can effect this dependency injection by a variety of
@ -745,9 +746,9 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schem
<programlisting language="java">WebApplicationContext appContext = WebApplicationContextUtils.getApplicationContext(
getRequestCycle().getRequestContext().getServlet().getServletContext());
UserService userService = (UserService) appContext.getBean("userService");
<lineannotation>... some code which uses UserService</lineannotation></programlisting>
<lineannotation>// ... some code which uses UserService</lineannotation></programlisting>
<para>This mechanism does work... having said that, it can be made a lot
<para>This mechanism does work. Having said that, it can be made a lot
less verbose by encapsulating most of the functionality in a method in
the base class for the page or component. However, in some respects it
goes against the IoC principle; ideally you would like the page to not
@ -785,7 +786,7 @@ UserService userService = (UserService) appContext.getBean("userService");
<programlisting language="java">package com.whatever.web.xportal;
import ...
// import ...
public class MyEngine extends org.apache.tapestry.engine.BaseEngine {
@ -1042,7 +1043,7 @@ public abstract class Login extends BasePage implements ErrorProperty, PageRende
annotate the appropriate getter methods in order to dependency inject
the Spring-managed <literal>userService</literal> and
<literal>authenticationService</literal> objects (lots of the class
definition has been elided for clarity)...</para>
definition has been elided for clarity).</para>
<programlisting language="java">package com.whatever.web.xportal.pages;
@ -1056,7 +1057,7 @@ public abstract class Login extends BasePage implements ErrorProperty, PageRende
}</programlisting>
<para>We are almost done... all that remains is the HiveMind
<para>We are almost done. All that remains is the HiveMind
configuration that exposes the Spring container stored in the
<interfacename>ServletContext</interfacename> as a HiveMind service;
for example:</para>

Loading…
Cancel
Save