Вы находитесь на странице: 1из 70

>> Delivering Value

Struts 2.0
Session - 4

May, 2009

Presentation By
Training & Development
Introduction

Good Evening Guys! Welcome


back to the Struts 2 training
program. We have crossed
three days of training but have
seen only a little of struts

There is a lot to learn


Today we will be delving
deeply into Struts 2. Let us
start with random recaps:

2
Mr. Thinker

What are the attributes of HTTP is stateless and text


HTTP? based

3
Mr. Thinker

What are the main problems Separation of Concern is non-


with Servlets? existent. HTML code is
embedded in Java making it
difficult to maintain

4
Dumbo Vs. Jumbo
Jumbo! Does JSPs completely replace Servlets?

No Dumbo. JSPs still get converted to Servlets. So,


for each JSP we see, there will be a corresponding
servlet in the background

5
Mr. Thinker

What are the problems Separation of concern is


with JSPs? still a problem. Java code
is embedded in HTML
which is equally
undesirable

6
Mr. Thinker
View Layer is generally
What is the View layer implemented using JSPs
generally made of?

7
Dumbo Vs. Jumbo
What puzzle does MVC solve?

Separation of concerns. The three layers are totally


separated

8
Mr. Thinker

How do Filters help? Repetitive tasks can be


moved to a Filter. (Eg.
Session checking,
authentication etc)

9
Mr. Thinker

How is dependency injection Dependency Injection is


achieved generally? achieved generally by
performing Setter Injection.

10
Dumbo Vs. Jumbo
Command Pattern is basis of what framework?

Command Pattern is the basic building of Struts


Framework

11
Mr. Thinker

What is the ancestor Webwork


framework of Struts2?

12
Mr. Thinker

Who authored Struts Craig Mc Clanahan

13
Dumbo Vs. Jumbo
Web Work is based on what Framework?

X Work

14
Mr. Thinker

X Work implements Command Pattern


which design pattern?

15
Dumbo Vs. Jumbo
What is the minimum java requirement to use
Struts 2?

You should be having at least


java 1.5

16
Mr. Thinker

No request. get parameters,


What are the advantages no type conversions, no
of Struts 2? (whatever we forwards/redirects, etc
have realized till now?)

17
Ms. Natasha

It is time to move on guys! I leave


the dais now to the trainer to
continue with Day 4 contents

18
The Internals of the Ph.D.
Project

19
Using an MVC Design pattern without Struts

JSP Web.xml Servlet Result JSP


Find out the (Request.getparame
servlet that will ter, business logic,
serve the request Forward to result
JSP etc)

20
Using Struts 2

JSP Web.xml Filter Struts.xml


Dispatcher
Find out the
servlet that will This is a filter
serve the request

Result A MAGIC
Struts.xml Action Class
JSP BOX
(Execute business logic)

21
Dumbo Vs. Jumbo
Now I know why he talked about Filters
yesterday 

Let us listen to him and see what he has


to say about Filters in Struts 2

22
Web.xml
 As with any web application, the request first goes to web.xml

 In web.xml, the request is mapped to a Filter

 The request reaches the Filter

23
Filter Dispatcher
 This is a Filter

 This is the entry point to the Magic World called Struts 2

 This initiates the request processing life cycle

24
Struts.xml
 The Filter Dispatcher reads the Struts.xml to find out which action class /
method needs to be invoked
 Once this information is available, the Filter Dispatcher initiates the request
processing life cycle

25
The Magic Box
 The magic box does a lot of things

 We entered our name, first number and second number in the screen and
suddenly and automatically these values are available in the Action Class
without our intervention
 We never wrote request.getparamter!! we never did explicit type conversion
to float values
 That is why we called it a Magic Box

 We will explain in more detail about this Magic Box and its actual name very
shortly

26
Action Class
 We already saw this. This is a normal java class which need not even extend
any other class
 This is just a POJO

 Some of the points to note in the action class


– The action class contains a method called execute
– The action class contains class level variables for each corresponding
HTML fields (Eg. myName, firstNumber, secondNumber)
– These class level variables follows javabeans specifications and has
setter/getter methods
– The action returns a String generally which is checked with the name
attribute of the result element in the struts.xml for the corresponding
action element. The result element decides on the target page based on
the value of name attribute

