Stripes Java
Stripes Java
Stripes Java
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
Present Technologies 4
Why
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
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" />
@DefaultHandler
@DontValidate
public Resolution main() {
return new ForwardResolution("/WEB-INF/jsp/binding-validation.jsp");
}
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 />
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>
Present Technologies 20
Features - Exception handling
Don’t catch your exceptions
Present Technologies 21
Features - Interceptors
Built-in interceptors
@Before(stages = LifecycleStage.BindingAndValidation)
public void prepareSomeStuff() {
// load data from the DB
}
Present Technologies 22
Features - Interceptors
Custom interceptors
public interface Interceptor {
Resolution intercept(ExecutionContext context) throws Exception;
}
@Intercepts(LifecycleStage.ActionBeanResolution)
public class EJBInterceptor implements Interceptor {
Present Technologies 23
Features - Easy Ajax integration
public class AjaxActionBean extends BaseActionBean {
private List<String> cities = new ArrayList<String>();
<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
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");
}
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