Struts 1
Struts 1
* Struts is open source Web Application Framework for developing Java EE web application Developed by Apache in
2000.
* Struts 1 Framework was implemented on MVC 2 architecture and Front Controller Design Pattern.
* Struts mainly deals with Presentation Layer and Controller Layer. Struts does not specify or force any rules related
to model layer.
We can use any thing in Model Layer as per our requirement.
* Struts can interact with standard data access technologies, like JDBC and EJB, as well as most any third-party
packages, like Hibernate, iBATIS, or Object Relational Bridge.
* Struts has 3 Components on Controller Layer ActionServlet, RequestProcessor, Actions.
* For the View, Struts works well with JSP, including JSTL and EL, Struts Tag Library, Message Bundles, Form
Beans as well as Velocity Templates, XSLT, and other presentation systems.
* Struts provide various Tag Libraries for different purpose.
* It was originally created by Craig McClanahan and donated to the Apache Foundation in May, 2000.
Advantage of Struts :
Thread Safe
* We can replace ActionServlet & RequestProcessor class with our own class.
* ActionForm class Object creation One per Session / Request when scope is Session / Request.
ActionServlet:-
2)RequestProcessor :-
RequesrProcessor is responsible for receiving the request, processing the request completely and delivers the response
to client.
1) request.getrequestURI()
2) ActionMapping processMapping(HttpServletRequest req,HttpServletResponse res,URI)
3) ActionForm processActionForm(HttpServletRequest req,HttpServletResponse res,ActionMapping)
4) void processPopulate(HttpServletRequest req,HttpServletResponse res,ActionForm,ActionMapping)
5) boolean processValidate(HttpServletRequest req,HttpServletResponse res,ActionForm,ActionMapping)
6) Action processActionCreate(HttpServletRequest req,HttpServletResponse res,ActionMapping)
7) ActionForward processActionPerform(HttpServletRequest req,HttpServletResponse res,Action,ActionForm,
ActionMapping)
8) ActionForward processException(HttpServletRequest req,HttpServletResponse res,Exception,ActionForm,
ActionMapping)
Or
boolean processForward(HttpServletRequest req,HttpServletResponse res,ActionMapping)
3)Actions :-
Action is the last component in the controller layer from where business layer starts.
Action class you are writing may be subclass of one the following built-in Actions.
1. Action
2. Dispatch Action
3. Lookup Dispatch Action
4. Mapping Dispatch Action
5. IncludeAction
6. ForwardAction
7. switch Action
8. LocaleAction
9. DownloadAction
ActionServlet :
import org.apache.struts.action.ActionServlet;
public class ActionServlet extends HttpServlet{}
ActionServlet provides the "controller" in the MVC design pattern for web applications that is commonly
known as "Model 2".
ActionServlet is responsible for initializing Struts Configuration document (sturts-config.xml).
Receiving the request and delegating to RequestProcessor.
RequestProcessor :
import org.apache.struts.action.RequestProcessor;
public class RequestProcessor extends Object{}
* RequestProcessor contains the processing logic that the ActionServlet performs as it receives each servlet request
from the container.
* RequestProcessor is responsible for receiving the request, processing the request completely and delivers the
response to the client.
* We can customize the request processing behavior by subclassing this class and overriding the method(s) whose
behavior we are interested in changing.
ActionMapping :
import org.apache.struts.action.ActionMapping;
public class ActionMapping extends ActionConfig{}
* An ActionMapping represents the information that the controller, RequestProcessor, knows about the mapping of a
particular request to an instance of a particular Action class.
* The ActionMapping instance used to select a particular Action is passed on to that Action, thereby providing access
to any custom configuration information included with the ActionMapping object.
ActionForward :
import org.apache.struts.action.ActionForward;
public class ActionForward extends ForwardConfig{}
* An ActionForward represents a destination to which the controller, RequestProcessor, might be directed to perform
a
RequestDispatcher.forward or HttpServletResponse.sendRedirect to, as a result of processing activities of an Action
class.
* Instances of this class may be created dynamically as necessary, or configured in association with an
ActionMapping instance for named
lookup of potentially multiple destinations for a particular mapping instance.
ActionErrors :
import org.apache.struts.action.ActionErrors;
public class ActionErrors extends ActionMessages implements Serializable {}
* A class that encapsulates the error messages being reported by the validate() method of an ActionForm. Validation
errors are either global to the entireActionForm bean they are associated with, or they are specific to a particular
bean property (and, therefore, a particular input field on the corresponding form).
* Each individual error is described by an ActionMessage object, which contains a message key (to be looked up in an
appropriate message resources database), and up to four placeholder arguments used for parametric substitution in
the resulting message.
IMPLEMENTATION NOTE - It is assumed that these objects are created and manipulated only within the context of a
single thread. Therefore, no synchronization is required for access to internal collections.
ActionMessage :
import org.apache.struts.action.ActionMessage;
public class ActionMessage extends Object implements Serializable {}
An encapsulation of an individual message returned by the validate method of an ActionForm, consisting of a
message key (to be used to look up message text in an appropriate message resources database) plus up to four
placeholder objects that can be used for parametric replacement in the message text.
ActionMessages :
import org.apache.struts.action.ActionMessages;
public class ActionMessages extends Object implements Serializable {}
A class that encapsulates messages. Messages can be either global or they are specific to a particular bean property.
Each individual message is described by an ActionMessage object, which contains a message key (to be looked up in
an appropriate message resources database), and up to four placeholder arguments used for parametric substitution
in the resulting message.
IMPLEMENTATION NOTE - It is assumed that these objects are created and manipulated only within the context of
a single thread. Therefore, no synchronization is required for access to internal collections.
import org.apache.struts.action.ActionForm;
class LoginForm extends ActionForm{
import org.apache.struts.action.Action;
class LoginAction extends Action{
public ActionForward execute(ActionMapping, ActionForm, HttpServletRequest,
HttpServletResponse)throws Exception{
return ActionMapping.findForward(String);
}
}
Web.xml
<web-app>
<display-name>JLC_Lab1</display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class> org.apache.struts.action.ActionServlet </servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml,/WEB-INF/jlcindia-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<data-sources>
<data-source></data-source>
</data-sources>
<form-beans>
<form-bean name="loginForm" type="com.jlcindia.LoginForm"/>
</form-beans>
<global-exceptions>
<exception key="errors.bidsearch.bid.notfound"
path="/bidSearch.jps"
type="com.jlcindia.BatchIDNotFoundException"/>
</global-exceptions>
<global-forwards>
<forward name="success" path="/home.jsp"/>
</global-forwards>
<action-mappings>
<action path="/loginSubmit"
name="loginForm"
type="com.jlcindia.LoginAction"
scope="request"
validate="true"
input="/login.jsp">
<forward name= path=/>
<exception key= type= path=/>
</action>
</action-mappings>
<controller/>
<message-resources parameter="com.jlcindia.MyMessage"/>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property value="/WEB-INF/validator-rules.xml, /WEB-INF/myform-validations.xml" property="pathnames"/>
<plug-in className=org.apache.struts.tiles.Tilesplugin>
<set-property value=/WEB-INF/tiles.xml property=definitions-config/>
</plug-in>
</plug-in>
</struts-config>
When I start the Server after deploying struts based web application, then following tasks will happen at
container start up.
When you request for resource (login.jsp) then following things will happen.
When you submit the Form(login.jsp) then following things will happen.
7. If matching form bean is found then RequestProcessor takes the Form bean type which is the Form bean java
class.
8. RequestProcessor starts the Form bean lifecycle.
a. Creates or retrieves the Form bean object.
b. Calls the reset() method.
c. Collects the data from client submitted request and stores the Form bean object by calling setter
methods.
d. Invokes the validate() method.
e. If ActionErrors object contains any ActionError objects then takes the input jsp and forwards to
client with error messages.
f. If ActionErrors object does not contain any ActionError objects the RequestProcessor takes action
type.
9. Creates or retrieves the Action class object.
10. Invokes execute() method.
11. Execute() method may return ActionForward object on the successful completion or Exception.
12. RequestProcessor identifies the JSP related to ActionForward object returned or Exception thrown by
execute() method.
13. Identified JSP will be rendered to Client.
Steps:-
1) Write the Required User-defined Exception
<struts-config>
<form-beans>
<form-bean name="bidSearchForm" type="com.jlcindia.struts1.BidSearchForm" />
</form-beans>
<action-mappings>
<action path="/BidSubmit" name="bidSearchForm"
type="com.jlcindia.struts1.BidSearchAction" scope="session" validate="true"
input="/bidsearch.jsp">
<exception type="com.jlcindia.struts1.BatchIDNotFoundException"
path="/bidsearch.jsp"
key="errors.bidsearch.bid.notfound" />
Struts Layers:-
Struts mainly deals with presentation layer and Controller layer.
Struts does not specify or force any rules related to model layer.
You can use any thing in model layer as per your requirement.
You can implement the following components in the presentation layer of sturts application.
1) JSP element
2) EL (expression language)
3) JSTL
4) Struts Tag Library
5) Message Bundles
6) Form Beans
Message Bundles:-
Message Bundle is nothing but a property file where you can define key-value pairs.
Message Bundle can used to centralize two types of Message.
1) Labels
2) Error Messages by validation
A) Labels :-
b) Use the key to create the ActionError Object when you are adding ActionError Object to ActionErrors
Object.
1) ActionForm
2) DynaActionForm
3) ValidatorForm
4) DynaValidatorForm
5) ValidatorActionForm
6) .DynaValidatorActionForm
import org.apache.struts.action.DynaActionForm;
public class DynaActionForm extends ActionForm implements DynaBean{}
Specialized subclass of ActionForm that allows the creation of form beans with dynamic sets of properties, without requiring
the developer to create a Java class for each type of form bean.
import org.apache.struts.validator.ValidatorForm;
public class ValidatorForm extends ActionForm implements Serializable{}
This class extends ActionForm and provides basic field validation based on an XML file. The key passed into the validator is
the action element's 'name' attribute from the struts-config.xml which should match the form element's name attribute in the
validation.xml.
import org.apache.struts.validator.DynaValidatorForm;
public class DynaValidatorForm extends DynaActionForm implements DynaBean, Serializable{}
This class extends DynaActionForm and provides basic field validation based on an XML file. The key passed into the
validator is the action element's 'name' attribute from the struts-config.xml which should match the form element's name
attribute in the validation.xml.
import org.apache.struts.validator.ValidatorActionForm;
public class ValidatorActionForm extends ValidatorForm implements Serializable{}
This class extends ValidatorForm and provides basic field validation based on an XML file. The key passed into the validator
is the action element's 'path' attribute from the struts-config.xml which should match the form element's name attribute in the
validation.xml.
import org.apache.struts.validator.DynaValidatorActionForm;
public class DynaValidatorActionForm extends DynaValidatorForm implements DynaBean, Serializable{}
This class extends DynaValidatorForm and provides basic field validation based on an XML file. The key passed into the
validator is the action element's 'path' attribute from the struts-config.xml which should match the form element's name
attribute in the validation.xml.
Struts Validation :
Struts Framework provides the functionality to validate the form data. It can be use to validate the data on the users
browser as well as on the server side. Struts provides two ways to perform Validations on input data :
1. Basic Validation (through validate() method)
2. Validation Framework Validations.
Basic Validations :-
when you write the validation logic inside the validate() method of form bean java class
then those are called as Basic validations.
validate() method signature must be as follows.
public ActionErrors validate(ActionMapping, HttpServletRequest)
<plug-in className=org.apache.struts.validator.ValidatorPlugIn>
<set-property property=pathnames value=/WEB-INF/validator-rules.xml,/WEB-INF/myform-
validator.xml>
</plug-in>
You hava to specify the validations required for various fileds of your form.
Steps:-
2) Specify the validations required for various fields of login form in myform-validations.xml
<form name=loginForm>
<field property=username depends=required>
<arg0 key=login.un resource=true/>
</field>
<field property=password depends=required>
<arg0 key=Password resource=false/>
</field>
}
Note:
We can use there validation Framework with
1. ValidatorForm,
2. DynaValidatorForm,
3. ValidatorActionForm,
4. DynaValidatorActionForm
Form name:sidSearchForm
Sid:required,sidformat
5) Specify the validation required for various fields in myform-validations.xml
<form name=bidSearchForm>
<field Proeprty=bid depends=required,bidformate>
<arg0 key=BatchId resource=false/>
</field>
</form>
<form name=sidSearchForm>
<field Proeprty=sid depends=required,sidformate>
<arg0 key=StudentId resource=false/>
</field>
</form>
}
8) To display errors in jsp, use <html:errors/>
Form Bean:
Form bean is Container of Data
Form bean can be in three scopes.
1) Request
2) Session
3) Application
1
Static/Dynamic Static Dynamic Static Dynamic Static Dynamic
2
Fields declaration in YES NO YES NO YES NO
class
3
Fields declaration in NO YES NO YES NO YES
XML
4
reset() method YES NO(initial YES NO(initial YES NO(initial
attribute) attribute) attribute)
5
Validate() method YES NO YES NO YES NO
6
Validations Basic NA Basic and VF VF Validations Basic and VF VF Validations
Validati Validations Validations
ons
7
Validation Binding NA NA Form bean Form bean Action path Action path
name name value value
Tiles Framework :
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property value="WEB-INF/tiles.xml" property="definitions-config"/>
</plug-in>
tiles.xml should be in WIB-INF folder and will contain various Tiles Definitions.
<tiles-definitions>
<definition name= >
</tiles-definitions>
Tiles Framework is mainly a Layout design framework which allows you to centerlize the web page
Layouts,text formats,styles required etc
* in struts-config.xml
<action path=/sidSubmit
name=sidForm
type=org.springframework.web.struts.DelegatingActionProxy
input=/sidSearch.jsp/>
<plug-in className=org.springframework.web.struts.ContextLoaderPlugIn>
<set-property property=contextConfigLocation
value=/WEB-INF/studentContext.xml/>
</plug-in>
* Bean:message is to display message from .propertiesfile. Bean:write this tag is used to output bean property value from
bean property.
Can you explain the directory structure for a struts folder in brief ?
Answers : Below are the folders from point of view of root folder.
3 META-INF: - This directory has the Meta information.
WEB-INF/classes: - This location has the actual JAVA classes.
WEB-INF/classes/ApplicationResources.properties:- Contains text which application can
use. For instance error messages.
WEB-INF/lib/struts.jar:- Contains the Struts servlet, helper classes, taglib code etc.
WEB-INF/*.tld:- The Struts tag libraries.
WEB-INF/struts-config.xml:- A Struts configuration file.
WEB-INF/web.xml:- Configuration file for the servlet container
Index.jsp:- All JSP files come in the root directory as this one Index.jsp.
ActionServlet?
ActionServlet is a simple servlet which is the backbone of all Struts applications. It is the main Controller component that
handles client requests and determines which Action will process each received request. It serves as an Action factory
creating specific Action classes based on users request.
ActionErrors: A class that encapsulates the error messages being reported by the validate() method of an ActionForm.
Validation errors are either global to the entire ActionForm bean they are associated with, or they are specific to a particular
bean property (and, therefore, a particular input field on the corresponding form).
key="database.error.duplicate"
path="/UserExists.jsp"
type="mybank.account.DuplicateUserException"/>
b) Programmatic Exception Handling: Here you can use try{}catch{} block to handle the exception.
Question: What is the difference between perform() and execute() methods?
Answer: Perform method is the method which was deprecated in the Struts Version 1.1. In Struts 1.x, Action.perform() is
the method called by the ActionServlet. This is typically where your business logic resides, or at least the flow control to
your JavaBeans and EJBs that handle your business logic. As we already mentioned, to support declarative exception
handling, the method signature changed in perform. Now execute just throws Exception. Action.perform() is now
deprecated; however, the Struts v1.1 ActionServlet is smart enough to know whether or not it should call perform or execute
in the Action, depending on which one is available.
An action can perform tasks such as validating a user name and password.
An action mapping is a configuration file entry that, in general, associates an action name with an action. An action mapping
can contain a reference to a form bean that the action can use, and can additionally define a list of local forwards that is
visible only to this action.
An action servlet is a servlet that is started by the servlet container of a Web server to process a request that invokes an
action. The servlet receives a forward from the action and asks the servlet container to pass the request to the forward's URL.
An action servlet must be an instance of an org.apache.struts.action.ActionServlet class or of a subclass of that class. An
action servlet is the primary component of the controller.
DispatchAction selects the method to execute LookupDispatchAction looks into the resource
depending on the request parameter value bundle file and find out the corresponding key
which is configured in the xml file. name. We can map this key name to a method
name by overriding the getKeyMethodMap()
method.
DispatchAction is not useful for I18N LookupDispatchAction is used for I18N
reset(): reset() method is called by Struts Framework with each request that uses the defined ActionForm. The purpose of
this method is to reset all of the ActionForm's data members prior to the new request values being set.
Example :
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.password = null;
this.username = null;
}
Question 8: How you will make available any Message Resources Definitions file to the Struts Framework
Environment?
Ans: Message Resources Definitions file are simple .properties files and these files contains the messages that can be used in
the struts project. Message Resources Definitions files can be added to the struts-config.xml file through < message-
resources / > tag. Example: < message-resources parameter= MessageResources / >
Message resource definition files can available to the struts environment in two ways
1. using web.xml as
<servlet>
<servlet-name>action<servlet-name>
servlet-class>org.apache.struts.action.ActionServlet<servlet-class>
<init-param>
<param-name>application<param-name>
<param-value>resource.Application<param-value>
</servlet>
2.
<message-resource key="myResorce" parameter="resource.Application" null="false">
1.What is MVC?
Model-View-Controller (MVC) is a design pattern put together to help control change. MVC decouples interface
from business logic and data.
Model : The model contains the core of the application's functionality. The model encapsulates the state of
the application. Sometimes the only functionality it contains is state. It knows nothing about the view or
controller.
View: The view provides the presentation of the model. It is the look of the application. The view can
access the model getters, but it has no knowledge of the setters. In addition, it knows nothing about the
controller. The view should be notified when changes to the model occur.
Controller:The controller reacts to the user input. It creates and sets the model.
2.What is a framework?
A framework is made up of the set of classes which allow us to use a library in a best possible way for a specific
requirement.
3.What is Struts framework?
Struts framework is an open-source framework for developing the web applications in Java EE, based on MVC-2
architecture. It uses and extends the Java Servlet API. Struts is robust architecture and can be used for the
development of application of any size. Struts framework makes it much easier to design scalable, reliable Web
applications with Java.
4.What are the components of Struts?
Struts components can be categorize into Model, View and Controller:
Model: Components like business logic /business processes and data are the part of model.
View: HTML, JSP are the view components.
Controller: Action Servlet of Struts is part of Controller components which works as front controller to
handle all the requests.
6.What is ActionServlet?
ActionServlet is a simple servlet which is the backbone of all Struts applications. It is the main Controller
component that handles client requests and determines which Action will process each received request. It serves
as an Action factory creating specific Action classes based on users request.
reset(): reset() method is called by Struts Framework with each request that uses the defined ActionForm. The
purpose of this method is to reset all of the ActionForm's data members prior to the new request values being set.
11.What is ActionMapping?
Action mapping contains all the deployment information for a particular Action bean. This class is to determine
where the results of the Action will be sent once its processing is complete.
<action-mappings>
<action path="/submit"
type="submit.SubmitAction"
name="submitForm"
input="/submit.jsp"
scope="request"
validate="true">
<forward name="success" path="/success.jsp"/>
<forward name="failure" path="/error.jsp"/>
</action>
</action-mappings>
16.Can we have more than one struts-config.xml file for a single Struts application?
Yes, we can have more than one struts-config.xml for a single Struts application. They can be configured as
follows:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml,
/WEB-INF/struts-admin.xml,
/WEB-INF/struts-config-forms.xml
</param-value>
</init-param>
.....
<servlet>
18.What is the difference between session scope and request scope when saving formbean ?
when the scope is request,the values of formbean would be available for the current request.
when the scope is session,the values of formbean would be available throughout the session.
19.What are the important tags of struts-config.xml ?
The five important sections are:
20.What are the different kinds of actions in Struts?
The different kinds of actions in Struts are:
ForwardAction
IncludeAction
DispatchAction
LookupDispatchAction
SwitchAction
21.What is DispatchAction?
The DispatchAction class is used to group related actions into one class. Using this class, you can have a method
for each logical action compared than a single execute method. The DispatchAction dispatches to one of the
logical actions represented by the methods. It picks a method to invoke based on an incoming request parameter.
The value of the incoming parameter is the name of the method that the DispatchAction will invoke.
24.What is IncludeAction?
The IncludeAction class is useful when you want to integrate Struts into an application that uses Servlets. Use the
IncludeAction class to include another resource in the response to the request being processed.
26.What is LookupDispatchAction?
The LookupDispatchAction is a subclass of DispatchAction. It does a reverse lookup on the resource bundle to get
the key and then gets the method whose name is associated with the key into the Resource Bundle.
29.What is SwitchAction?
The SwitchAction class provides a means to switch from a resource in one module to another resource in a
different module. SwitchAction is useful only if you have multiple modules in your Struts application. The
SwitchAction class can be used as is, without extending.
30.What if <action> element has <forward> declaration with same name as global forward?
In this case the global forward is not used. Instead the <action> elements<forward> takes precendence.
31.What is DynaActionForm?
A specialized subclass of ActionForm that allows the creation of form beans with dynamic sets of properties
(configured in configuration file), without requiring the developer to create a Java class for each type of form
bean.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
Explicit try/catch blocks in any code that can throw exception. It works well when custom value (i.e., of
variable) needed when error occurs.
Declarative exception handling :You can either define <global-exceptions> handling tags in yourstruts-
config.xml or define the exception handling tags within <action></action> tag. It works well when custom
page needed when error occurs. This approach applies only to exceptions thrown by Actions.
<global-exceptions>
<exception key="some.key"
type="java.lang.NullPointerException"
path="/WEB-INF/errors/null.jsp"/>
</global-exceptions>
or
<exception key="some.key"
type="package.SomeException"
path="/WEB-INF/somepage.jsp"/>
38.What is difference between ActionForm and DynaActionForm?
An ActionForm represents an HTML form that the user interacts with over one or more pages. You will
provide properties to hold the state of the form with getters and setters to access them. Whereas,
usingDynaActionForm there is no need of providing properties to hold the state. Instead these properties
and their type are declared in the struts-config.xml
The DynaActionForm bloats up the Struts config file with the xml based definition. This gets annoying as
the Struts Config file grow larger.
The DynaActionForm is not strongly typed as the ActionForm. This means there is no compile time
checking for the form fields. Detecting them at runtime is painful and makes you go through redeployment.
ActionForm can be cleanly organized in packages as against the flat organization in the Struts Config file.
ActionForm were designed to act as a Firewall between HTTP and the Action classes, i.e. isolate and
encapsulate the HTTP request parameters from direct use in Actions. With DynaActionForm, the property
access is no different than using request.getParameter( .. ).
DynaActionForm construction at runtime requires a lot of Java Reflection (Introspection) machinery that
can be avoided.
39.How can we make message resources definitions file available to the Struts framework environment?
We can make message resources definitions file (properties file) available to Struts framework environment by
adding this file tostruts-config.xml.
<message-resources parameter="com.login.struts.ApplicationResources"/>
Struts
Q 1. What is MVC?
Model-View-Controller (MVC) is a design pattern put together to help control change. MVC decouples interface from
business logic and data.
Model: The model contains the core of the application's functionality. The model enca psulates the state of the application.
Sometimes the only functionality it contains is state. It knows nothing about the view or controller.
View: The view provides the presentation of the model. It is the look of the application. The view can access the model
getters, but it has no knowledge of the setters. In addition, it knows nothing about the controller. The view should be notified
when changes to the model occur.
Controller: The controller reacts to the user input. It creates and sets the model.
Q 2. What is a framework?
Framework is made up of the set of classes which allow us to use a library y in a best possible way for a specific
requirement.
Struts framework is an open-source framework for developing the web applications in Java EE, based on MVC-2
architecture. It uses and extends the Java Servlet API. Struts is robust architecture and can be used for the development of
application
of any size. Struts framework makes it much easier to design scalable, reliable Web applications with Java. Struts provides
its own Controller component and integrates with other technologies to provide the Model and the View. For the Model,
Struts can interact with standard data access technologies, like JDBC and EJB, as well as most any third-party packages, like
Hibernate, iBATIS, or Object Relational Bridge. For the View, Struts works well with JavaServer Pages, including JSTL and
JSF, as well as Velocity Templates, XSLT, and other presentation systems.
Jakarta Struts is open source implementation of MVC (Model-View-Controller) pattern for the development of web based
applications. Jakarta Struts is robust architecture and can be used for the development of application of any size. Struts
framework makes it much easier to design scalable, reliable Web applications with Java.
Q 5. What is ActionServlet?
The class org.apache.struts.action.ActionServlet is the called the ActionServlet. In the the Jakarta Struts Framework this
class plays the role of controller. All the requests to the server
goes through the controller. Controller is responsible for handling all the requests.
Any java class which extends from org.apache.struts.action.Action is called Action class. The Action is part of the controller.
The purpose of Action Class is to translate the HttpServletRequest to the business logic. To use the Action, we need to
Subclass and overwrite the execute() method. The ActionServlet (commad) passes the parameterized class to Action Form
using the execute() method. There should be no database interactions in the action. The action should receive the request, call
business objects (which then handle database, or interface with J2EE, etc) and then determine where to go next. Even better,
the business objects could be handed to the action at runtime (IoC style) thus removing any dependencies on the model. The
return type of the execute method is ActionForward which is used by the Struts Framework to forward the request to the file
as per the value of the returned ActionForward object..
package com.durgasoft;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class TestAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception
{
return mapping.findForward("success");
}
}
Q 9. What is ActionForm?
Any java class which extends from org.apache.struts.action.ActionForm is called ActionForm. An ActionForm is also
called JavaBean. ActionForm maintains the session state for web application and the ActionForm object is automatically
populated on the server side with data entered from a form on the client side.
Struts Framework provides the functionality to validate the form data. It can be use to validate the data on the users browser
as well as on the server side. Struts Framework emits the java scripts and it can be used validate the form data on the client
browser. Server side validation of form can be accomplished by sub classing your From Bean
with DynaValidatorForm class.
The Validator framework was developed by David Winterfeldt as third-party add-on to Struts. Now the Validator framework
is a part of Jakarta Commons project and it can be used with or without Struts. The Validator framework comes integrated
with the Struts Framework and can be used without doing any extra settings.
Q11. How you will display validation fail errors on jsp page?
The controller is responsible for intercepting and translating user input into actions to be performed by the model. The
controller is responsible for selecting the next view based on user input and the outcome of model operations. The Controller
receives the request from the browser, invoke a business operation and coordinating the view to return to the client.The
controller is implemented by a java servlet, this servlet is centralized point of control for the web application. In struts
framework the controller responsibilities are implemented by several different components like
The ActionServlet Class
The RequestProcessor Class
The Action Class
The ActionServlet extends the javax.servlet.http.httpServlet class. The ActionServlet class is not abstract and therefore can
be used as a concrete controller by your application.
The controller is implemented by the ActionServlet class. All incoming requests are mapped to the central controller in the
deployment descriptor as follows.
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
All request URIs with the pattern *.do are mapped to this servlet in the deployment descriptor as follows.
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
<servlet-mapping>
A request URI that matches this pattern will have the following form.
http://localhost:8080/mycontext/actionName.do
The preceding mapping is called extension mapping, however, you can also specify path mapping where a pattern ends
with /* as shown below.
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/do/*</url-pattern>
<url-pattern>*.do</url-pattern>
A request URI that matches this pattern will have the following form.
http://localhost:8080/mycontext/do/action_Name The class
org.apache.struts.action.requestProcessor process the request from the controller. You can sublass the RequestProcessor with
your own version and modify how the request is processed.
Once the controller receives a client request, it delegates the handling of the request to a helper class. This helper knows how
to execute the business operation associated with the requested action. In the Struts framework this helper class is descended
of org.apache.struts.action.Action class. It acts as a bridge between a client-side user action and business operation. The
Action class decouples the client request from the business model. This decoupling allows for more than one-to-one mapping
between the user request and an action. The Action class also can perform other functions such as authorization, logging
before invoking business operation. the Struts Action class contains several methods, but most important method is the
execute() method.
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception
The execute() method is called by the controller when a request is received from a client. The controller creates an
instance of the Action class if one doesn?t already exist. The strut framework will create only a single instance of each
Action class in your application.
Action are mapped in the struts configuration file and this configuration is loaded into memory at startup and made
available to the framework at runtime. Each Action element is represented in memory by an instance of the
org.apache.struts.action. ActionMapping class. The ActionMapping object contains a path attribute that is matched against a
portion of the URI of the incoming request.
<action>
path= "/somerequest"
type="com.somepackage.someAction"
scope="request"
name="someForm"
validate="true"
input="somejsp.jsp"
<forward name="Success" path="/action/xys" redirect="true"/>
<forward name="Failure" path="/somejsp.jsp" redirect="true"/>
</action>
Once this is done the controller should determine which view to return to the client. The execute method signature in
Action class has a return type org.apache. struts.action.ActionForward class. The ActionForward class represents a
destination to which the controller may send control once an action has completed. Instead of specifying an actual JSP page
in the code, you can declaratively associate as action forward through out the application. The action forward are specified in
the configuration file.
<action>
path= "/somerequest"
type="com.somepackage.someAction"
scope="request"
name="someForm"
validate="true"
input="somejsp.jsp"
<forward name="Success" path="/action/xys" redirect="true"/>
<forward name="Failure" path="/somejsp.jsp" redirect="true"/>
</action>
The action forward mappings also can be specified in a global section, independent of any specific action mapping.
<global-forwards>
<forward name="Success" path="/action/somejsp.jsp" />
<forward name="Failure" path="/someotherjsp.jsp" />
</global-forwards>
Example:
<exception
key="database.error.duplicate"
path="/UserExists.jsp"
type="mybank.account.DuplicateUserException"/>
b) Programmatic Exception Handling: Here you can use try{}catch{} block to handle the exception.
The DispatchAction class is used to group related actions into one class. Using this class, you can have a method for
each logical action compared than a single execute method. The DispatchAction dispatches to one of the logical actions
represented by the methods. It picks a method to invoke based on an incoming request parameter. The value of the incoming
parameter is the name of the method that the DispatchAction will invoke.
LookupDispatchAction is useful if the method name in the Action is not driven by its name in the front end, but by the
Locale independent key into the resource bundle. Since the key is always the same, the LookupDispatchAction shields your
application from the side effects of I18N.
The difference between LookupDispatchAction and DispatchAction is that the actual method that gets called in
LookupDispatchAction is based on a lookup of a key value instead of specifying the method name directly.
The SwitchAction class provides a means to switch from a resource in one module to another resource in a different module.
SwitchAction is useful only if you have multiple modules in your Struts application. The SwitchAction class can be used as
is, without extending.
Q21. What if <action> element has <forward> declaration with same name as global forward?
In this case the global forward is not used. Instead the <action> elements <forward> takes precendence.
An ActionForm represents an HTML form that the user interacts with over one or more pages. You will provide properties to
hold the state of the form with getters and setters to access them. Whereas, using DynaActionForm there is no need of
providing properties to hold the state. Instead these properties and their type are declared in the struts-config.xml.
The DynaActionForm bloats up the Struts config file with the xml based definition. This gets annoying as the Struts Config
file grow larger.
The DynaActionForm is not strongly typed as the ActionForm. This means there is no compile time checking for the form
fields. Detecting them at runtime is painful and makes you go through redeployment.
ActionForm can be cleanly organized in packages as against the flat organization in the Struts Config file.
ActionForm were designed to act as a Firewall between HTTP and the Action classes, i.e. isolate and encapsulate the HTTP
request parameters from direct use in Actions. With DynaActionForm, the property access is no different than using
request.get Parameter( .. ).
DynaActionForm construction at runtime requires a lot of Java Reflection (Introspection) machinery that can be
avoided.
<struts-config>
<!-- ========== Form Bean Definitions ============ -->
<form-beans>
<form-bean name="login" type=" LoginForm" />
</form-beans>
<!-- ========== Global Forward Definitions ========= -->
<global-forwards>
</global-forwards>
<!-- ========== Action Mapping Definitions ======== -->
<action-mappings>
<action
path="/login"
type="LoginAction" >
</action>
</action-mappings>
<!-- ========== Properties Definitions ============ -->
<message-resources parameter="MessageResources" />
<!-- ========== Validator framework Definitions ============ -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
</struts-config>
A: Core classes of Struts Framework are ActionForm, Action, ActionMapping, Action Forward, ActionServlet etc.
Q29. How you will enable front-end validation based on the xml in validation.xml?
The <html:javascript> tag to allow front-end validation based on the xml in validation.xml. For example the code:
<html:javascript formName="logonForm" dynamicJavascript="true" staticJavascript="true" /> generates the client side java
script for the form "logonForm" as defined in the validation.xml file. The <html:javascript> when added in the jsp file
generates the client site validation script.
<form-bean name="loginForm"
type="org.apache.struts.action.DynaActionForm" >
<form-property name="userName" type="java.lang.String"/>
<form-property name="password" type="java.lang.String" />
</form-bean>
In your Action subclass that uses your form bean:
o import org.apache.struts.action.DynaActionForm
o downcast the ActionForm parameter in execute() to a DynaActionForm
o access the form fields with get(field) rather than getField()
The ActionServlet plays the role of controller wich is responsible for handling the request and selecting the correct
Application Module and storing ApplicationConfig and MessageResource bundle in the request object.
If we modify the ActionServlet the Controller may or may not work what happens that depends on your modification, You
have not specify whether you want to create your own custom ActionServlet by extending ActionServlet and overriding the
methods in it or what exactly you want to modify.