27
The Return Journey
 After the successful execution of business logic in action class, the
framework checks the struts.xml to see which page should be displayed
 The framework now displays the result jsp

28
Dumbo Vs. Jumbo
In the above explanation, I saw Filters but not
even a single servlet. Struts 2 does not support
servlets?

Cool Man !

Not exactly. The framework provides a Filter which is


basically the part of the Controller layer. It is just that instead
of servlet it provides Filter. Nothing serious. But in a Struts
2 application you are free to have servlets if you want doing
whatever you would like. No constraints from the framework.
Am I clear?

29
Exploration of the Magic Box - Interceptors
You are my villain.
I am going to
change your
Hi! Are you request….. #@$@#$@#
available for a $???
Mr. Interceptor
date tonight?

Is there any body


Hi! Are you
else more dumb
available for a
than you!!”
date tonight?

Mr. William Khan Ms. Anne Davis

30
Dumbo Vs. Jumbo
I cannot imagine that Struts 2 can do such destructive
things. So, interceptors are basically like viruses that
mutate your request and make it look different. Am I
correct?

Not exactly. You have got it totally wrong. Only the example
taken was like that. Interceptors are the friends of Struts 2
developers. Interceptors are used for constructive purposes.
Our trainer will explain more

31
Interceptor Pictorially

 As you can see from the above picture, interceptors are part of the
controller layer
 The filter invokes the various interceptors

32
What are interceptors?
 Interceptors are normal Java classes

 Interceptors are conceptually similar to Filters

 In other words interceptors are used for providing pre-processing / post-


processing functionality around the action classes
 The purpose of interceptors is to remove cross cutting tasks from the action
class and move them to separate class called Interceptors
 Typical examples:
– Getting the values of the screen fields and moving them to model
variables (i.e. request.getparameter)
– Converting the type of screen fields from String to the corresponding
type of the model
– Similarly converting the type of model variables back to string when
displaying the values in the screen
– A lot more
33
A good API Reference on Interceptor
 http://struts.apache.org/2.x/docs/interceptors.html

34
What are interceptors? (Contd.)
 Interceptors are concepts of XWork framework on top of which Sturts2 has
been built
 Interceptors are of two types
– Interceptors that come built in with the framework
– Custom Interceptors – Interceptors that can be written totally by you

35
Dumbo Vs. Jumbo
I am slowly coming to terms. But I have a
question.

<SAMPLE>

36
Configuration of Interceptor
 Interceptors are generally per action

 Hence it should be configured at the same location where actions are


configured. i.e. in struts.xml
<action name="helloWorld"
class="com.aigss.training.struts.action.HelloWorldAction">
<interceptor-ref name="logger"/>
<result name="success">/HelloWorldSuccess.jsp</result>
</action>

37
Exercise
 In the Hello World Project, add the interceptor in struts.xml as
mentioned above and see the behavior after running it in browser
– Observe the log (Tomcat 6.0) in the Net Beans window at the
bottom – you would observe that the name of the action is
displayed in the logs
– Run the HelloWorld.jsp and you would observe that the name
does not get displayed

38
Dumbo Vs. Jumbo
Till I did the exercise it was totally clear to me. I was assuming
that the framework did a lot of things like setting screen
variables to the action variables etc. But now I am so confused.
I just introduced an interceptor element in struts.xml and it
immediately introduced a bug that whatever name I enter, it does
not get displayed in the results page. What a shame?

There is a reason for everything. Struts is not so buggy mind


you. The trainer will explain more on the background of this
behavior

39
Explanation For This Behavior
 Of course it is clear that the purpose of logger interceptor is to record log
messages in the console and hence you see details regarding the action name
etc in the log files
 But how does introducing the logger interceptor introduce a bug like
behavior?
 It should now be clear to you that configuring logger interceptor overrode a
setting that was already present
 That is nothing but the “default” behavior. We just overrode the default
behavior. So the default behavior was no more available

40
Dumbo Vs. Jumbo
I understood but where do I set the default behavior? Is the
setting built in? if I want to reset the default behavior to some
other settings is there no way to do it?

A good question. The answer is “Yes, there is a way”. If you open


