<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Simon Brown - application tag</title>
  <link>http://www.simonbrown.je/blog/tags/application/</link>
  <description>My thoughts on software development and technology ... now from Jersey in the Channel Islands!</description>
  <language>en</language>
  <copyright>Simon Brown</copyright>
  <lastBuildDate>Wed, 12 Nov 2008 19:24:22 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>What is a software architect?</title>
    <link>http://www.codingthearchitecture.com/2008/04/10/what_is_a_software_architect.html</link>
    
      
        <description>
          &lt;p&gt;
I&#039;ve been talking through the &lt;a href=&#034;http://www.codingthearchitecture.com/2007/07/31/role_profile_for_software_architects.html&#034;&gt;role profile for software architects&lt;/a&gt; recently and I&#039;m going to publish a revised version soon. In the meantime, I thought that it&#039;s worth clarifying exactly who the profile is aimed at. Although there might not be a common definition of &#034;architecture&#034;, there &lt;i&gt;is&lt;/i&gt; agreement that there are &lt;a href=&#034;http://www.codingthearchitecture.com/2007/05/18/is_enterprise_architecture_the_next_step.html&#034;&gt;different scales of architecture&lt;/a&gt;. For example, you might have architecture at an application level, at a software system level or at an enterprise level. 
&lt;/p&gt;

&lt;p&gt;
Put simply; the role profile is aimed at those of us taking responsibility for the architecture of a bespoke software development, which I&#039;ve summarised as follows.
&lt;/p&gt;

&lt;div align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/software-architect-scope.png&#034; alt=&#034;The scope of a software/technical architect&#034; /&gt;
&lt;/div&gt;

&lt;p&gt;
Essentially, the scope of the role is the software &lt;i&gt;and&lt;/i&gt; the infrastructure on which that software runs upon, which my experience suggests is what people mean by &#034;software architect&#034; or &#034;technical architect&#034; (i.e. they are aggregate terms). What do &lt;i&gt;you&lt;/i&gt; think?
&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://www.codingthearchitecture.com/2008/04/10/what_is_a_software_architect.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://www.simonbrown.je/blog/2008/04/10/what_is_a_software_architect.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2008/04/10/what_is_a_software_architect.html</guid>
    <pubDate>Thu, 10 Apr 2008 18:30:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Is Enterprise Architecture the next step?</title>
    <link>http://www.codingthearchitecture.com/2007/05/18/is_enterprise_architecture_the_next_step.html</link>
    
      
        <description>
          &lt;p&gt;
Following on from &lt;a href=&#034;http://www.codingthearchitecture.com/2007/05/16/role_titles_across_the_world.html&#034;&gt;Role titles across the world&lt;/a&gt;, I wanted to present a diagram that I&#039;ve had in my head for a little while but never got around to putting on paper. I think architecture at the application and system level is pretty well defined, with an easily identifiable progression path from the former to the latter. Enterprise architecture, on the other hand, is different and I was always under the impression that this was the next logical step for somebody performing a system architecture role. I&#039;ve recently changed my mind on this and my new view of the world is as follows.
&lt;/p&gt;

&lt;p&gt;
&lt;div align=&#034;center&#034;&gt;
&lt;img src=&#034;http://www.codingthearchitecture.com/images/architecture-scopes.png&#034; alt=&#034;Architecture Scopes&#034; /&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;
I now see enterprise architecture as a mix of technology and business consulting that is performed at quite a high level of abstraction, across organisations or organisational units. Previously, I hadn&#039;t really made the connection that the business and process side of enterprise erchitecture was as important (perhaps more so?) than the technology side. As usual, Wikipedia has a nice entry on &lt;a href=&#034;http://en.wikipedia.org/wiki/Enterprise_architecture&#034;&gt;Enterprise Architecture&lt;/a&gt; if you want to read more about this as a discipline.
&lt;/p&gt;

