From 4729dacd53c8ca86d026b22e2353d262781f259a Mon Sep 17 00:00:00 2001 From: Jeremy Grelle Date: Wed, 15 Aug 2007 22:22:17 +0000 Subject: [PATCH] Using client-side validation support. Applied full Spring look-and-feel. --- .../booking-jsf/src/main/java/import.sql | 15 +++-- .../samples/booking/model/Booking.java | 14 ---- .../webflow/samples/booking/model/Hotel.java | 9 --- .../webflow/samples/booking/model/User.java | 10 --- .../booking/service/services-config-jpa.xml | 2 +- .../booking/util/DebuggingPhaseListener.java | 9 +++ .../main/webapp/WEB-INF/webflow-config.xml | 4 +- .../src/main/webapp/css/screen.css | 35 +++++++--- .../src/main/webapp/flows/booking/book.xhtml | 54 +++++++-------- .../src/main/webapp/flows/main/main.xhtml | 14 ++-- .../src/main/webapp/images/btn.bg.gif | Bin 221 -> 70 bytes .../src/main/webapp/images/diplomat.jpg | Bin 0 -> 17957 bytes .../src/main/webapp/images/hdr.bg.gif | Bin 218 -> 0 bytes .../src/main/webapp/images/header.graphic.jpg | Bin 0 -> 24347 bytes .../src/main/webapp/images/tse.gif | Bin 0 -> 2814 bytes .../booking-jsf/src/main/webapp/intro.xhtml | 63 +++++++++++++----- .../src/main/webapp/template.xhtml | 15 ++++- 17 files changed, 139 insertions(+), 105 deletions(-) create mode 100644 spring-webflow-samples/booking-jsf/src/main/webapp/images/diplomat.jpg delete mode 100755 spring-webflow-samples/booking-jsf/src/main/webapp/images/hdr.bg.gif create mode 100644 spring-webflow-samples/booking-jsf/src/main/webapp/images/header.graphic.jpg create mode 100644 spring-webflow-samples/booking-jsf/src/main/webapp/images/tse.gif diff --git a/spring-webflow-samples/booking-jsf/src/main/java/import.sql b/spring-webflow-samples/booking-jsf/src/main/java/import.sql index 180265a4..b0dea15c 100755 --- a/spring-webflow-samples/booking-jsf/src/main/java/import.sql +++ b/spring-webflow-samples/booking-jsf/src/main/java/import.sql @@ -1,11 +1,12 @@ -insert into Customer (username, password, name) values ('jeremy', 'barfoo', 'Jeremy Grelle') +insert into Customer (username, password, name) values ('springuser', 'barfoo', 'Spring User') insert into Customer (username, password, name) values ('demo', 'demo', 'Demo User') -insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') -insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') -insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') -insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') -insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') -insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 199, 'Westin Diplomat', '3555 S. Ocean Drive', 'Hollywood', 'FL', '33019', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (7, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') insert into Hotel (id, price, name, address, city, state, zip, country) values (8, 300, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA') insert into Hotel (id, price, name, address, city, state, zip, country) values (9, 80, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA') insert into Hotel (id, price, name, address, city, state, zip, country) values (10, 90, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA') diff --git a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Booking.java b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Booking.java index e642783b..ee3980f1 100755 --- a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Booking.java +++ b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Booking.java @@ -16,11 +16,6 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; - -//import org.hibernate.validator.Length; -//import org.hibernate.validator.NotNull; -//import org.hibernate.validator.Pattern; - @Entity public class Booking implements Serializable { private Long id; @@ -68,7 +63,6 @@ public class Booking implements Serializable { this.id = id; } - // @NotNull @Basic @Temporal(TemporalType.DATE) public Date getCheckinDate() { @@ -80,7 +74,6 @@ public class Booking implements Serializable { } @ManyToOne - // @NotNull public Hotel getHotel() { return hotel; } @@ -90,7 +83,6 @@ public class Booking implements Serializable { } @ManyToOne - // @NotNull public User getUser() { return user; } @@ -101,7 +93,6 @@ public class Booking implements Serializable { @Basic @Temporal(TemporalType.DATE) - // @NotNull public Date getCheckoutDate() { return checkoutDate; } @@ -110,9 +101,6 @@ public class Booking implements Serializable { this.checkoutDate = checkoutDate; } - // @NotNull(message="Credit card number is required") - // @Length(min=16, max=16, message="Credit card number must 16 digits long") - // @Pattern(regex="^\\d*$", message="Credit card number must be numeric") public String getCreditCard() { return creditCard; } @@ -144,8 +132,6 @@ public class Booking implements Serializable { this.beds = beds; } - // @NotNull(message="Credit card name is required") - // @Length(min=3, max=70, message="Credit card name is required") public String getCreditCardName() { return creditCardName; } diff --git a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Hotel.java b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Hotel.java index e6800add..4b4dcd12 100755 --- a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Hotel.java +++ b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/Hotel.java @@ -8,9 +8,6 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -//import org.hibernate.validator.Length; -//import org.hibernate.validator.NotNull; - @Entity public class Hotel implements Serializable { private Long id; @@ -32,7 +29,6 @@ public class Hotel implements Serializable { this.id = id; } - // @Length(max=50) @NotNull public String getName() { return name; } @@ -41,7 +37,6 @@ public class Hotel implements Serializable { this.name = name; } - // @Length(max=100) @NotNull public String getAddress() { return address; } @@ -50,7 +45,6 @@ public class Hotel implements Serializable { this.address = address; } - // @Length(max=40) @NotNull public String getCity() { return city; } @@ -59,7 +53,6 @@ public class Hotel implements Serializable { this.city = city; } - // @Length(min=4, max=6) @NotNull public String getZip() { return zip; } @@ -68,7 +61,6 @@ public class Hotel implements Serializable { this.zip = zip; } - // @Length(min=2, max=10) @NotNull public String getState() { return state; } @@ -77,7 +69,6 @@ public class Hotel implements Serializable { this.state = state; } - // @Length(min=2, max=40) @NotNull public String getCountry() { return country; } diff --git a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/User.java b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/User.java index e7c0d04c..cc4f0078 100755 --- a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/User.java +++ b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/model/User.java @@ -6,10 +6,6 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; -//import org.hibernate.validator.Length; -//import org.hibernate.validator.NotNull; -//import org.hibernate.validator.Pattern; - @Entity @Table(name = "Customer") public class User implements Serializable { @@ -26,8 +22,6 @@ public class User implements Serializable { public User() { } - // @NotNull - // @Length(max = 100) public String getName() { return name; } @@ -36,8 +30,6 @@ public class User implements Serializable { this.name = name; } - // @NotNull - // @Length(min = 5, max = 15) public String getPassword() { return password; } @@ -47,8 +39,6 @@ public class User implements Serializable { } @Id - // @Length(min = 5, max = 15) - // @Pattern(regex = "^\\w*$", message = "not a valid username") public String getUsername() { return username; } diff --git a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/service/services-config-jpa.xml b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/service/services-config-jpa.xml index 126f0c91..42d5f2cc 100755 --- a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/service/services-config-jpa.xml +++ b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/service/services-config-jpa.xml @@ -13,7 +13,7 @@ - + diff --git a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/util/DebuggingPhaseListener.java b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/util/DebuggingPhaseListener.java index c3ae80d7..43cd27e8 100644 --- a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/util/DebuggingPhaseListener.java +++ b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/util/DebuggingPhaseListener.java @@ -1,5 +1,8 @@ package org.springframework.webflow.samples.booking.util; +import java.util.Map; + +import javax.faces.context.FacesContext; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; @@ -21,6 +24,12 @@ public class DebuggingPhaseListener implements PhaseListener { public void beforePhase(PhaseEvent event) { if (logger.isDebugEnabled()) { logger.debug("Entering JSF Phase: " + event.getPhaseId()); + + if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) { + Map input = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); + for (Object key : input.keySet()) + logger.debug(key + " : " + input.get(key)); + } } } diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml b/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml index f0365bbd..40c26b0d 100755 --- a/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml +++ b/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml @@ -15,9 +15,9 @@ - + - + diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/css/screen.css b/spring-webflow-samples/booking-jsf/src/main/webapp/css/screen.css index 5c18b0b6..0c65e65f 100755 --- a/spring-webflow-samples/booking-jsf/src/main/webapp/css/screen.css +++ b/spring-webflow-samples/booking-jsf/src/main/webapp/css/screen.css @@ -8,7 +8,7 @@ body, div, dd, dt, dl, img, ul, ol, li, p, h1, h2, h3, h4, h5, form, hr, fieldse ----------------------------------------------- */ html { height: 100%; - background-color: #DBD4C6; + background-color: #9cac7c; } img { border: 0; @@ -59,18 +59,25 @@ fieldset { #header { float: left; width: 758px; - height:76px; - background: url(../images/hdr.bg.gif) 0 0 repeat-x; + height:36px; + background-color: #414f23; } #container { float: left; width: 758px; - background: url(../images/spring-logo.jpg) 0 0 repeat-x; + background: url(../images/header.graphic.jpg) 0 0 repeat-x; +} +#sidebar { + float: left; + width: 205px; + margin-left: 5px; + margin-top: 185px; + padding-top: 5px; } #content { float: left; - width: 548px; - margin-top: 75px; + width: 448px; + margin-top: 195px; padding-top: 5px; background: #fff url(../img/cnt.bg.gif) 0 0 repeat-x; } @@ -170,7 +177,7 @@ input[type="submit"], input[type="button"] { #content .section { float: left; width: 518px; - padding: 15px 15px 0 15px; + padding: 15px 15px 0 3px; } #content .section h1 { font-family: "Trebuchet MS", Arial, sans-serif; @@ -225,14 +232,22 @@ input[type="submit"], input[type="button"] { border-left: 0px; border-bottom: 0px; } +#content .section .prev { + float: left; + width: 120px; +} +#content .section .next { + float: left; +} /* Header ----------------------------------------------- */ #title { float: left; - padding: 1px 0 6px 15px; + padding: 10px 0 6px 15px; + color: #e9efdb; } #status { - color: #C7B299; + color: #e9efdb; float: right; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; @@ -242,6 +257,6 @@ input[type="submit"], input[type="button"] { padding-right: 15px; } #status a { - color: #C7B299; + color: #e9efdb; text-decoration: none; } diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/flows/booking/book.xhtml b/spring-webflow-samples/booking-jsf/src/main/webapp/flows/booking/book.xhtml index 15e4c7ee..fc1eb4b7 100755 --- a/spring-webflow-samples/booking-jsf/src/main/webapp/flows/booking/book.xhtml +++ b/spring-webflow-samples/booking-jsf/src/main/webapp/flows/booking/book.xhtml @@ -4,6 +4,7 @@ xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:a="https://ajax4jsf.dev.java.net/ajax" + xmlns:sf="http://springframework.org/faces" template="/template.xhtml"> @@ -13,7 +14,7 @@
- +
Name:
@@ -49,29 +50,22 @@
Check In Date:
- - - - - - - - + + + + +
Check Out Date:
- - - - - - - - - + + + + +
@@ -103,22 +97,19 @@
Credit Card #:
- - - - - + + +
Credit Card Name:
- - - - - + + +
@@ -154,14 +145,15 @@
-
 
-   + + +  
-
+
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/flows/main/main.xhtml b/spring-webflow-samples/booking-jsf/src/main/webapp/flows/main/main.xhtml index cb430a79..ade80858 100755 --- a/spring-webflow-samples/booking-jsf/src/main/webapp/flows/main/main.xhtml +++ b/spring-webflow-samples/booking-jsf/src/main/webapp/flows/main/main.xhtml @@ -13,7 +13,7 @@ - +

Search Hotels

@@ -65,10 +65,14 @@ - - + +
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/images/btn.bg.gif b/spring-webflow-samples/booking-jsf/src/main/webapp/images/btn.bg.gif index 133e2ee9503569c708295f1181c93bd89ffbfa93..b77cc95436986ef6d571c37d6407984d283da78a 100755 GIT binary patch literal 70 zcmZ?wbhEHbWMxohXkcVWUF7ut|9{1QqRvIBi6yBi3gww4844j8sS56%z5xt63_t)< X%D}|a(!cWbTmHp!wnT+6FjxZs5JDBN literal 221 zcmZ?wbhEHbWMxohIKsftA*WCwAvr}^b&|45pQ2KWtX!9ZQjelivy5D=lvJ67!~`Xk zS}Ex^IfX`PnQEYjxJ0Rhc(J(HG-cHzX_-}$l0EWDRgzK@l$6`$6k28Frzoq{OG|gi z$+ybM7mJB0{$ybQ0UZzlvXg-|N(`J{!Zl)rQEiZDUemTL!}7VV2?Q&y~-A>8lvv}h&EmG=!X>o_#tP2g~0{OO@0 QUsvDU(%RNuugG8x0NDgVQ~&?~ diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/images/diplomat.jpg b/spring-webflow-samples/booking-jsf/src/main/webapp/images/diplomat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1d0c9cd21b819bc8b90d43d849aa1b2e84e0bbe GIT binary patch literal 17957 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%0D||y-s?!IaYc77pjuz%bRgfG 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 B20Z`( literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/images/tse.gif b/spring-webflow-samples/booking-jsf/src/main/webapp/images/tse.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1fa98cf57617b6c613572f4db3e70518f5ed0c9 GIT binary patch literal 2814 zcmd^L0fB*m3Zp-^1CdR3`Z zUb}X!va+(Os;auWx~8T^rBYqLe*MOc8@08y_4V})4GlMM-fV1aY-(z{b?esc+qavW zn_F61?%cU^_wL<$_wL=lfB(UQ2M-@U)MzxVt*vcsZCb6iy}iAoqvMZ1{^;!N?CR?3 z?(XjC>FMq5?d$7%^ypE4fB)mhj|T<@1_uY9Jb5xSG&DRsJTfveIyyQwHumSAe?EQs z^sm4EdiLzu-+%u-K0ZD%F)=wg`TY6wsi~^)u&}te`2PL-rKP10A3l8i`0>-HPs_{8pFe;8=bwMReEG7nvhwxo z*VWb4Z~w>OR?T66baF!R61xpo4ZEeqLvsYIby+jOVVcqgMPa{iTRG~qjvU8`u&o3{#47kyhv8l(XT9_3N*)Yv57Bh_tH^=R1ChG8EWCxAhk9e% z6J|+bs-aG5QEdbd&E3P2>`ET%`Z3RXwTO#?qiOB!S$TwCT1lpoI*EbdPB)k7qJ_7Y{h=p6mA zK)&hR;dUvQVlTOJpC;wFfcib2Xo{%oZ`(T3e5rY0qT4=)P{{%|(*{Q-UIk>)e3C8y zM^BPzLS04h5&Sr~FdR#+@4Q(UGgPR*g^e0BKJR6ZjH-q!GS?D#bW2of9eMJr)!O#eZS~#v|5XHNU$7XcQ$B;vkjtzx_ zX|8^fB{gK-IxD_xwezQJZ=L;SLN30ZdY47VGfI%y#^l*ZM#Mqxg2rZ>!R+oe2L}h? zcXNJCxg;W#a=O;D>gsG5NDAi%kn#Swu4_KFZr~b26;3x&35n$!vE=3?2DkCU5c5{w z=>fcdL7mnhl)28zG-)JJUo|(#rg?I%xi-ho9emDY8IQ>2J(~5>r4PTUaW;6x!*r(oJc9w5K%K2X;+qIR z1=#C>T;Q-(i&)}Dm?^|sEFl9$vZ9);IBV^fD#}gF1n6%pB+k=J4t1#9!FLi1ZQ>++ zu9#%WhvD25IFkel1`8=&flXQ{kpQ?NeyxpSQEeof$YSQIH{5aB$QPMyH%`Su$JlKx zbo#kdAU)?anZQf!Xr4mRpaHW2jas|r2MUpsPbXP-%TY0lJfrh~z)=i8=gt+{0#Jx) zG9Rx}7Xk!aI&wv4%>F*i3TVSdJ2QM~=ak6PJIf`a+d#I8ZG-5?^35n<3l?-jVm4~w6QjyqvwN7i@;?u9EHi3B>ks%-p7lesBaU6!G<=b*_Bw+!hBU zWP@tB2k{JN-p{01$JT*26MB?MV}Q{iks)(XjM-5Kw$pa4z4u^R^F(BijDmD3gSPbVtZeUNTti}RdqYnvt*m#{5o)9ZEkNV&y91-iZ;0HTQb`_QyH z_Cq^D8**+K?8B|bLU)wL*y*hixqY2I4~|ic2_fN35kQfJ^U@ zk!pFkAG?Zuy~MsfJj1zt3yq6*;u{JeLtrPBcgz`BF3WWI;Pb+Z{SpWPu)Vkpw2#x9)?loG{AA;Q);kG}*=j>UHpvJ#!V&Fm zw(6R4X6dogvCMI&j{CmQQ?U!cEL~7iKZ!aZ - + + + Spring Web Stack: SWF + JSF Booking Sample + + + - -
Booking SWF + JSF - A Spring Web Flow Sample
-
-
-

- - - -

+
+ -
- - - +
+ + + +
+
+

Welcome to the Spring Web Flow Booking Sample

+ +

+ This sample will continue to evolve as Spring Web Flow 2.0 is developed. +

+ +

+ As of SWF 2.0-m1, some of the new features that this sample serves to demonstrate include: +

  • Flow-scoped persistence contexts
  • +
  • Unified EL integration
  • +
  • Spring 2.0 custom scopes
  • +
  • Client-side validation support
  • +

    + +

    + Click here to book your hotel. +

    +
    +
    +
    + +
    + \ No newline at end of file diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/template.xhtml b/spring-webflow-samples/booking-jsf/src/main/webapp/template.xhtml index 157598dc..f17e9bc4 100644 --- a/spring-webflow-samples/booking-jsf/src/main/webapp/template.xhtml +++ b/spring-webflow-samples/booking-jsf/src/main/webapp/template.xhtml @@ -6,17 +6,30 @@ Spring Web Stack: SWF + JSF Booking Sample +