struts-core-2.0.14.jar, there will be a file called “struts-default.xml”.
This is the most important file that we should refer to understand the
internals. Here you will find a setting like this
<default-interceptor-ref name="defaultStack"/>
This is where the default is specified. If you want to override this
value with a different default, it can very well be done in struts.xml
itself

41
Dumbo Vs. Jumbo
You are unbelievable man! It is so crystal clear for me now.
However, I see the term Stack being mentioned. Is there any
significance attached to it?

A good question again. There is significance. Let us continue to


listen to the trainer to know more.

42
Interceptor Stack
 One action can be associated with multiple interceptors

 So, in the action configuration you can specify multiple interceptors

 Example:

<interceptor-ref name="logger"/>
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>

43
Dumbo Vs. Jumbo
That’s fine. But in the above case, what is the order of
execution? I hope the order of execution might matter in many
cases

Yes the order matters. The order of execution is the order in which the
interceptors are declared in the struts.xml under the action element.
So, in the above example, first logger interceptor will be executed,
then exception, alias, servlet config and prepare. Am I clear?

44
Dumbo Vs. Jumbo
Yes, you are. Thank you. But my original question of what is the
significance of the term Stack still remains unanswered.

Yes, he is coming there

45
Interceptor Stack (Contd.)
 OK, now that there is a way to configure multiple interceptors for a given
action, the concept of stack is just an extension of this.
 Instead of defining the interceptors one by one in the action element, an
interceptor stack can be defined
 The interceptor stack can then be used in action definitions

 So, in our example, the implementation would be like this:


<interceptor-stack name="myStack">
<interceptor-ref name="logger"/>
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
</interceptor-stack>

46
Interceptor Stack (Contd.)
<action name="helloWorld"
class="com.aigss.training.struts.action.HelloWorldAction">
<interceptor-ref name="myStack"/>
<result name="success">/HelloWorldSuccess.jsp</result>
</action>

47
Dumbo Vs. Jumbo
Its all fine. But I heard that interceptors are normal Java
Classes. But where I see there is just the interceptor name. But
where is the reference to the actual java class. How does the
framework know which java class to execute for a particular
interceptor?

WoW!

Today is your day. You have been asking all gem of questions. The
answer is again struts-default.xml. There is an element called
interceptors under which the following is a typical interceptor
definition:
<interceptor name="logger"
class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"
/>
In the above, class is the java class that will be executed whenever
a logger interceptor is referred

48
Mr. Thinker

The interceptor-ref All interceptor stack


element’s name attribute definitions and interceptor
can refer either to an definitions should be under the
interceptor or a stack also element called <interceptors>

49
Mr. Thinker

The interceptor-stack
element can in turn contain
other stacks as well

50
Exercise
 Dumbo has been jumping all over about a bug

 Your goal is now to make the Hello World project work well again

 A very difficult Hint:


– Define a stack using logger and default Stack
– Then refer this new stack in your action definition
– I am tough guy. You can never get easy clues from me 

51
Exploration of the Magic Box – OGNL / Value
Stack

Interceptors, Value Stack and OGNL are


the three most important concepts of Struts
2
If you become a master in these three, you
will be a master of Struts 2.
We have already seen an overview of
Interceptors. Now let us concentrate our
energy on Value Stack and OGNL

52
Exploration of the Magic Box – OGNL / Value
Stack
PAGE DEVELOPER

I have put the Purchase Order Object into


the session, Invoice Object into the
request scope, asset object into the
application scope. You can take them
from the corresponding scope and then
display it on the screen

Oh my God! Is he mad or what? He has just


scattered the objects all over the place. Now I
need to get the objects from the corresponding
scope and then display it in the screen. So, I
should be using, request.getattribute,
session.getattribute etc. Poor Me!!

BUSINESS LOGIC DEVELOPER


53
Value Stack to your rescue
 The Page Developer’s concern is very valid. There might be a reason behind
the Business Logic Developer putting the variables in various scopes. But it
would be great if the page developer can just retrieve them without
bothering about the scope
 Value Stack is exactly for that purpose

 Value Stack is exactly what it says it is – a stack of objects

 It is just a centralized data store which can be referred by the various layers
of the framework

54
Value Stack Constituents
 The value stack consists of the following objects in the provided order
– Temporary Objects
– Model Object
– Action Object
TEMPORARY OBJECT
– Named Objects
MODEL OBJECT
 Application
 Session ACTION OBJECT

 Request NAMED OBJECT