&lt;p&gt;
So is enterprise architecture the next logical step for somebody doing a system architecture role? Possibly, but it depends on what you want to do. When you include the business consulting aspects in the enterprise architecture mix, you start to see that the skillset required for enterprise architecture differs from both the individual streams that feed it. While I&#039;m unsure whether enterprise architecture is more business consulting or more technical architecture, I *am* sure that it might not be the logical progression for technical architects who (like myself at the moment) want to remain technical. Less of a direct upwards career progression and more of an upwards and over movement with which you &lt;a href=&#034;http://www.codingthearchitecture.com/2007/05/15/you_dont_have_to_give_up_coding.html&#034;&gt;might have to give up coding&lt;/a&gt;. This, of course, raises an interesting question of what *is* next for System Architects that want to remain technical. What are your thoughts?
&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://www.codingthearchitecture.com/2007/05/18/is_enterprise_architecture_the_next_step.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://www.simonbrown.je/blog/2007/05/18/is_enterprise_architecture_the_next_step.html#comments</comments>
    <guid isPermaLink="true">http://www.codingthearchitecture.com/2007/05/18/is_enterprise_architecture_the_next_step.html</guid>
    <pubDate>Fri, 18 May 2007 10:28:13 GMT</pubDate>
  </item>
  
  <item>
    <title>Comparing webapp frameworks : WebWork</title>
    <link>http://weblogs.java.net/blog/simongbrown/archive/2006/03/comparing_webap_10.html</link>
    
      
        <description>
          &lt;p&gt;
Like Struts, &lt;a href=&#034;http://www.opensymphony.com/webwork&#034;&gt;WebWork&lt;/a&gt; is a  framework that is fairly established within the J2EE webapp space although it&#039;s interesting that I&#039;ve only ever come across two types of WebWork users - those that have never heard of it and those that love it. WebWork, like most other frameworks, is designed around the web MVC pattern and uses the command and controller implementation strategy. What&#039;s slightly different about WebWork is that it&#039;s built on top of XWork, a separate framework that provides an implementation of the command pattern that is independent of the Servlet API.
&lt;/p&gt;

&lt;p&gt;
In XWork, actions (or commands, depending on your terminology) implement the &lt;code&gt;com.opensymphony.xwork.Action&lt;/code&gt; interface, which specifies a single zero argument method called &lt;code&gt;execute()&lt;/code&gt;. Since this same interface is used in WebWork, it&#039;s possible to write actions without knowledge that they are even running within the context of a web application. From a testability perspective this is very desirable since it allows you to simply instantiate actions and execute them. Of course, most actions typically tend to operate upon data provided as parameters in the HTTP request and, like &lt;a href=&#034;http://weblogs.java.net/blog/simongbrown/archive/2006/03/comparing_webap_9.html&#034;&gt;Stripes&lt;/a&gt;, WebWork actions declare their dependency on those parameters by providing JavaBeans style properties with the same names. At runtime, WebWork automatically extracts parameters from the HTTP request and injects them into your actions. While you can get access to the Servlet API inside of a WebWork action, WebWork doesn&#039;t force this upon you, leaving that choice to you as the developer.
&lt;/p&gt;

&lt;p&gt;
Right, let&#039;s get on with seeing how a WebWork implementation of the sample application compares to the others. I&#039;m using WebWork 2.1.7 and installing it is a simple matter of copying a few JAR files into the &lt;code&gt;/WEB-INF/lib&lt;/code&gt; directory and adding the front controller component and WebWork tag library into the &lt;code&gt;web.xml&lt;/code&gt; file as follows.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;servlet&amp;gt;
  &amp;lt;servlet-name&amp;gt;webwork&amp;lt;/servlet-name&amp;gt;
  &amp;lt;servlet-class&amp;gt;com.opensymphony.webwork.dispatcher.ServletDispatcher&amp;lt;/servlet-class&amp;gt;
  &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
&amp;lt;/servlet&amp;gt;

&amp;lt;servlet-mapping&amp;gt;
  &amp;lt;servlet-name&amp;gt;webwork&amp;lt;/servlet-name&amp;gt;
  &amp;lt;url-pattern&amp;gt;*.action&amp;lt;/url-pattern&amp;gt;
&amp;lt;/servlet-mapping&amp;gt;

&amp;lt;taglib&amp;gt;
  &amp;lt;taglib-uri&amp;gt;webwork&amp;lt;/taglib-uri&amp;gt;
  &amp;lt;taglib-location&amp;gt;/WEB-INF/lib/webwork-2.1.7.jar&amp;lt;/taglib-location&amp;gt;
&amp;lt;/taglib&amp;gt;&lt;/pre&gt;

&lt;p&gt;
Two additional configuration files that we need are called &lt;code&gt;validators.xml&lt;/code&gt; and &lt;code&gt;xwork.xml&lt;/code&gt;. The first of these defines a number of validator components that can be used by the framework to validate incoming requests through an interceptor. Each action can define it&#039;s own set of specific validation rules based upon the validators configured in the &lt;code&gt;validators.xml&lt;/code&gt; file. Since this is a readonly webapp, we don&#039;t really have any need for validation, but we&#039;ll be coming back to this when we add some user interactivity. For now, we don&#039;t need to declare any validators so the file looks as follows.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;!DOCTYPE validators PUBLIC &#034;-//OpenSymphony Group//XWork Validator 1.0//EN&#034;
    &#034;http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd&#034;&amp;gt; 

