SlideShare a Scribd company logo
1 of 34
Download to read offline
Java Web Development with Stripes




                                Samuel Santos
About me
ā€¢ Senior Java Engineer and Web Advocate at
  Present Technologies
ā€¢ Open source enthusiast
ā€¢ Web standards contributor
ā€¢ Casual blogger




Present Technologies                         2
Agenda
ā€¢   Why
ā€¢   What is it
ā€¢   Goals
ā€¢   Setting up
ā€¢   Features
ā€¢   Extensions
ā€¢   Find more
ā€¢   Q&A
Present Technologies   3
Why


ā€œJava web development doesnā€™t have to suck.ā€
                           Tim Fennell, Stripes author




Present Technologies                                 4
Why

ā€œHave you ever used a framework and felt you
had to do too much work for the framework
compared to what the framework gave you in
return?ā€
                          Freddy Daoud, Stripes Book




Present Technologies                               5
What is it
ā€¢ Stripes is a Model-View-Controller (MVC)
  framework
ā€¢ Stripes is not a ā€œfull-stackā€ framework
ā€¢ Stripes is an action-based framework




Present Technologies                         6
Goals
ā€¢ Make developing web applications in Java
  easy
ā€¢ Provide simple yet powerful solutions to
  common problems
ā€¢ Make the Stripes ramp up time for a new
  developer less than 30 minutes
ā€¢ Make it really easy to extend Stripes, without
  making you configure every last thing
                               From Stripes Homepage

Present Technologies                               7
Setting up
<filter>
    <filter-name>StripesFilter</filter-name>
    <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
    <init-param>
         <param-name>ActionResolver.Packages</param-name>
         <param-value>com.example.javapt09.stripes.action</param-value>
    </init-param>
</filter>
<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<filter-mapping>
    <filter-name>StripesFilter</filter-name>
    <servlet-name>DispatcherServlet</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>



 Present Technologies                                                                     8
Features - Smart binding
 URLs binding


         public class SmartBindingActionBean extends BaseActionBean {
             ...
         }




<s:link beanclass="com.example.javapt09.stripes.action.SmartBindingActionBean">Smart binding</s:link>
<s:link href="${contextPath}/SmartBinding.action">Smart binding</s:link>




  Present Technologies                                                                          9
Features - Smart binding
                                         <s:form beanclass="com.example.javapt09.stripes.action.SmartBindingActionBean">
                                             <p>
                                                 <s:label for="user.firstName" />
                                                 <s:text id="user.firstName" name="user.firstName" />
    Parameters                               </p>
                                             <p>
                                                  <s:label for="user.lastName" />

    And Events                               </p>
                                             <p>
                                                  <s:text id="user.lastName" name="user.lastName" />


                                                  <s:submit name="print" />
                                             </p>
                                         </s:form>
public class SmartBindingActionBean extends BaseActionBean {
    @ValidateNestedProperties({
        @Validate(field = "firstName", required = true, maxlength = 100),
        @Validate(field = "lastName", required = true, maxlength = 100)
    })
    private User user;

    public User getUser() { return user; }
    public void setUser(User user) { this.user = user; }

    @DefaultHandler
    @DontValidate
    public Resolution main() {
        return new ForwardResolution("/WEB-INF/jsp/binding-validation.jsp");
    }

    public Resolution print() {
        getContext().getMessages().add(new LocalizableMessage(
                "com.example.javapt09.stripes.action.SmartBindingActionBean.print.success", user));
        return new RedirectResolution(SmartBindingActionBean.class);
    }
}
      Present Technologies                                                                                        10
Features - Smart binding
Localized buttons and labels
<s:form beanclass="com.example.javapt09.stripes.action.SmartBindingActionBean">
    <p>
        <s:label for="user.firstName" />
        <s:text id="user.firstName" name="user.firstName" />
    </p>
    <p>
        <s:label for="user.lastName" />
        <s:text id="user.lastName" name="user.lastName" />
    </p>
    <p>
        <s:submit name="print" />
    </p>
