(Spring Framework Workshop)

emptyslowInternet και Εφαρμογές Web

12 Νοε 2013 (πριν από 3 χρόνια και 8 μήνες)

380 εμφανίσεις

สปริง

เฟรมเวิร์ค

เวิร์คชอป

(
Spring

Framework Workshop
)

By www.
spring
66
.com

พฤศจิกายน
2552
,
22



ดเจน

เขียนจาวาไม่ใช

สปริง บาป


Supported by KT ZMICO Securities


@roofimon

ขอ ขอบคุณ

TA


ไม่มี
TA
ไม่มีงานนี้ครับ


@somkiat


@
9
tae


@poorprogrammer


@nuboat


@siros_s


@YashimaExteen


@boyone


TA
เป็นผู้ทรงคุณวุฒิเรื่องสปริงทุกท่าน

Agenda


Impossible is nothing


Why Spring?


New Features and Enhancements in
Spring 3.0



Core Container 3.0


Persistence with Spring JDBC


AOP (@siros_s)


Transaction with Annotation (@siros_s)


EhCache (Apply AOP)


Spring Web MVC with Web Annotation


Basic
Requirements



JDK
1.6
++


Maven
2.0
.x


Apache Derby


Netbeans, Eclipse, Vi, Whatever IDE


Skeleton Source from


http://code.google.com/p/spring
66
-
training
-
3
/svn/branches/
1.0
.PRE



Full


https
://spring
66
-
training
-
3
.googlecode.com/svn/trunk/



ที่มาของเนื

อหา
(
ลอกมาจากไหน
)


Building Spring
2
Enterprise Application


Development J
2
EE without EJB


Professional Spring Framework


Spring
2
in Action


Pro Spring
2


Spring Recipe


หนังส

ออ้างอิงเยอะมาก

ท าไมต้องสปริง

เมื่อก่อน


Java
เตรียมเครื่องมือไว ้ให้เยอะไปหมดแต่เวลาใช


?


Design Pattern:
ต้องนั่งตีความเอาเอง


กระบวนการรวมฟีเจอร์ของ
SUN
โหดร ้ายเกินไป




วิตเราถูกผูกติดกับ
Application Server, API
มากเกินไป


อยากเอาฟีเจอร์มารวมกันพร ้อมทั้งใช


Design Pattern
ด้วย
?


Light Weight


สมัยนี้


My Basic
Requirements for
Lightweight Container


Lifecycle management


Lookup


Configuration


Dependency resolution

lightweight

Container (Value
Added)


Transaction


Thread management


Object pooling


Clustering


Management


Remoting


Exposing remote services


Consuming remote services


Customization and extensibility


AOP

What

actually Spring is?


Framework that …


make
Enterprise

Java easier to use


promote good programming
practice

¤
enabling a
POJO
-
based

programming model
that is applicable in a wide range of
environments


6RPH?VDLG?6SULQJ?LV?MXVW?D?¦
JOXH§

for connecting
DOO?VWDWH?RI?WKH?DUW?WHFKQRORJLHV?WRJHWKHU?YLD?LW©V?
Application Context
.


Heart and Soul of Spring is Dependency
Injection and Aspect Oriented Programming.

Main

Components

Layer

of Application

Dependency Injection

หรือ


Inversion Of Control

โดยทั่วไป

เมื่อใช


IOC


Hollywood Principle
: "Don't call me, I'll
call you."

Why IoC

is Matter?


Removes explicit dependence on container APIs


Because components don't need to look up
collaborators at runtime, they're much simpler to
write and maintain


Application code is much easier to test


A good IoC implementation preserves strong
typing


Dependencies are explicit


No more Application Server dependent

Bean
?


Bean is a
service


Service

= Interface+Implement+Descriptor


Bean
อาศ

ยอยู่ใน
Bean Factory
หรือ
Application
Context


Application Context
คือหัวใจของ
Spring


คิดไม่ออกต้องสร ้าง
Application Context
ขึ้นมาก่อน

Configuration



วนมากจะช
ื่

applicationContect.xml

Initial Context

//Load Context Manually From AppConfig.class