&amp;lt;validators&amp;gt; 
&amp;lt;/validators&amp;gt;&lt;/pre&gt;

&lt;p&gt;
The other file (&lt;code&gt;xwork.xml&lt;/code&gt;) defines the actions that our web application will use, along with their outcomes/results and the type of view component that is responsible for rendering those outcomes. If you&#039;ve read &lt;a href=&#034;http://weblogs.java.net/blog/simongbrown/archive/2006/01/comparing_webap_7.html&#034;&gt;Comparing Webapp Frameworks : Struts&lt;/a&gt; or are familiar with Struts, you can think of this as being similar to the &lt;code&gt;struts-config.xml&lt;/code&gt; file. Let&#039;s see this in action by diving into the code.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Home page&lt;/b&gt;&lt;/br /&gt;
The home page presents the user a list of recent blog entries and with WebWork, the code that finds these blog entries get wrappeds up inside an XWork action as follows.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;package action;

import com.opensymphony.xwork.ActionSupport;
import domain.Blog;
import domain.BlogService;

/**
 * Action responsible for finding blog entries, ready to be displayed.
 *
 * @author    Simon Brown
 */
public class ViewBlogEntriesAction extends ActionSupport {

  /** the blog that owns the blog entries */
  private Blog blog;

  /**
   * Performs the processing associated with this action.
   *
   * @return  a String defining the outcome of this action
   */
  public String execute() throws Exception {

    BlogService blogService = new BlogService();
    this.blog = blogService.getBlog();

    return SUCCESS;
  }

  /**
   * Gets the blog that this action is operating upon.
   *
   * @return  a Blog instance
   */
  public Blog getBlog() {
    return blog;
  }

}&lt;/pre&gt;

&lt;p&gt;
This implementation is very straightforward, just looking up the &lt;code&gt;Blog&lt;/code&gt; instance and returning the predefined &lt;code&gt;SUCCESS&lt;/code&gt; outcome. Notice here that the &lt;code&gt;Blog&lt;/code&gt; instance isn&#039;t inserted into the HTTP request. Instead it&#039;s assigned to an instance variable and we&#039;ll be seeing shortly how exactly this is used in the JSP page representing the view. Speaking of which, how does the &lt;code&gt;SUCCESS&lt;/code&gt; outcome get mapped to that JSP? Here&#039;s where the &lt;code&gt;xwork.xml&lt;/code&gt; file fits in.

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;!DOCTYPE xwork PUBLIC &#034;-//OpenSymphony Group//XWork 1.0//EN&#034; 
  &#034;http://www.opensymphony.com/xwork/xwork-1.0.dtd&#034;&amp;gt;

&amp;lt;xwork&amp;gt;
  &amp;lt;include file=&#034;webwork-default.xml&#034; /&amp;gt;

  &amp;lt;package name=&#034;default&#034; extends=&#034;webwork-default&#034;&amp;gt;

    &amp;lt;default-interceptor-ref name=&#034;defaultStack&#034; /&amp;gt;

    &amp;lt;action name=&#034;viewBlogEntries&#034; class=&#034;action.ViewBlogEntriesAction&#034;&amp;gt;
        &amp;lt;result name=&#034;success&#034; type=&#034;dispatcher&#034;&amp;gt;viewBlogEntries.jsp&amp;lt;/result&amp;gt;
    &amp;lt;/action&amp;gt;

  &amp;lt;/package&amp;gt;
&amp;lt;/xwork&amp;gt;&lt;/pre&gt;

&lt;p&gt;
Here, an action called &lt;code&gt;viewBlogEntries&lt;/code&gt; is defined (which maps onto a URI of &lt;code&gt;/viewBlogEntries.action&lt;/code&gt;) and given the fully qualified name of the class that implements the action. In addition to this, the possible outcomes of the action are defined, mapping a simple string value onto the name of the JSP page that is responsible for rendering that particular outcome. The value of the &lt;code&gt;type&lt;/code&gt; attribute instructs WebWork to use the Servlet request dispatcher and, as we&#039;ll see in the next blog entry, there are some other possible values that allow you to use alternative view technologies. So, what does the JSP page look like? Well it&#039;s pretty similar to the previous versions although I&#039;ve chosen to show the WebWork tag library in use. It is also possible to use a pure JSP/JSTL combination.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;%@ page contentType=&#034;text/html;charset=UTF-8&#034; %&amp;gt;
&amp;lt;%@ taglib uri=&#034;webwork&#034; prefix=&#034;ww&#034; %&amp;gt;
&amp;lt;%@ taglib uri=&#034;http://java.sun.com/jstl/fmt_rt&#034; prefix=&#034;fmt&#034; %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC &#034;-//W3C//DTD XHTML 1.0 Transitional//EN&#034;
  &#034;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#034;&amp;gt;