</s:form>

com.example.javapt09.stripes.action.SmartBindingActionBean.user.firstName=First name
com.example.javapt09.stripes.action.SmartBindingActionBean.user.lastName=Last name
com.example.javapt09.stripes.action.SmartBindingActionBean.print=Print



 Present Technologies                                                             11
Features - Validation
Frequently used @Validate attributes
Attribute              Type       Description
field                  String     Name of nested field to validate.
required               boolean    true indicates a required field.
on                     String[]   Event handlers for which to apply.
minlength              int        Minimum length of input.
maxlength              int        Maximum length of input.
expression             String     EL expression to validate the input.
mask                   String     Regular expression that the input must match.
minvalue               double     Minimum numerical value of input.
maxvalue               double     Maximum numerical value of input.
converter              Class      Type converter to use on the input.

Present Technologies                                                              12
Features - Validation
Automatic maxlength on text inputs
public class SmartBindingActionBean extends BaseActionBean {

   @ValidateNestedProperties({
       @Validate(field = "firstName", required = true, maxlength = 100),
       @Validate(field = "lastName", required = true, maxlength = 100)
   })
   private User user;

    ...
}
<form action="/javapt09/SmartBinding.action" method="post">
    <p>
        <label for="user.firstName">First name</label>
        <input id="user.firstName" maxlength="100" name="user.firstName" type="text" />
    </p>
    <p>
         <label for="user.lastName">Last name</label>
         <input id="user.lastName" maxlength="100" name="user.lastName" type="text" />
    </p>
    <p>
         <input name="print" value="Print" type="submit" />
    </p>
</form>

 Present Technologies                                                                     13
Features - Validation
Custom Validation

@ValidationMethod
public void validate(ValidationErrors errors) {
    if (user.getLastName().equals(user.getFirstName())) {
        errors.add("lastName",
                new SimpleError("First and last name must be different!"));
    }
}




 Present Technologies                                                         14
Features - Validation
Displaying errors and messages
ā€¢ Messages
   <s:messages />

ā€¢ All errors
   <s:errors />

ā€¢ Specific field error
   <s:errors field="user.firstName" />