ApplicationContext
context

=



new FileSystemXmlApplicationContext(



"classpath:/applicationContext.xml");


//Lookup Bean named

Clinic
clinic

= (Clinic)context.getBean(“
clinic
”);

Collection<Vet> vets = clinic.getVets();

The

Pet
Clinic”

The “Lightweight Container”
Architecture

Basic

Architecture


Spring JDBC


Spring Core


Spring Web MVC


JSP


jQuery


Separate Web Module from Service Module
by using “HTTP Remoting”



Basic

Requirement


Use Cases


View a list of veterinarians and their specialties


View information pertaining to a pet owner


Update the information pertaining to a pet owner


Add a new pet owner to the system


View information pertaining to a pet


Update the information pertaining to a pet


Add a new pet to the system


View information pertaining to a pet's visitation
history


Add information pertaining to a visit to the pet's
visitation history


Business Rules


An owner may not have multiple pets with the
same case
-
insensitive name


Checkout Code from Google Code


Create Test Case Call

isClinicServiceReady





@
Autowired



protected Clinic clinic;



@
Test



public

void
isCliniceReady
() {



assertNotNull(clinic);


}



We have done creating our first
“bean”.

Checkout Code from Google Code


Create



interface

Clinic”


Run Test (Fail!!!!!)


Create


applicationContect.xml


Copy content from “Master Project”



src
\
test
\
resources
\
org
\
spring
66
\
training
3
\
test
\
petclinic
\
baseline



Run Test !!!!!!


We have done creating our first “bean”.

What we have done?

Why

Test First


Test case is “
META
-
CODE
”, code
that explains code.


Feel confident for refactor, move
and share.


Checkout Code from Google Code


Create “interface ListDataService”


Create “class
ListDataServiceImpl




@Override



public List
getElementsList()

{



List list = new ArrayList();



list.add("Tom");



list.add("Henri");



list.add("Jim");



return list;



}

Go more deep into “
DataSource


DB

Connection

Data

Source

Hibernate

iBatis

OpenJPA

Persistence

Manager

Oracle

MsSQL

DB
2

MySQL

Go more deep into “
DataSource



Basically we must have this information for
datasource


Driver Class


Driver Class Name


Connection String (URL)


Username


Password


Plus some optional parameters depends on Driver Manager
(Pool Size, Wait Time, bla bla bla)

Go more deep into
DataSource


Basically we must have this information


<bean id="
dataSource
" class=“$
Driver
">



<!
--

Connection Info
--
>



<property name="
driverClassName
"






value="${
jdbc.driverClassName
}" />



<property name="
url
" value="${
jdbc.url
}" />



<property name="
username
" value="${
jdbc.username
}" />



<property name="
password
" value="${
jdbc.password
}" />



<!
--

Connection Pooling DBCP
--
>



<property name="
initialSize
" value="
5
"/>



<property name="
maxActive
" value="
100
" />



<property name="
maxIdle
" value="
30
" />



<property name="
maxWait
" value="
1000
" />



<property name="
poolPreparedStatements
" value="
true
" />



<property name="
defaultAutoCommit
" value="
false
" />


</bean>

Spring JDBC

The

value
-
add

provided

by

the

Spring

Framework

JDBC

abstraction

is

perhaps

best

shown

by

the

sequence

of

actions

outlined

in

the

tabl
e
.

Spring JDBC

Action

Spring

You

Define connection parameters.



X

Open the connection.

X



Specify the SQL statement.



X

Declare parameters and provide parameter values



X

Prepare and execute the statement.

X



Set up the loop to iterate through the results (if any).

X



Do the work for each iteration.



X

Process any exception.

X



Handle transactions.

X



Close the connection, statement and resultset.

X



Go more deep into
Spring JDBC


JdbcTemplate


NamedParameterJdbcTemplate



SimpleJdbcTemplate



SimpleJdbcInsert and SimpleJdbcCall



RDBMS Objects including MappingSqlQuery,
SqlUpdate and StoredProcedure

Go more deep into
Spring JDBC


DataSource


Prepared Statement


Mapper


Extractor

Move up to
Service Layer