55
How does Value Stack work?
 If you want the attribute “name”, then you query the value stack for this
attribute.
 Each stack element, in the provided order, is asked whether it has the
property.
 If it does, then the value is returned and we are done.

 If not, then the next element down is queried.

 This continues until the end of the stack is reached.

56
Advantages of Value Stack
• As evident from the above discussion, the main advantage of value stack is
that you don’t care where the value is – the action, the model, or the HTTP
request – you just know that if the value exists it will be returned.

57
Accessing Value Stack – OGNL
 The objects in the value stack are accessed by what is called OGNL

 OGNL is the acronym for Object Graph Notation Language

 OGNL is an expression language

 It is used for getting and setting the properties of Java Objects

58
A Very Simple Example
 Assume that we have an action class called “MyAction”

 Inside that we have an object called “person” with getter and setter methods

 Inside Person class there is an object called “address” with getter and setter
in Person Class
 Inside Address class we have attributes called city, state, zipCode etc and
corresponding getters and setter methods

59
A Very Simple Example

CITY

ADDRESS
PERSON

MY ACTION

VALUE STACK

60
A Very Simple Example (Contd.)
 Now I want to retrieve and display the city attribute in the JSP

 The city is retrieved as follows:


– person.address.city
– Internally OGNL converts this to getPerson( ).getAddress( ).getCity( );
– Please note that we do not explicitly state anywhere that the person
object is in the action class called MyAction
– It is automatically detected by the OGNL in the value stack

 In a nutshell, this is how you would write in JSP


– <s:property value="%{ person.address.city }"/>

61
Dumbo Vs. Jumbo
Wow!! Man. This is really interesting. I didn’t know that it would be
that easy. If not for these value stack, ognl etc my life would have been
tough. I should have retrieved the Person object either from request or
session object and then manually invoked the gettters inside these
objects. Now I am really beginning to appreciate the magic of Struts 2

This is just the beginning. There is still a lot


more to go. Wait and Watch.

62
Dumbo Vs. Jumbo
In one of the previous sessions we talked
about Romeo and Juliet. I think it was about
a concept called Dependency Injection. Was it
just for fun?

If you use your brain you would realize it that we


have already learned Dependency injection in
Struts 2 just now. The Magic Box / Interceptor
does just that.

63
Interceptor

ParamsInterceptor

setMyName
(String myName)

My Action

64
Interceptor (Contd.)
 Is this not dependency injection? This is called Setter Injection.

 The action class just provides a setter method but it expects somebody else
to set the value to this variable called myName
 Promptly the Interceptor does exactly that. The ParamsInterceptor sets the
myName variable by invoking the setter method of the action class
 In one of the future sessions we will also see about another type of
dependency injection

65
Exercise
• The objective is to capture Address Details of a Person and display
them back
Street City
My
Name Address
Zip
Street Code

 The details of the model are given above

 Perform the following;


– Create a JSP page for capturing the person details including the
address
– Display another JSP to display the captured details back to the
user as labels
– You should be knowing what you need to do internally to make
this happen
66
Dumbo Vs. Jumbo
That was easy Jumbo. I have a question now. I Thanks. That would
have done a few exercises and I am already getting help. Good.
bored with the method name execute. This method
as I understand is the most important method that
does all the business logic execution. Is there a
freedom for me to name it as I want?

T hat’s a good question. You are not alone. Many developers feel a little bored
to have the same name. More importantly if I need to use the same action class
for two business logic methods then I have a problem because I cannot name
both of them as execute 
We have a solution for this. You can name the business methods as
doSomething( ) or even something( ).

public String doSomething( ) {


.. .. return “SUCCESS”;
In the action element definition in struts.xml,
<action name=”myClick” class="complete class name" method=”something”>
<result name="success">/someresult.jsp</result
</action>
67
Exercise
• Change the name of the action method as createAddress instead of
execute ( ) and do the other changes required to make it work

68
Session 4

We are coming to the end of an interesting


session on Struts. Now we are really into
Struts
I am sure the trainer has more to offer to you in
the next sessions. We look forward to meeting
you all in the next session Till then its bye from
all here

69
Session 4

Thank You !

70

Вам также может понравиться