&amp;lt;html xmlns=&#034;http://www.w3.org/1999/xhtml&#034;&amp;gt;

  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;ww:property value=&#034;blog.name&#034; /&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&#034;stylesheet&#034; href=&#034;screen.css&#034; type=&#034;text/css&#034; /&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
    &amp;lt;div id=&#034;container&#034;&amp;gt;
      &amp;lt;h1&amp;gt;&amp;lt;ww:property value=&#034;blog.name&#034; /&amp;gt;&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;&amp;lt;ww:property value=&#034;blog.description&#034; /&amp;gt;&amp;lt;/h2&amp;gt;

      &amp;lt;ww:iterator id=&#034;blogEntry&#034; value=&#034;blog.blogEntries&#034;&amp;gt;
        &amp;lt;div class=&#034;blogEntry&#034;&amp;gt;
          &amp;lt;h3&amp;gt;&amp;lt;ww:property value=&#034;title&#034;/&amp;gt;&amp;lt;/h3&amp;gt;

          &amp;lt;ww:if test=&#034;excerpt != null&#034;&amp;gt;
            &amp;lt;ww:property value=&#034;excerpt&#034;/&amp;gt;
            &amp;lt;p&amp;gt;
            &amp;lt;a href=&#034;&amp;lt;ww:url value=&#034;&#039;viewBlogEntry.action&#039;&#034;&amp;gt;
              &amp;lt;ww:param name=&#034;&#039;id&#039;&#034; value=&#034;id&#034;/&amp;gt;
            &amp;lt;/ww:url&amp;gt;&#034;&amp;gt;Read more&amp;lt;/a&amp;gt;
            &amp;lt;/p&amp;gt;
          &amp;lt;/ww:if&amp;gt;
          &amp;lt;ww:else&amp;gt;
            &amp;lt;ww:property value=&#034;body&#034;/&amp;gt;
          &amp;lt;/ww:else&amp;gt;

          &amp;lt;p&amp;gt;
            Posted on &amp;lt;ww:property value=&#034;date&#034; /&amp;gt;
          &amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/ww:iterator&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;
If you&#039;re familiar with something like the Struts bean/logic tags or JSTL, you&#039;ll probably pick up the WebWork tags pretty quickly. &lt;code&gt;ww:property&lt;/code&gt; outputs the value of the named property, &lt;code&gt;ww:if&lt;/code&gt; lets you perform conditional logic and &lt;code&gt;ww:iterator&lt;/code&gt; provides a simple looping mechanism. You may be wondering exactly where the &lt;code&gt;blog&lt;/code&gt; object comes from since we never injected it into the HTTP request or the JSP page. Behind the scenes, WebWork uses something called a Value Stack to maintain references to objects and make them available within the various supported view technologies. You can think of the value stack as a collection of objects, and one of those objects is the action that was responsible for dispatching us to the page. Accessing objects within the stack is achieved using a language called OGNL (the &lt;a href=&#034;http://www.ognl.org/&#034;&gt;Object Graph Navigation Language&lt;/a&gt;). During the dispatching process, the action becomes the &#034;root&#034; node, meaning you can easily access any properties of the action with a simple &lt;code&gt;object.property&lt;/code&gt; syntax. Something worth pointing out is that when you use the &lt;code&gt;ww:iterate&lt;/code&gt; tag, the &#034;current object&#034; in the value stack changes to reflect the current object exposed during iteration, but you can get back to any object in the stack by prefixing the expression with the # character.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Blog entry detail page&lt;/b&gt;&lt;br /&gt;
At a high level, that&#039;s pretty much it so it won&#039;t surprise you that the blog entry detail page is very similar. First the action class.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;package action;

import com.opensymphony.xwork.ActionSupport;
import domain.Blog;
import domain.BlogEntry;
import domain.BlogService;

/**
 * Responsible for finding a specific blog entry.
 *
 * @author    Simon Brown
 */
public class ViewBlogEntryAction extends ActionSupport {

  /** the ID of the blog entry to display */
  private String id;

  /** the blog that owns the blog entries */
  private Blog blog;

  /** the blog entry to be displayed */
  private BlogEntry blogEntry;