The most important part of our Application.


All business logics are located, here


Test it carefully, change very often.



Controller

Service

Entity A

Entity B

Entity C

Spring Web

MVC Flow


Clear separation of roles



Powerful and straightforward configuration of both
framework and application classes as JavaBeans
.


Adaptability, non
-
intrusiveness, and flexibility.



Customizable binding and validation



Customizable handler mapping and view
resolution



Flexible model transfer



Beans whose lifecycle is scoped to the current
HTTP request or HTTP

Session




Spring
DispatcherServlet

Dispatcher Servlet

<web
-
app>


<servlet>


<servlet
-
name>
example
</servlet
-
name>


<servlet
-
class>


org.springframework.web.servlet.DispatcherServlet


</servlet
-
class>


<load
-
on
-
startup>
1
</load
-
on
-
startup>


</servlet>


<servlet
-
mapping>


<servlet
-
name>
example
</servlet
-
name>


<url
-
pattern>*.form</url
-
pattern>


</servlet
-
mapping>


</web
-
app>

Example
-
servlet.xml

<context:component
-
scan base
-
package="com.spring
66
.petclinic.web"/>

<bean
class="org.springframework.web.servlet.view.BeanNameViewR
esolver" p:order="
0
"/>

<bean
class="org.springframework.web.servlet.view.InternalResou
rceViewResolver" p:prefix="/WEB
-
INF/jsp/"




p:suffix=".jsp" p:order="
1
"/>


<bean id="messageSource"
class="org.springframework.context.support.ResourceBundle
MessageSource"




p:basename="messages"/>

Context

Hierarchy

Web

Layer






Need Spring Boot Strap



Web

Context

Spring

Context

Web

Context

Spring

Context

org.springframework.web.context.ContextLoaderListener

web.xml

Bootstrapping

web applications






Spring

allows for seamlessly
bootstrapping

@
Configuration

classes within your
servlet container's

web.xml

deployment descriptor


<listener>



<listener
-
class>



org.springframework.web.context.ContextLoaderListener


</listener
-
class>

</listener>

<context
-
param>


<param
-
name>contextConfigLocation</param
-
name>


<param
-
value>/WEB
-
INF/applicationContext.xml</param
-
value>

</context
-
param>



Still have
xxx
-
servlet
.xml






Need to create abc
-
servlet.xml for mapping request
from dispatcher servlet


<context:component
-
scan


base
-
package="com.spring
66
.petclinic.web"/>


Also can config other parameters like binding,
viewResolver,…






Still have
xxx
-
servlet
.xml





@Controller

public class ClinicController {



private final Clinic clinic;



@Autowired


public ClinicController(Clinic clinic) {


this.clinic = clinic;


}




@RequestMapping("/")


public String welcomeHandler() {


return "welcome";


}

First

Controller






Named “ClinicController”


And then Copy Content from Main Project


src
\
main
\
java
\
com
\
spring
66
\
petclinic
\
web


====ClinicController======




“mvn jetty:run

Dmaven.test.skip=true

Djetty.port=
9999



http://localhost:
9999
/






First Controller,
Test First






Create “VetControllerTests”


And then Copy Content from Web.text


====TestVetController======



Wowwww!!! Full of “red” things, so let’s eliminate
them.







Create
VetController






List All Vet


Create “VetController”


Copy content from “Web.txt”


Part “VetController”


There are two interesting parts:


Inject “clinic” service into controller


@Autowired


And Request Mapping


@Request over “public Collection<Vet> list()”


It will handles {WebContext}/main/vet/list








OwnerController,
Test First






Create “OwnerControllerTests”


And then Copy Content from Web.text


====TestOwnerController======



Wowwww!!! Full of “red” things, so let’s eliminate them.






Let’s do more action,
Test First






Create “OwnerController”


Copy content from “Web.txt”


Part “SearchOwnerController”


If it works so move forward


Do some magic by adding new Owner


Copy content from “Web.txt”


Part “AddOwnerController”


Create “ViewUtils”


Copy content from “Web.txt”


Part “ViewUtils”


Create “PageType”..
Good u can guest, next