Present Technologies                     15
Features - Customizable URLs
Clean URLs
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/action/*</url-pattern>
</servlet-mapping>




@UrlBinding("/action/cleanURL/{$event}/{city}")
public class CustomizableURLActionBean extends BaseActionBean {
    private String city;
    public Resolution delete() { ... }
}




Present Technologies                                              16
Features - Layouts
Reusable layout
<%@include file="/WEB-INF/jsp/common/taglibs.jsp" %>
<s:layout-definition>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>${title}</title>
        <link rel="stylesheet" type="text/css" href="${contextPath}/css/style.css" />
    </head>
    <body>
        <div id="header">
            <span class="title">${title}</span>
        </div>
        <div id="body">
            <s:layout-component name="body" />
        </div>
    </body>
</html>
</s:layout-definition>




Present Technologies                                                                    17
Features - Layouts
Using a reusable layout to render a page
<%@include file="/WEB-INF/jsp/common/taglibs.jsp" %>
<s:layout-render name="/WEB-INF/jsp/common/layout-main.jsp"
    title="JavaPT09 - Stripes Ā» Layouts">
    <s:layout-component name="body">
        <p>Main page content...</p>
    </s:layout-component>
</s:layout-render>




Present Technologies                                          18
Features - Layouts
Final result
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>JavaPT09 - Stripes Ā» Layouts</title>
        <link rel="stylesheet" type="text/css" href="/javapt09/css/style.css" />
    </head>
    <body>
        <div id="header">
            <span class="title">JavaPT09 - Stripes Ā» Layouts</span>
        </div>
        <div id="body">
            <p>Main page content...</p>
        </div>
    </body>
</html>




Present Technologies                                                               19
Features - Exception handling
<init-param>
    <param-name>DelegatingExceptionHandler.Packages</param-name>
    <param-value>com.example.javapt09.stripes.exception</param-value>
</init-param>


public class DefaultExceptionHandler implements AutoExceptionHandler {
    public Resolution handle(Exception exception,
            HttpServletRequest request, HttpServletResponse response) {
        // Handle Exception
        return new ForwardResolution(ErrorActionBean.class);
    }

    public Resolution handle(IOException exception,
            HttpServletRequest request, HttpServletResponse response) {
        // Handle IOException
        return new ForwardResolution(ErrorActionBean.class);
    }
}



Present Technologies                                                      20
Features - Exception handling
Donā€™t catch your exceptions

public Resolution handledException() throws IOException {
    throw new IOException("Handled exception");
}

public Resolution unhandledException() throws Exception {
    throw new Exception("Unhandled exception");
}




Present Technologies                                        21
Features - Interceptors
Built-in interceptors
@Before(stages = LifecycleStage.BindingAndValidation)
public void prepareSomeStuff() {
    // load data from the DB
}




Stripes request processing lifecycle stages:
RequestInit             ActionBeanResolution HandlerResolution
BindingAndValidation CustomValidation           EventHandling
ResolutionExecution     RequestComplete


 Present Technologies                                            22
Features - Interceptors
Custom interceptors
public interface Interceptor {
    Resolution intercept(ExecutionContext context) throws Exception;
}


@Intercepts(LifecycleStage.ActionBeanResolution)
public class EJBInterceptor implements Interceptor {

       public Resolution intercept(ExecutionContext context) throws Exception {
           ...
       }

}




    Present Technologies                                                  23
Features - Easy Ajax integration
public class AjaxActionBean extends BaseActionBean {
    private List<String> cities = new ArrayList<String>();

      public Resolution load() {
          return new JavaScriptResolution(cities);
      }
}

<div id="cities"></div>
<script type="text/javascript">
    var client = new XMLHttpRequest();
    client.open("GET", "${contextPath}/Ajax.action?load=");
    client.onreadystatechange = function() {
        if (this.readyState == 4) {
            var cities = eval(client.responseText);
            var citiesList = "";
            for (var i = 0; i < cities.length; i++) {
              citiesList += "<li>" + cities[i] + "</li>";
            }
            document.getElementById("cities").innerHTML = "<ul>" + citiesList + "</ul>";
        }
    }
    client.send(null);
</script>
    Present Technologies                                                         24
Features - File download


public class DownloadActionBean extends BaseActionBean {
    @DefaultHandler
    public Resolution main() throws FileNotFoundException {
        String fileName = "stripes.png";
        String filePath = getContext().getServletContext().getRealPath("/img/" + fileName);
        return new StreamingResolution("image/png",
                new FileInputStream(filePath)).setFilename(fileName);
    }
}




 Present Technologies                                                                  25
Features - File upload
File upload form

<s:form beanclass="com.example.javapt09.stripes.action.UploadActionBean"
    enctype="multipart/form-data">
    <p>
        <s:file name="fileBean" />
    </p>
    <p>
        <s:submit name="upload" />
    </p>
</s:form>




Present Technologies                                                       26
Features - File upload
Saving the file
public class UploadActionBean extends BaseActionBean {
    private FileBean fileBean;
    public FileBean getFileBean() { return fileBean; }
    public void setFileBean(FileBean fileBean) { this.fileBean = fileBean; }

    @DefaultHandler
    public Resolution main() {
        return new ForwardResolution("/WEB-INF/jsp/file-upload.jsp");
    }

    public Resolution upload() throws IOException {
        fileBean.getFileName();
        fileBean.getSize();
        fileBean.getContentType();
        // fileBean.save(new File());

        return new ForwardResolution("/WEB-INF/jsp/file-upload.jsp");
    }
}
Present Technologies                                                           27
Features - Extension/customization
ā€¢ Stripes uses auto-discovery to find extensions
   <init-param>
       <param-name>Extension.Packages</param-name>
       <param-value>com.example.javapt09.stripes.extensions</param-value>
   </init-param>


ā€¢ The specified packages will be scanned for
  extensions like interceptors, formatters, type
  converters, exception handlers, etc
   @Validate(maxlength = 100, converter = EmailTypeConverter.class)
   private String email;




Present Technologies                                                        28
Extensions
ā€¢ Spring integration (built-in)
         http://www.stripesframework.org/display/stripes/Spring
           +with+Stripes
ā€¢ EJB3 integration
         http://code.google.com/p/stripes-ejb3




Present Technologies                                          29
Extensions
ā€¢ Stripes Security (roles based)
         http://www.stripesframework.org/display/stripes/Securi
           ng+Stripes+With+ACLs
ā€¢ Stripes Security (custom authorization)
         http://www.stripesframework.org/display/stripes/Securit
           y+Interceptor+for+custom+authorization




Present Technologies                                           30
Extensions
ā€¢ Stripes-Reload
    Plugin for Stripes 1.5 that reloads modifications
    made to your Action Beans, Type Converters,
    Formatters, and Resource Bundles without having to
    restart your server
         http://www.stripesbook.org/stripes-reload.html




Present Technologies                                      31
Find more
ā€¢ Stripes Framwork
         http://www.stripesframework.org
ā€¢ Stripes Book: Stripes ...and Java Web
  Development Is Fun Again
         http://www.pragprog.com/titles/fdstr




Present Technologies                            32
Q&A




Present Technologies   33
Contacts
ā€¢ Present Technologies
         http://www.present-technologies.com
ā€¢ Blog
         http://www.samaxes.com
ā€¢ Twitter
         http://twitter.com/samaxes




Present Technologies                           34

More Related Content

What's hot

AngularJS for designers and developers
AngularJS for designers and developersAngularJS for designers and developers
AngularJS for designers and developers
Kai Koenig
Ā 
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletongDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
George Nguyen
Ā 
JSP Syntax_1
JSP Syntax_1JSP Syntax_1
JSP Syntax_1
brecke
Ā 
Dependency Management with RequireJS
Dependency Management with RequireJSDependency Management with RequireJS
Dependency Management with RequireJS
Aaronius
Ā 
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
Atlassian
Ā 

What's hot (20)

BPM-1 Introduction to Advanced Workflows
BPM-1 Introduction to Advanced WorkflowsBPM-1 Introduction to Advanced Workflows
BPM-1 Introduction to Advanced Workflows
Ā 
AngularJS for designers and developers
AngularJS for designers and developersAngularJS for designers and developers
AngularJS for designers and developers
Ā 
BPM-3 Advanced Workflow Deep Dive
BPM-3 Advanced Workflow Deep DiveBPM-3 Advanced Workflow Deep Dive
BPM-3 Advanced Workflow Deep Dive
Ā 
Backbone js
Backbone jsBackbone js
Backbone js
Ā 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC
Ā 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" Domino
Ā 
ILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterpriseILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterprise
Ā 
Django Admin: Widgetry & Witchery
Django Admin: Widgetry & WitcheryDjango Admin: Widgetry & Witchery
Django Admin: Widgetry & Witchery
Ā 
JSLab. ŠŠ»ŠµŠŗсŠµŠ¹ Š’Š¾Š»ŠŗŠ¾Š². "React Š½Š° ŠæрŠ°ŠŗтŠøŠŗŠµ"
JSLab. ŠŠ»ŠµŠŗсŠµŠ¹ Š’Š¾Š»ŠŗŠ¾Š². "React Š½Š° ŠæрŠ°ŠŗтŠøŠŗŠµ"JSLab. ŠŠ»ŠµŠŗсŠµŠ¹ Š’Š¾Š»ŠŗŠ¾Š². "React Š½Š° ŠæрŠ°ŠŗтŠøŠŗŠµ"
JSLab. ŠŠ»ŠµŠŗсŠµŠ¹ Š’Š¾Š»ŠŗŠ¾Š². "React Š½Š° ŠæрŠ°ŠŗтŠøŠŗŠµ"
Ā 
Dom selecting & jQuery
Dom selecting & jQueryDom selecting & jQuery
Dom selecting & jQuery
Ā 
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletongDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
Ā 
JSP Syntax_1
JSP Syntax_1JSP Syntax_1
JSP Syntax_1
Ā 
Dependency Management with RequireJS
Dependency Management with RequireJSDependency Management with RequireJS
Dependency Management with RequireJS
Ā 
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom TagsJava Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Ā 
AngularJS On-Ramp
AngularJS On-RampAngularJS On-Ramp
AngularJS On-Ramp
Ā 
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
Ā 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
Ā 
JavaFX ā€“ 10 things I love about you
JavaFX ā€“ 10 things I love about youJavaFX ā€“ 10 things I love about you
JavaFX ā€“ 10 things I love about you
Ā 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
Ā 
Introduction to Vue.js
Introduction to Vue.jsIntroduction to Vue.js
Introduction to Vue.js
Ā 

Similar to Java Web Development with Stripes

ASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin Lau
Spiffy
Ā 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
Ā 
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
Igor Bronovskyy
Ā 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Yehuda Katz
Ā 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
Joao Lucas Santana
Ā 
Step By Step Guide For Buidling Simple Struts App
Step By Step Guide For Buidling Simple Struts AppStep By Step Guide For Buidling Simple Struts App
Step By Step Guide For Buidling Simple Struts App
Syed Shahul
Ā 

Similar to Java Web Development with Stripes (20)

Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortal
Ā 
AngularJS Mobile Warsaw 20-10-2014
AngularJS Mobile Warsaw 20-10-2014AngularJS Mobile Warsaw 20-10-2014
AngularJS Mobile Warsaw 20-10-2014
Ā 
ASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin Lau
Ā 
Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...
Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...
Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...
Ā 
Working with Javascript in Rails
Working with Javascript in RailsWorking with Javascript in Rails
Working with Javascript in Rails
Ā 
Vue js for beginner
Vue js for beginner Vue js for beginner
Vue js for beginner
Ā 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Ā 
Unit 07: Design Patterns and Frameworks (3/3)
Unit 07: Design Patterns and Frameworks (3/3)Unit 07: Design Patterns and Frameworks (3/3)
Unit 07: Design Patterns and Frameworks (3/3)
Ā 
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
Ā 
JS-05-Handlebars.ppt
JS-05-Handlebars.pptJS-05-Handlebars.ppt
JS-05-Handlebars.ppt
Ā 
SharePoint Saturday Atlanta 2015
SharePoint Saturday Atlanta 2015SharePoint Saturday Atlanta 2015
SharePoint Saturday Atlanta 2015
Ā 
Basics of AngularJS
Basics of AngularJSBasics of AngularJS
Basics of AngularJS
Ā 
Django Vs Rails
Django Vs RailsDjango Vs Rails
Django Vs Rails
Ā 
AnkaraJUG Kasım 2012 - PrimeFaces
AnkaraJUG Kasım 2012 - PrimeFacesAnkaraJUG Kasım 2012 - PrimeFaces
AnkaraJUG Kasım 2012 - PrimeFaces
Ā 
4. jsp
4. jsp4. jsp
4. jsp
Ā 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Ā 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Ā 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
Ā 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Ā 
Step By Step Guide For Buidling Simple Struts App
Step By Step Guide For Buidling Simple Struts AppStep By Step Guide For Buidling Simple Struts App
Step By Step Guide For Buidling Simple Struts App
Ā 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(ā˜Žļø+971_581248768%)**%*]'#abortion pills for sale in dubai@
Ā 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
Ā 

Recently uploaded (20)

Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
Ā 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Ā 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
Ā 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Ā 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Ā 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Ā 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Ā 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
Ā 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
Ā 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Ā 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
Ā 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
Ā 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Ā 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Ā 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
Ā 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
Ā 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
Ā 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Ā 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
Ā 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
Ā 

Java Web Development with Stripes

  • 1. Java Web Development with Stripes Samuel Santos
  • 2. About me ā€¢ Senior Java Engineer and Web Advocate at Present Technologies ā€¢ Open source enthusiast ā€¢ Web standards contributor ā€¢ Casual blogger Present Technologies 2
  • 3. Agenda ā€¢ Why ā€¢ What is it ā€¢ Goals ā€¢ Setting up ā€¢ Features ā€¢ Extensions ā€¢ Find more ā€¢ Q&A Present Technologies 3
  • 4. Why ā€œJava web development doesnā€™t have to suck.ā€ Tim Fennell, Stripes author Present Technologies 4
  • 5. Why ā€œHave you ever used a framework and felt you had to do too much work for the framework compared to what the framework gave you in return?ā€ Freddy Daoud, Stripes Book Present Technologies 5
  • 6. What is it ā€¢ Stripes is a Model-View-Controller (MVC) framework ā€¢ Stripes is not a ā€œfull-stackā€ framework ā€¢ Stripes is an action-based framework Present Technologies 6
  • 7. Goals ā€¢ Make developing web applications in Java easy ā€¢ Provide simple yet powerful solutions to common problems ā€¢ Make the Stripes ramp up time for a new developer less than 30 minutes ā€¢ Make it really easy to extend Stripes, without making you configure every last thing From Stripes Homepage Present Technologies 7
  • 8. Setting up <filter> <filter-name>StripesFilter</filter-name> <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class> <init-param> <param-name>ActionResolver.Packages</param-name> <param-value>com.example.javapt09.stripes.action</param-value> </init-param> </filter> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <filter-mapping> <filter-name>StripesFilter</filter-name> <servlet-name>DispatcherServlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> Present Technologies 8
  • 9. Features - Smart binding URLs binding public class SmartBindingActionBean extends BaseActionBean { ... } <s:link beanclass="com.example.javapt09.stripes.action.SmartBindingActionBean">Smart binding</s:link> <s:link href="${contextPath}/SmartBinding.action">Smart binding</s:link> Present Technologies 9
  • 10. Features - Smart binding <s:form beanclass="com.example.javapt09.stripes.action.SmartBindingActionBean"> <p> <s:label for="user.firstName" /> <s:text id="user.firstName" name="user.firstName" /> Parameters </p> <p> <s:label for="user.lastName" /> And Events </p> <p> <s:text id="user.lastName" name="user.lastName" /> <s:submit name="print" /> </p> </s:form> public class SmartBindingActionBean extends BaseActionBean { @ValidateNestedProperties({ @Validate(field = "firstName", required = true, maxlength = 100), @Validate(field = "lastName", required = true, maxlength = 100) }) private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @DefaultHandler @DontValidate public Resolution main() { return new ForwardResolution("/WEB-INF/jsp/binding-validation.jsp"); } public Resolution print() { getContext().getMessages().add(new LocalizableMessage( "com.example.javapt09.stripes.action.SmartBindingActionBean.print.success", user)); return new RedirectResolution(SmartBindingActionBean.class); } } Present Technologies 10
  • 11. Features - Smart binding Localized buttons and labels <s:form beanclass="com.example.javapt09.stripes.action.SmartBindingActionBean"> <p> <s:label for="user.firstName" /> <s:text id="user.firstName" name="user.firstName" /> </p> <p> <s:label for="user.lastName" /> <s:text id="user.lastName" name="user.lastName" /> </p> <p> <s:submit name="print" /> </p> </s:form> com.example.javapt09.stripes.action.SmartBindingActionBean.user.firstName=First name com.example.javapt09.stripes.action.SmartBindingActionBean.user.lastName=Last name com.example.javapt09.stripes.action.SmartBindingActionBean.print=Print Present Technologies 11
  • 12. Features - Validation Frequently used @Validate attributes Attribute Type Description field String Name of nested field to validate. required boolean true indicates a required field. on String[] Event handlers for which to apply. minlength int Minimum length of input. maxlength int Maximum length of input. expression String EL expression to validate the input. mask String Regular expression that the input must match. minvalue double Minimum numerical value of input. maxvalue double Maximum numerical value of input. converter Class Type converter to use on the input. Present Technologies 12
  • 13. Features - Validation Automatic maxlength on text inputs public class SmartBindingActionBean extends BaseActionBean { @ValidateNestedProperties({ @Validate(field = "firstName", required = true, maxlength = 100), @Validate(field = "lastName", required = true, maxlength = 100) }) private User user; ... } <form action="/javapt09/SmartBinding.action" method="post"> <p> <label for="user.firstName">First name</label> <input id="user.firstName" maxlength="100" name="user.firstName" type="text" /> </p> <p> <label for="user.lastName">Last name</label> <input id="user.lastName" maxlength="100" name="user.lastName" type="text" /> </p> <p> <input name="print" value="Print" type="submit" /> </p> </form> Present Technologies 13
  • 14. Features - Validation Custom Validation @ValidationMethod public void validate(ValidationErrors errors) { if (user.getLastName().equals(user.getFirstName())) { errors.add("lastName", new SimpleError("First and last name must be different!")); } } Present Technologies 14
  • 15. Features - Validation Displaying errors and messages ā€¢ Messages <s:messages /> ā€¢ All errors <s:errors /> ā€¢ Specific field error <s:errors field="user.firstName" /> Present Technologies 15
  • 16. Features - Customizable URLs Clean URLs <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/action/*</url-pattern> </servlet-mapping> @UrlBinding("/action/cleanURL/{$event}/{city}") public class CustomizableURLActionBean extends BaseActionBean { private String city; public Resolution delete() { ... } } Present Technologies 16
  • 17. Features - Layouts Reusable layout <%@include file="/WEB-INF/jsp/common/taglibs.jsp" %> <s:layout-definition> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>${title}</title> <link rel="stylesheet" type="text/css" href="${contextPath}/css/style.css" /> </head> <body> <div id="header"> <span class="title">${title}</span> </div> <div id="body"> <s:layout-component name="body" /> </div> </body> </html> </s:layout-definition> Present Technologies 17
  • 18. Features - Layouts Using a reusable layout to render a page <%@include file="/WEB-INF/jsp/common/taglibs.jsp" %> <s:layout-render name="/WEB-INF/jsp/common/layout-main.jsp" title="JavaPT09 - Stripes Ā» Layouts"> <s:layout-component name="body"> <p>Main page content...</p> </s:layout-component> </s:layout-render> Present Technologies 18
  • 19. Features - Layouts Final result <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>JavaPT09 - Stripes Ā» Layouts</title> <link rel="stylesheet" type="text/css" href="/javapt09/css/style.css" /> </head> <body> <div id="header"> <span class="title">JavaPT09 - Stripes Ā» Layouts</span> </div> <div id="body"> <p>Main page content...</p> </div> </body> </html> Present Technologies 19
  • 20. Features - Exception handling <init-param> <param-name>DelegatingExceptionHandler.Packages</param-name> <param-value>com.example.javapt09.stripes.exception</param-value> </init-param> public class DefaultExceptionHandler implements AutoExceptionHandler { public Resolution handle(Exception exception, HttpServletRequest request, HttpServletResponse response) { // Handle Exception return new ForwardResolution(ErrorActionBean.class); } public Resolution handle(IOException exception, HttpServletRequest request, HttpServletResponse response) { // Handle IOException return new ForwardResolution(ErrorActionBean.class); } } Present Technologies 20
  • 21. Features - Exception handling Donā€™t catch your exceptions public Resolution handledException() throws IOException { throw new IOException("Handled exception"); } public Resolution unhandledException() throws Exception { throw new Exception("Unhandled exception"); } Present Technologies 21
  • 22. Features - Interceptors Built-in interceptors @Before(stages = LifecycleStage.BindingAndValidation) public void prepareSomeStuff() { // load data from the DB } Stripes request processing lifecycle stages: RequestInit ActionBeanResolution HandlerResolution BindingAndValidation CustomValidation EventHandling ResolutionExecution RequestComplete Present Technologies 22
  • 23. Features - Interceptors Custom interceptors public interface Interceptor { Resolution intercept(ExecutionContext context) throws Exception; } @Intercepts(LifecycleStage.ActionBeanResolution) public class EJBInterceptor implements Interceptor { public Resolution intercept(ExecutionContext context) throws Exception { ... } } Present Technologies 23
  • 24. Features - Easy Ajax integration public class AjaxActionBean extends BaseActionBean { private List<String> cities = new ArrayList<String>(); public Resolution load() { return new JavaScriptResolution(cities); } } <div id="cities"></div> <script type="text/javascript"> var client = new XMLHttpRequest(); client.open("GET", "${contextPath}/Ajax.action?load="); client.onreadystatechange = function() { if (this.readyState == 4) { var cities = eval(client.responseText); var citiesList = ""; for (var i = 0; i < cities.length; i++) { citiesList += "<li>" + cities[i] + "</li>"; } document.getElementById("cities").innerHTML = "<ul>" + citiesList + "</ul>"; } } client.send(null); </script> Present Technologies 24
  • 25. Features - File download public class DownloadActionBean extends BaseActionBean { @DefaultHandler public Resolution main() throws FileNotFoundException { String fileName = "stripes.png"; String filePath = getContext().getServletContext().getRealPath("/img/" + fileName); return new StreamingResolution("image/png", new FileInputStream(filePath)).setFilename(fileName); } } Present Technologies 25
  • 26. Features - File upload File upload form <s:form beanclass="com.example.javapt09.stripes.action.UploadActionBean" enctype="multipart/form-data"> <p> <s:file name="fileBean" /> </p> <p> <s:submit name="upload" /> </p> </s:form> Present Technologies 26
  • 27. Features - File upload Saving the file public class UploadActionBean extends BaseActionBean { private FileBean fileBean; public FileBean getFileBean() { return fileBean; } public void setFileBean(FileBean fileBean) { this.fileBean = fileBean; } @DefaultHandler public Resolution main() { return new ForwardResolution("/WEB-INF/jsp/file-upload.jsp"); } public Resolution upload() throws IOException { fileBean.getFileName(); fileBean.getSize(); fileBean.getContentType(); // fileBean.save(new File()); return new ForwardResolution("/WEB-INF/jsp/file-upload.jsp"); } } Present Technologies 27
  • 28. Features - Extension/customization ā€¢ Stripes uses auto-discovery to find extensions <init-param> <param-name>Extension.Packages</param-name> <param-value>com.example.javapt09.stripes.extensions</param-value> </init-param> ā€¢ The specified packages will be scanned for extensions like interceptors, formatters, type converters, exception handlers, etc @Validate(maxlength = 100, converter = EmailTypeConverter.class) private String email; Present Technologies 28
  • 29. Extensions ā€¢ Spring integration (built-in) http://www.stripesframework.org/display/stripes/Spring +with+Stripes ā€¢ EJB3 integration http://code.google.com/p/stripes-ejb3 Present Technologies 29
  • 30. Extensions ā€¢ Stripes Security (roles based) http://www.stripesframework.org/display/stripes/Securi ng+Stripes+With+ACLs ā€¢ Stripes Security (custom authorization) http://www.stripesframework.org/display/stripes/Securit y+Interceptor+for+custom+authorization Present Technologies 30
  • 31. Extensions ā€¢ Stripes-Reload Plugin for Stripes 1.5 that reloads modifications made to your Action Beans, Type Converters, Formatters, and Resource Bundles without having to restart your server http://www.stripesbook.org/stripes-reload.html Present Technologies 31
  • 32. Find more ā€¢ Stripes Framwork http://www.stripesframework.org ā€¢ Stripes Book: Stripes ...and Java Web Development Is Fun Again http://www.pragprog.com/titles/fdstr Present Technologies 32
  • 34. Contacts ā€¢ Present Technologies http://www.present-technologies.com ā€¢ Blog http://www.samaxes.com ā€¢ Twitter http://twitter.com/samaxes Present Technologies 34