This document contains an agenda and slides for a presentation titled "Secrets of the GWT" about Google Web Toolkit (GWT). The presentation covers topics such as why to use GWT for rich web apps, GWT quickstarts, developer tools, GWT performance, and building with GWT 2.12. It discusses how GWT compiles Java code to JavaScript to create browser-compatible web apps without plugins, and allows catching errors at compile time for improved productivity.
GWT Overview And Feature Preview - SV Web JUG - June 16 2009Fred Sauer
Overview of Google Web Toolkit (GWT) and GWT 2.0 Feature Preview, presented at the Silicon Valley Web Java User Group on June 16 2009 at the Googleplex in Mountain View, CA
Talk at ACCU2011 Conference.
http://accu.org/index.php/conferences/accu_conference_2011/accu2011_sessions
Gwt offer you an easy and agile way to create your complex ajax application in a tdd fashion. The slides shows also some real code on how to accomplish this.
GWT Overview And Feature Preview - SV Web JUG - June 16 2009Fred Sauer
Overview of Google Web Toolkit (GWT) and GWT 2.0 Feature Preview, presented at the Silicon Valley Web Java User Group on June 16 2009 at the Googleplex in Mountain View, CA
Talk at ACCU2011 Conference.
http://accu.org/index.php/conferences/accu_conference_2011/accu2011_sessions
Gwt offer you an easy and agile way to create your complex ajax application in a tdd fashion. The slides shows also some real code on how to accomplish this.
AppFuse is an open source project/application that uses best-of-breed Java open source tools to help you develop web applications quickly and efficiently. Not only does it provide documentation on how to develop light-weight POJO-based applications, it includes features that many applications need out-of-the-box: authentication and authorization, remember me, password hint, skinnability, file upload, Ajax libraries, signup and SSL switching. This is one of the main features in AppFuse that separates it from the other "CRUD Generation" frameworks like Ruby on Rails, Trails and Grails. AppFuse is already an application when you start using it, which means code examples are already in your project. Furthermore, because features already exist, the amount of boiler-plate code that most projects need will be eliminated.
In this session, you will learn Seven Simple Reasons to Use AppFuse. If you don't use it to start your own projects, hopefully you will see that it provides much of the boiler-plate code that can be used in Java-based web applications. Since it's Apache Licensed, you're more than welcome to copy/paste any code from it into your own applications.
Also see article published at:
http://www.ibm.com/developerworks/java/library/j-appfuse/index.html
Are you tired of spending hours trying to reproduce and diagnose bugs? Do you have a hard time getting testers and developers to talk to each other? Is it difficult to determine which tests are most important to run after you produce a new build? Software testing is perhaps the #1 area of investment for the application lifecycle management capabilities of Microsoft Visual Studio 2010. In this session, we will introduce the software testing capabilities offered by Visual Studio 2010, which are covered comprehensively in the respective sessions. Given that you want to deliver high quality code, when you drive your entire software development lifecycle with tests – you will dramatically improve overall quality.
Building complex browser-based applications in Java 8 (GWT in 2016?)
The presentation contains a lot of references (link icons) but unfortunatelly, SlideShare imported the presentation in 90% correct. For the fully working presentation please consider using the link below: https://docs.google.com/presentation/d/1sDoNivyEb2lR6GMrmXsepO6fOR0QsYua7m-R8RR4DC4/edit?usp=sharing
The Google Drive presentation is also the most current one (occasionally updated).
A presentation I delivered to the Richmond JUG on the evolution of HTML through XHTML to HTML5 and some of the technologies that support implementation now, before a specification is reached by the WHATWG/W3C
Slide deck for a presentation during a JavaScript meetup in Atlanta, GA.
This is an intro into titanium with a twist being that I focused on explaining some of the power titanium gives developers by allowing them to easily create their own UI versus using native graphics.
Tools needed to build a Continuous delivery pipeline. Most tools are generic and can be used regardless of language, some are specific for Java/JVM.
http://2014.itakeunconf.com/
Taking Your GWT App to Tablets with GXT 4.0David Chandler
Sencha GXT builds on the open source GWT compiler to enable Java developers to build complex desktop-like user interfaces that run in the browser. In GXT 4.0, the core widgets have been updated to include touch functionality such as draggable borders, tree expand / collapse, LiveGrid scrolling, and long press to hover. In addition, you can add new gesture recognizers such as pinch and rotate to your apps. In this presentation, we look at the ins and outs of JavaScript touch event handling for GWT developers, touch support in GXT 4.0 widgets, how to eliminate the 300ms click delay in mobile browsers, and how to work with GXT’s new gesture recognizers. In addition, we look at some of the lessons learned by the GXT team while building GXT 4.0 and demo some debugging strategies for GWT apps on touch devices.
StORM: a lightweight ORM for Android SQLiteDavid Chandler
Android’s bundled SQLite database is powerful, but requires a lot of hand-coded SQL to get started. Using an ORM can simplify database development for many applications, and the Android ecosystem already has several to choose from. stORM is a lightweight DAO generator that aims for a streamlined developer experience (only two annotations required) and solid performance (preferring code generation over reflection). stORM is extensible, minimally intrusive, and offers built-in CSV backup / restore capabilities to facilitate database version upgrades. Along with stORM itself, Chandler presents techniques for writing and debugging an Android annotation processor that can be used with Eclipse, IntelliJ, or Android Studio.
AppFuse is an open source project/application that uses best-of-breed Java open source tools to help you develop web applications quickly and efficiently. Not only does it provide documentation on how to develop light-weight POJO-based applications, it includes features that many applications need out-of-the-box: authentication and authorization, remember me, password hint, skinnability, file upload, Ajax libraries, signup and SSL switching. This is one of the main features in AppFuse that separates it from the other "CRUD Generation" frameworks like Ruby on Rails, Trails and Grails. AppFuse is already an application when you start using it, which means code examples are already in your project. Furthermore, because features already exist, the amount of boiler-plate code that most projects need will be eliminated.
In this session, you will learn Seven Simple Reasons to Use AppFuse. If you don't use it to start your own projects, hopefully you will see that it provides much of the boiler-plate code that can be used in Java-based web applications. Since it's Apache Licensed, you're more than welcome to copy/paste any code from it into your own applications.
Also see article published at:
http://www.ibm.com/developerworks/java/library/j-appfuse/index.html
Are you tired of spending hours trying to reproduce and diagnose bugs? Do you have a hard time getting testers and developers to talk to each other? Is it difficult to determine which tests are most important to run after you produce a new build? Software testing is perhaps the #1 area of investment for the application lifecycle management capabilities of Microsoft Visual Studio 2010. In this session, we will introduce the software testing capabilities offered by Visual Studio 2010, which are covered comprehensively in the respective sessions. Given that you want to deliver high quality code, when you drive your entire software development lifecycle with tests – you will dramatically improve overall quality.
Building complex browser-based applications in Java 8 (GWT in 2016?)
The presentation contains a lot of references (link icons) but unfortunatelly, SlideShare imported the presentation in 90% correct. For the fully working presentation please consider using the link below: https://docs.google.com/presentation/d/1sDoNivyEb2lR6GMrmXsepO6fOR0QsYua7m-R8RR4DC4/edit?usp=sharing
The Google Drive presentation is also the most current one (occasionally updated).
A presentation I delivered to the Richmond JUG on the evolution of HTML through XHTML to HTML5 and some of the technologies that support implementation now, before a specification is reached by the WHATWG/W3C
Slide deck for a presentation during a JavaScript meetup in Atlanta, GA.
This is an intro into titanium with a twist being that I focused on explaining some of the power titanium gives developers by allowing them to easily create their own UI versus using native graphics.
Tools needed to build a Continuous delivery pipeline. Most tools are generic and can be used regardless of language, some are specific for Java/JVM.
http://2014.itakeunconf.com/
Taking Your GWT App to Tablets with GXT 4.0David Chandler
Sencha GXT builds on the open source GWT compiler to enable Java developers to build complex desktop-like user interfaces that run in the browser. In GXT 4.0, the core widgets have been updated to include touch functionality such as draggable borders, tree expand / collapse, LiveGrid scrolling, and long press to hover. In addition, you can add new gesture recognizers such as pinch and rotate to your apps. In this presentation, we look at the ins and outs of JavaScript touch event handling for GWT developers, touch support in GXT 4.0 widgets, how to eliminate the 300ms click delay in mobile browsers, and how to work with GXT’s new gesture recognizers. In addition, we look at some of the lessons learned by the GXT team while building GXT 4.0 and demo some debugging strategies for GWT apps on touch devices.
StORM: a lightweight ORM for Android SQLiteDavid Chandler
Android’s bundled SQLite database is powerful, but requires a lot of hand-coded SQL to get started. Using an ORM can simplify database development for many applications, and the Android ecosystem already has several to choose from. stORM is a lightweight DAO generator that aims for a streamlined developer experience (only two annotations required) and solid performance (preferring code generation over reflection). stORM is extensible, minimally intrusive, and offers built-in CSV backup / restore capabilities to facilitate database version upgrades. Along with stORM itself, Chandler presents techniques for writing and debugging an Android annotation processor that can be used with Eclipse, IntelliJ, or Android Studio.
Presentation from GWT.create 2015 on how to easily build a REST API that can be consumed via GWT or native mobile clients. Presentation video here: http://gwtcreate.com/videos/#rpc-jersey-resty-gwt
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
State of ICS and IoT Cyber Threat Landscape Report 2024 previewPrayukth K V
The IoT and OT threat landscape report has been prepared by the Threat Research Team at Sectrio using data from Sectrio, cyber threat intelligence farming facilities spread across over 85 cities around the world. In addition, Sectrio also runs AI-based advanced threat and payload engagement facilities that serve as sinks to attract and engage sophisticated threat actors, and newer malware including new variants and latent threats that are at an earlier stage of development.
The latest edition of the OT/ICS and IoT security Threat Landscape Report 2024 also covers:
State of global ICS asset and network exposure
Sectoral targets and attacks as well as the cost of ransom
Global APT activity, AI usage, actor and tactic profiles, and implications
Rise in volumes of AI-powered cyberattacks
Major cyber events in 2024
Malware and malicious payload trends
Cyberattack types and targets
Vulnerability exploit attempts on CVEs
Attacks on counties – USA
Expansion of bot farms – how, where, and why
In-depth analysis of the cyber threat landscape across North America, South America, Europe, APAC, and the Middle East
Why are attacks on smart factories rising?
Cyber risk predictions
Axis of attacks – Europe
Systemic attacks in the Middle East
Download the full report from here:
https://sectrio.com/resources/ot-threat-landscape-reports/sectrio-releases-ot-ics-and-iot-security-threat-landscape-report-2024/
"Impact of front-end architecture on development cost", Viktor TurskyiFwdays
I have heard many times that architecture is not important for the front-end. Also, many times I have seen how developers implement features on the front-end just following the standard rules for a framework and think that this is enough to successfully launch the project, and then the project fails. How to prevent this and what approach to choose? I have launched dozens of complex projects and during the talk we will analyze which approaches have worked for me and which have not.
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
Search and Society: Reimagining Information Access for Radical FuturesBhaskar Mitra
The field of Information retrieval (IR) is currently undergoing a transformative shift, at least partly due to the emerging applications of generative AI to information access. In this talk, we will deliberate on the sociotechnical implications of generative AI for information access. We will argue that there is both a critical necessity and an exciting opportunity for the IR community to re-center our research agendas on societal needs while dismantling the artificial separation between the work on fairness, accountability, transparency, and ethics in IR and the rest of IR research. Instead of adopting a reactionary strategy of trying to mitigate potential social harms from emerging technologies, the community should aim to proactively set the research agenda for the kinds of systems we should build inspired by diverse explicitly stated sociotechnical imaginaries. The sociotechnical imaginaries that underpin the design and development of information access technologies needs to be explicitly articulated, and we need to develop theories of change in context of these diverse perspectives. Our guiding future imaginaries must be informed by other academic fields, such as democratic theory and critical theory, and should be co-developed with social science scholars, legal scholars, civil rights and social justice activists, and artists, among others.
UiPath Test Automation using UiPath Test Suite series, part 3DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 3. In this session, we will cover desktop automation along with UI automation.
Topics covered:
UI automation Introduction,
UI automation Sample
Desktop automation flow
Pradeep Chinnala, Senior Consultant Automation Developer @WonderBotz and UiPath MVP
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
GraphRAG is All You need? LLM & Knowledge GraphGuy Korland
Guy Korland, CEO and Co-founder of FalkorDB, will review two articles on the integration of language models with knowledge graphs.
1. Unifying Large Language Models and Knowledge Graphs: A Roadmap.
https://arxiv.org/abs/2306.08302
2. Microsoft Research's GraphRAG paper and a review paper on various uses of knowledge graphs:
https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
10. Eating our own dogfood
+= AdSense, Maps, Docs, Groups...
10
Monday, March 14, 2011 10
11. Rich ecosystem
www.gwtmarketplace.com
Monday, March 14, 2011 11
12. More ecosystem
Util: GIN, gwt-dnd, gwt-fx, gwt-comet, ...
Widgets: EXT-GWT, Smart-GWT, ...
Frameworks: Vaadin!
Monday, March 14, 2011 12
13. 4+ years in review
May 2006 GWT 1.0 Launch at JavaOne
… …
Aug 2008 GWT 1.5 Java 5 language support
Apr 2009 GWT 1.7 Dedicated IE8 support
Fall 2009 GWT 2.0 UIBinder (XML template), runAsync()
Oct 2010 GWT 2.1 MVP, RequestFactory, Spring Roo
13
Monday, March 14, 2011 13
14. GWT Quickstart
> svn checkout https://google-web-toolkit.googlecode.com/
svn/trunk/samples/expenses expenses
> cd expenses/src/main/webapp
> mvn -f ../../../pom.xml gwt:run (dev mode)
(note: most projects can use mvn gwt:run in the dir containing pom.xml--this
one is special because it loads test data from a .txt file in src/main/webapp)
1.Browse to http://127.0.0.1:8888/LoadExpensesDB.html?
gwt.codesvr=127.0.0.1:9997
2.Click Generate Data button
3.Browse to Expenses.html to run the app
To create an Eclipse project:
1.Install Sonatype m2eclipse and m2extras
2.File | Import | Existing maven project, select expenses/
pom.xml
Monday, March 14, 2011 14
15. GWT delivers...
Productivity for developers
- Language, IDEs, tools,
libraries
- People, ecosystem
Performance for users
- 'Perfect' caching
- Whole program optimization
15
Monday, March 14, 2011 15
16. Developing with GWT
Develop
- Google Plugin for Eclipse, GWT Designer, STS / Roo
Debug
- In Eclipse with dev mode browser plugin
Optimize
- SpeedTracer for GWT, App Engine, Spring Insight
Deploy
- Standard WAR or one-button push to App Engine
Monday, March 14, 2011 16
18. Google Plugin for Eclipse
Easiest way to get latest GWT, GAE SDKs
Debug / Run / Optimize / Deploy
Wizards (new module, entry point, ClientBundle,
UiBinder)
Quick fixes (auto-create RPC Async interface)
Run As | GWT JUnit Test
Maven integration via m2eclipse plugin
Monday, March 14, 2011 18
34. Deferred binding
Firefox Webkit (Safari) Opera IE
Typical portable 2876 ms 1276 ms 2053 ms 4078 ms
setInnerText()
textContent=... - 908 ms 1386 ms -
innerText=... 2477 ms 918 ms 1520 ms 2469 ms
DOM manipulation 7148 ms 1997 ms 4836 ms 14800 ms
Improvement 14% 29% 32% 39%
34
Monday, March 14, 2011 34
35. GWT compiler optimization
“The fastest code is that which does not run.”
Joel Webber
GWT co-creator
Monday, March 14, 2011 35
36. GWT compiler optimization
Does all the stuff you’d do by hand in a tight JS app
- Shrinking (obfuscation)
- Modularization (pay only for what you use)
- Dead code removal
- Method inlining
…but automated and even tighter
Developer-guided code splitting (runAsync)
Monday, March 14, 2011 36
37. What’s new in 2.2?
Integration with Spring / Roo
SafeHTML wrappers
GPE: Maven support, integration GWT Designer
Application framework
- RequestFactory
- Activities and Places
Cell Widgets and Editor framework
Monday, March 14, 2011 37
38. Four flavors of RPC
1. RequestBuilder + JSONParser (see RESTY-GWT)
2. RequestBuilder + XMLParser
3. GWT-RPC (easiest)
4. RequestFactory (new in 2.1)
Monday, March 14, 2011 38
39. GWT-RPC
@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
String greetServer(String name) throws IllegalArgumentException;
}
public interface GreetingServiceAsync {
void greetServer(String input, AsyncCallback<String> callback)
throws IllegalArgumentException;
}
public class GreetingServiceImpl extends RemoteServiceServlet implements
GreetingService
{
public String greetServer(String input) throws IllegalArgumentException {
...
}
}
Monday, March 14, 2011 39
40. Simple, powerful GWT-RPC
Send / receive Plain Old Java Objects (POJO)
- Easy: interface, async, & implementation
- Versioned to help keep client & server in sync
- Even smaller than JSON
- Supports polymorphism
- No JavaScript hijacking risk (JSON attack)
- Easy to find all calls to given service in IDE
Monday, March 14, 2011 40
41. GWT 2.1 RequestFactory
Newer alternative to GWT-RPC
Designed for data-oriented services
- Higher level of abstraction than GWT-RPC
- Foundation for future caching / batching
Even faster than GWT-RPC
- JSON-based == very fast (no serialization /
deserialization required)
- Tracks changes on the client and sends only diffs
Monday, March 14, 2011 41
42. RequestFactory
The entity / DTO problem
EntityProxy / ValueProxy
Service stub interfaces extend RequestContext
AppRequestFactory extends RequestFactory
GWT.create(MyAppRequestFactory.class)
Monday, March 14, 2011 42
43. EntityProxy
@Entity
public class ItemList extends DatastoreObject
{
private String name;
private Key<AppUser> owner;
private ListType listType;
@Embedded
private List<ListItem> items; // value type
...
}
@ProxyFor(ItemList.class)
public interface ItemListProxy extends DatastoreObjectProxy
{
// TODO enums work!
public enum ListType {NOTES, TODO}
String getName();
void setName(String name);
List<ListItemProxy> getItems();
AppUserProxy getOwner(); // NOT Key
...
}
Monday, March 14, 2011 43
44. DatastoreObject
package com.listwidget.domain;
public class DatastoreObject
{
@Id
private Long id;
private Integer version = 0;
@PrePersist
void onPersist()
{
this.version++;
}
...
}
package com.listwidget.shared.proxy;
public interface DatastoreObjectProxy extends EntityProxy
{
Long getId();
Integer getVersion();
}
Monday, March 14, 2011 44
45. ValueProxy
public class ListItem // POJO
{
private String itemText;
private Date dateCreated;
public Date getDateCreated()
{
return dateCreated;
}
}
@ProxyFor(value = ListItem.class)
public interface ListItemProxy extends ValueProxy
{
String getItemText();
void setItemText(String itemText);
Date getDateCreated();
}
Monday, March 14, 2011 45
46. Making a RequestFactory
public interface ListwidgetRequestFactory extends RequestFactory
{
@Service(value = ItemListDao.class, locator = DaoServiceLocator.class)
interface ItemListRequestContext extends RequestContext
{
Request<List<ItemListProxy>> listAll();
Request<Void> save(ItemListProxy list);
Request<ItemListProxy> saveAndReturn(ItemListProxy newList);
}
ItemListRequestContext itemListRequest();
}
private final ListwidgetRequestFactory rf =
GWT.create(ListwidgetRequestFactory.class);
Monday, March 14, 2011 46
47. Using RequestFactory
@Override
public void persistList(String listName)
{
final ListwidgetRequestFactory rf = this.clientFactory
.getRequestFactory();
ItemListRequestContext reqCtx = rf.itemListRequest();
final ItemListProxy newList = reqCtx.create(ItemListProxy.class);
newList.setName(listName);
newList.setListType(ListType.TODO);
reqCtx.saveAndReturn(newList).fire(new Receiver<ItemListProxy>()
{
@Override
public void onSuccess(final ItemListProxy savedList)
{
// Refresh table
listDataProvider.getData();
}
});
}
Monday, March 14, 2011 47
48. Using RequestFactory
@Override
public void update(int index, ItemListProxy obj, final String newName)
{
ItemListRequestContext reqCtx = clientFactory.getRequestFactory()
.itemListRequest();
ItemListProxy editable = reqCtx.edit(obj);
editable.setName(newName);
reqCtx.save(editable).fire(new Receiver<Void>()
{
@Override
public void onSuccess(Void response)
{
eventBus.fireEvent(new MessageEvent(newName + " updated",
MessageType.INFO));
}
});
}
Monday, March 14, 2011 48
49. Using RequestFactory
private void getData()
{
// To retrieve relations and value types, use .with()
Request<List<ItemListProxy>> findAllReq = rf.itemListRequest()
.listAll().with("owner");
// Receiver specifies return type
findAllReq.fire(new Receiver<List<ItemListProxy>>()
{
@Override
Text
public void onSuccess(List<ItemListProxy> response)
{
updateRowData(0, response);
}
});
}
Monday, March 14, 2011 49
50. Using RequestFactory
editList = reqCtx.edit(editList);
List<ListItemProxy> items = editList.getItems();
// must initialize collections
if (items == null)
{
editList.setItems(new ArrayList<ListItemProxy>());
}
editList.getItems().add(newItem);
reqCtx.save(editList).with("items").to(new Receiver<Void>()
{
@Override
public void onSuccess(Void response)
{
itemsProvider.setList(editList.getItems());
itemsProvider.refresh();
}
}).fire();
Monday, March 14, 2011 50
51. GWT MVP - Concepts
View
- Interface + implementation
- Interface enables testing without GWTTestCase
- Typically expensive to construct so make reusable
Presenter
- No Widgets, just business logic
- Middle man between service layer and views
Monday, March 14, 2011 51
52. GWT MVP - Concepts
Place
- Place represents bookmarkable state of an activity
- PlaceController makes back button / bookmarks
work like users expect
- PlaceTokenizers map to / from String tokens on URL
Monday, March 14, 2011 52
53. Demo
third_party/java_src/gwt/svn/trunk/samples/
expenses
Monday, March 14, 2011 53
54. Place
public class EditListPlace extends Place
{
private String token;
public EditListPlace(String token)
{
this.token = token;
}
public String getToken()
{
return token;
}
public static class Tokenizer implements PlaceTokenizer<EditListPlace>
{
public EditListPlace getPlace(String token)
{
return new EditListPlace(token);
}
public String getToken(EditListPlace place)
{
return place.getToken();
}
}
}
Monday, March 14, 2011 54
55. PlaceHistoryMapper
/**
* PlaceHistoryMapper interface is used to attach all places which the
* PlaceHistoryHandler should be aware of. This is done via the @WithTokenizers
* annotation or by extending PlaceHistoryMapperWithFactory and creating a
* separate TokenizerFactory.
*/
@WithTokenizers({ ListsPlace.Tokenizer.class, EditListPlace.Tokenizer.class })
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper
{
}
Monday, March 14, 2011 55
56. Hello Places
// Start PlaceHistoryHandler with our PlaceHistoryMapper
PlaceHistoryMapper historyMapper = clientFactory.getHistoryMapper();
PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(hisoryMapper);
historyHandler.register(placeController, eventBus, defaultPlace);
// Goes to place represented on URL or default place
historyHandler.handleCurrentHistory();
Monday, March 14, 2011 56
60. Activities
Activity, ActivityManager are not required!
ActivityManager
- Owns a region of the window
- Choose what to do with it on place change
Activity (“wake up, set up, show up”)
- Started by ActivityManager
- Provides a widget to display, asynchronously
- Can refuse to relinquish screen
Monday, March 14, 2011 60
67. Activities and Places wiring
// Start ActivityManager for the nav (west) panel with our WestActivityMapper
ActivityMapper westActivityMapper = new WestActivityMapper(clientFactory);
ActivityManager westActivityManager =
new ActivityManager(westActivityMapper, eventBus);
westActivityManager.setDisplay(westPanel);
// Start ActivityManager for the main (center) panel with our CenterActivityMapper
ActivityMapper centerActivityMapper = new CenterActivityMapper(clientFactory);
ActivityManager centerActivityManager =
new ActivityManager(centerActivityMapper, eventBus);
centerActivityManager.setDisplay(centerPanel);
// Start PlaceHistoryHandler with our PlaceHistoryMapper
PlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class);
PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);
historyHandler.register(placeController, eventBus, defaultPlace);
RootPanel.get().add(dockLayoutPanel);
// Goes to place represented on URL or default place
historyHandler.handleCurrentHistory();
Monday, March 14, 2011 67
68. Cell Widgets
Fast, lightweight table rendering
Data binding with
DataProviders, ValueUpdaters
Scrolling and paging controls
Sortable columns, adjustable width
TextBox, IntegerBox, ValueBox<T>
Monday, March 14, 2011 68
70. Editable Column
// Editable column for list name
nameColumn = new Column<ItemListProxy,String>(new EditTextCell())
{
@Override
public String getValue(ItemListProxy list)
{
return list.getName();
}
};
Monday, March 14, 2011 70
71. Custom Column type
// Note Flyweight pattern: only one instance of HyperlinkCell passed to the Column
Column<ItemListProxy, Hyperlink> linkColumn =
new Column<ItemListProxy, Hyperlink>(new HyperlinkCell())
{
@Override
public Hyperlink getValue(ItemListProxy list)
{
String proxyToken =
clientFactory.getRequestFactory().getHistoryToken(list.stableId());
String historyToken =
clientFactory.getHistoryMapper().getToken(new EditListPlace(proxyToken));
Hyperlink h = new Hyperlink(list.getName(),historyToken);
return h;
}
};
Monday, March 14, 2011 71
72. Populating a CellTable
public static class MyDataProvider extends
AsyncDataProvider<ItemListProxy>
{
@Override
protected void onRangeChanged(HasData<ItemListProxy> display)
{
// To retrieve relations and value types, use .with()
Request<List<ItemListProxy>> findAllReq = rf.itemListRequest()
.listAll().with("owner");
// Receiver specifies return type
findAllReq.fire(new Receiver<List<ItemListProxy>>()
{
@Override
public void onSuccess(List<ItemListProxy> response)
{
updateRowData(0, response);
}
});
}
}
this.myDataProvider = new MyDataProvider(requestFactory);
Monday, March 14, 2011 72
73. Updating with a CellTable
public class NameFieldUpdater implements FieldUpdater<ItemListProxy, String>
{
@Override
public void update(int index, ItemListProxy obj, final String newName)
{
ItemListRequestContext reqCtx = clientFactory.getRequestFactory()
.itemListRequest();
ItemListProxy editable = reqCtx.edit(obj);
editable.setName(newName);
reqCtx.save(editable).fire(new Receiver<Void>()
{
@Override
public void onSuccess(Void response)
{
eventBus.fireEvent(new MessageEvent(newName + " updated",
MessageType.INFO));
}
});
}
};
// Make list name field editable
display.getNameColumn().setFieldUpdater(new NameFieldUpdater());
Monday, March 14, 2011 73
74. GWT Logging
GWT now has java.util.Logging emulation
Configure in your .gwt.xml
Easily enable remote logging, too
Monday, March 14, 2011 74
75. GWT secrets
-compileReport
Monday, March 14, 2011 75
76. GWT secrets: faster compile
- -draftCompile skips optimizations
- Set only one user-agent in gwt.xml for dev
- Careful with RPC polymorphism
Monday, March 14, 2011 76
77. GWT secrets: shrink JS
- -XdisableClassMetadata: Disables some
java.lang.Class methods (e.g. getName())
- <set-property name="compiler.stackMode"
value="strip"/>
Removes client-side stack trace info (can
reduce code size up to 15%)
- <set-configuration-property
name="CssResource.obfuscationPrefix"
value="empty"/>
Monday, March 14, 2011 77
78. GWT secrets: shrink JS
- <set-property
name="compiler.enum.name.obfuscation"
value="true"/>
(only if you’re not using enums as String values)
- -XdisableCastChecking: Disables run-time
checking of cast operations
(use with caution)
- See GWT FAQ, CompilerParameters.gwt.xml
Monday, March 14, 2011 78
79. GWT speak
“Very productive environment for Java
developers, but there is a learning curve”
“UI layout and styling is a challenge”
“GWT has enabled our team to run much faster
than we could otherwise”
“Would be impossible to write our app without
GWT”
Monday, March 14, 2011 79
80. New GWT book
http://code.google.com/webtoolkit/books.html
Monday, March 14, 2011 80
81. Thank you!
Where to get it:
http://code.google.com/webtoolkit/
Wiki, issue tracker, source:
http://code.google.com/p/google-web-toolkit/
Official GWT blog:
http://google-web-toolkit.blogspot.com/
Twitter:
@googledevtools
81
Monday, March 14, 2011 81
Editor's Notes
\n
What&#x2019;s new in GWT?\n
\n
\n
Google Web Toolkit 101\n
\n
\n
\n
You get the benefit of code completion, javadoc\nAND Eclipse refactoring tools\n
One GWT\n
\n
\n
\n
\n
GWT has two main goals\n
Google Web Toolkit gives you tools for the whole development lifecycle\n
Easiest way to get started is with Google Plugin for Eclipse\n
\n
\n
\n
\n
\n
\n
Instantiations, free, contribute WindowBuilder\nGenerates corresponding Java code and provides round-trip editing\nUiBinder, externalize strings, absolute layout, new LayoutPanel\n
You can also use GWT Designer with UiBinder XML templates\n
GWT Designer provides a nice CSS editor with visual preview\n
Now you&#x2019;ve written some code and you want to test it.\nGWT development mode lets you test changes quickly without having to compile to JavaScript\n
Now you&#x2019;ve written some code and you want to test it.\nGWT development mode lets you test changes quickly without having to compile to JavaScript\n
Now you&#x2019;ve written some code and you want to test it.\nGWT development mode lets you test changes quickly without having to compile to JavaScript\n
Browser plugin connects to the GWT code server running in Eclipse\nand runs your Java code.\n
Browser plugin connects to the GWT code server running in Eclipse\nand runs your Java code.\n
Browser plugin connects to the GWT code server running in Eclipse\nand runs your Java code.\n
Browser plugin connects to the GWT code server running in Eclipse\nand runs your Java code.\n
Browser plugin connects to the GWT code server running in Eclipse\nand runs your Java code.\n
Dev mode also lets you debug right inside Eclipse\n
When you&#x2019;re ready to deploy, you run the GWT compiler, which\npackages your app in a standard WAR structure\n
Download SpeedTracer for Chrome from the GWT team\n
Launch from Eclipse to find Java code for certain events\n
SpeedTracer can even show server-side speed traces in GAE\nand Spring tcServer\n
Deploy WAR to any servlet container\nOr one click to GAE\n
\n
How do you upgrade your application?\nEnsure that new images, CSS, etc. are updated on each browser?\nGenerates random URLs\nNocache does deferred binding (browser detection, i18n), then pulls in cached permutation for the browser\n
GWT compiler creates the bundled image and calculates cropping\nso your can use each image just like normal\n
GWT compiler creates the bundled image and calculates cropping\nso your can use each image just like normal\n
GWT compiler creates the bundled image and calculates cropping\nso your can use each image just like normal\n
GWT compiler creates the bundled image and calculates cropping\nso your can use each image just like normal\n
\n
\n
\n
Even more on its way: lightweight collections, enum ordinalization\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
DatastoreObject ID/version, Key, enum, value type\n
\n
ListItem a POJO on server only\nAll proxies go in a shared directory (client and server)\n
interface extends RequestFactory, @Service points to impl, locator can find it\nservice stubs extend RequestContext, return parameterized Request\naccessor for each service stub\n
Create a new object, call .create() to get mutable obj\nFire the request with Receiver (like AsyncCallback)\n
To update, must edit first to get mutable obj\n
.with\n
must edit() parent obj, init Collections, save .with() for relations & value types\n
No special methods to implement\nReusable via factory\n
No special methods to implement\nReusable via factory\n
\n
evil back button\n
\n
Extends Place, constructors can take arguments\nTokenizer converts to/from String\n
\n
Lists all places that participate in browser history\nAll generated, can also implement PlaceHistoryMapper yourself\n
\n
instantiate ActivityManagers, PlaceHistoryMapper, PlaceHistoryHandler\nAdd a widget to the root panel and handleCurrentHistory()\nSee also CachingActivityManager, FilteredActivityManager\n
Define a model to cleanly separate view & presenter code\n
Column represents model of a column, contains no widget code\nSo can use in presenter or view\n
\n
\n
\n
Java is the kingdom of nouns\n
\n
How do you shrink it and make compile faster? shows each permutation, split point, package\n