  /**
   * Performs the processing associated with this action.
   *
   * @return  a String defining the outcome of this action
   */
  public String execute() throws Exception {
    BlogService blogService = new BlogService();
    blog = blogService.getBlog();
    blogEntry = blog.getBlogEntry(id);

    if (blogEntry == null) {
      return &#034;notfound&#034;;
    } else {
      return SUCCESS;
    }
  }

  /**
   * Setter for the id property.
   *
   * @param id    a String
   */
  public void setId(String id) {
    this.id = id;
  }

  /**
   * Gets the blog that this action is operating upon.
   *
   * @return  a Blog instance
   */
  public Blog getBlog() {
    return blog;
  }

  /**
   * Gets the blog entry to be displayed.
   *
   * @return  a BlogEntry instance
   */
  public BlogEntry getBlogEntry() {
    return blogEntry;
  }

}&lt;/pre&gt;

&lt;p&gt;
Next up is the fragment of XML that needs to be inserted into the &lt;code&gt;xwork.xml&lt;/code&gt; file to register the action and define its outcomes.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;    &amp;lt;action name=&#034;viewBlogEntry&#034; class=&#034;action.ViewBlogEntryAction&#034;&amp;gt;
      &amp;lt;result name=&#034;success&#034; type=&#034;dispatcher&#034;&amp;gt;viewBlogEntry.jsp&amp;lt;/result&amp;gt;
      &amp;lt;result name=&#034;notfound&#034; type=&#034;dispatcher&#034;&amp;gt;404.jsp&amp;lt;/result&amp;gt;
    &amp;lt;/action&amp;gt;&lt;/pre&gt;

&lt;p&gt;
And finally is the JSP page itself.
&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;%@ page contentType=&#034;text/html;charset=UTF-8&#034; %&amp;gt;
&amp;lt;%@ taglib uri=&#034;webwork&#034; prefix=&#034;ww&#034; %&amp;gt;
&amp;lt;%@ taglib uri=&#034;http://java.sun.com/jstl/fmt_rt&#034; prefix=&#034;fmt&#034; %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC &#034;-//W3C//DTD XHTML 1.0 Transitional//EN&#034;
  &#034;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#034;&amp;gt;
&amp;lt;html xmlns=&#034;http://www.w3.org/1999/xhtml&#034;&amp;gt;

  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;ww:property value=&#034;blogEntry.title&#034; /&amp;gt; : &amp;lt;ww:property value=&#034;blog.name&#034; /&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&#034;stylesheet&#034; href=&#034;screen.css&#034; type=&#034;text/css&#034; /&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
    &amp;lt;div id=&#034;container&#034;&amp;gt;
      &amp;lt;h1&amp;gt;&amp;lt;ww:property value=&#034;blog.name&#034; /&amp;gt;&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;&amp;lt;ww:property value=&#034;blog.description&#034; /&amp;gt;&amp;lt;/h2&amp;gt;

      &amp;lt;div class=&#034;blogEntry&#034;&amp;gt;
        &amp;lt;h3&amp;gt;&amp;lt;ww:property value=&#034;blogEntry.title&#034; /&amp;gt;&amp;lt;/h3&amp;gt;

        &amp;lt;ww:property value=&#034;blogEntry.body&#034; /&amp;gt;

        &amp;lt;p&amp;gt;
        Posted on &amp;lt;ww:property value=&#034;blogEntry.date&#034; /&amp;gt;
        &amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;
&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;
Where actions in frameworks like Struts only have responsibility for the business logic associated with processing a request, in WebWork (and Stripes) those actions also act as custodians for the data used in processing the request. Incoming data on the request gets automatically mapped onto JavaBean properties on the action class, which can subsequently be accessed and displayed in the various view technologies. If you&#039;re not used to this approach, it &lt;i&gt;can&lt;/i&gt; seem a little odd at first. However, it doesn&#039;t take very long to get used to and having both the logic and data in the same place proves very useful to support a hierarchy of similar actions. All in all, WebWork is a very sophisticated web application framework that lets you build easily testable actions and provides a way for you to use multiple view technologies. In the next comparison, we&#039;ll take a break from JSP to look at another WebWork implementation that uses Velocity.
&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://weblogs.java.net/blog/simongbrown/archive/2006/03/comparing_webap_10.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>Java</category>
    
    <comments>http://www.simonbrown.je/blog/2006/03/24/comparing_webapp_frameworks_webwork.html#comments</comments>
    <guid isPermaLink="true">http://weblogs.java.net/blog/simongbrown/archive/2006/03/comparing_webap_10.html</guid>
    <pubDate>Fri, 24 Mar 2006 23:03:44 GMT</pubDate>
  </item>
  
  </channel>
</rss>
