struts ppt
TRANSCRIPT
1
Struts an MVC framework
Prasad Chaturvedula
2
Introduction
Components of a struts app
Impact on development lifecycle
Best Practices
3
Struts Framework provides the Controller portion of the application
Receives requests from the client, decide what business logic function to perform, and delegate responsibility for producing the next phase of the user interface to an appropriate View component
4
Background
Components of a struts app The Action Servlet
The config file
ActionMapping
The Action Form
The Action Class
Action Errors and Validation framework
5
Data subsets
Action Servlet A normal servlet with some processing methods
thrown in to load config files and resource files
Reads config file and converts XML tagged information into copncrete Java objects using Digester
Delegates handling of a request to the Request Processor
Servlet Initialization parameters
configFile, configFactory, appResources
6
Road Ahead
<!-- Standard Action Servlet Configuration --><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</param-value> </init-param></servlet>
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern></servlet-mapping>
7
Road Ahead
This servlet is responsible for handing all the request for the Struts Framework, user can map the specific pattern of request to the ActionServlet. <servlet-mapping> tag in the web.xml file specifies the url pattern to be handled by the servlet
The above mapping maps all the requests ending with .do to the ActionServlet. ActionServlet uses the configuration defined in struts-config.xml file to decide the destination of the request. Action Mapping Definitions is used to map any action
8
Why bother?
RequestProcessor Identify, from the incoming request URI, the substring
that will be used to select an action procedure.
Use this substring to map to the Java class name of the corresponding action class
If this is the first request for a particular <code>Action</code> class, instantiate an instance of that class and cache it for future use.
Only 1 instance of the Action class for all requests
9
Work Flow
RequestProcessor contd Optionally populate the properties of an ActionForm bean
associated with this mapping.
Call the execute method of this Action class, passing on a reference to the mapping that was used, the relevant form-bean (if any), and the request and the response that were passed to the controller by the servlet container (thereby providing access to any specialized properties of the mapping itself as well as to the ServletContext).
10
Add-Ons
RequestProcessor Internals Process method called by ActionServlet Process calls a series of processXXX methods which perform
pre-defined preprocessing processActionCreate processActionForm processPopulate processValidate processActionPerform processException processForward processForwardConfig .
11
Road Ahead
The struts-config.xml file
Used to define and initialize resources like
ActionForms to collect input from users
ActionMappings to direct input to server-side Actions
ActionForwards to select output pages
DataSources for DB connections
Global Forwards
Global Exceptions
12
Road Ahead
ActionMapping
<action path="/TestAction" type=“com.wc.actions.TestAction">
name="AddressForm" scope="request" validate="true" input="/pages/Address.jsp">
<forward name=“success" path="/pages/TestAction.jsp"/>
<forward name=“failure" path="/error/Error.jsp"/>
</action>
13
An ActionMapping defines a path that is matched against the request URI of the incoming request and usually specifies the fully qualified class name of an Action class
Contains where the request is coming from (sourcePage)
the name fo the ActionForm containing the user input
The Action class which should handle this request
The destination resource(s)
14
ActionForm
Encapsulates User input
Makes it easy to store and validate the data for an application's input forms
The framework sets the ActionForm's properties from the request parameters and sends the validated form to the
appropriate Action's execute method
Forget code like Integer.parseInt(request.getParameter
(“something”));
15
Action Class Has 2 methods-
public ActionForward execute(ActionMapping mapping, ActionForm form,
ServletRequest request, ServletResponse response)
throws Exception;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse
response) throws Exception
16
Action Class Typical functionality contd..
Validate the current state of the user's session (for example, checking that the user has successfully logged on)
Validat form data, store the appropriate error message keys as a request attribute, and forward control back to the input form so that the errors can be corrected
17
Action class Typical functionality contd…
Perform the processing required to deal with this request
Update the server-side objects that will be used to create the next page of the user interface (typically request scope or session scope beans)
Return an appropriate ActionForward object that identifies the presentation page to be used to generate this response, based on the newly updated beans.
18
The Struts Framework – Architecture
19
Exception Handling
Define global exception handlers to execute when an Action class throws an Exception
Used to group generic exceptions in an application
Framewor takes care of forwarding to appropriate JSP on occurrence
20
Exception Handling contd
<global-exceptions>
<exception key="some.key"
type="java.io.IOException"
handler="com.yourcorp.
ExceptionHandler"/>
</global-exceptions>
21
Global Forwards
Forwards are instances of the ActionForward class returned from an Action's execute method
Map logical names to specific resources (typically JSPs), allowing you to change the resource without changing references to it throughout your application.
Typical usage- Forwarding to login pages
22
Global Forwards contd
<global-forwards type="org.apache.struts.action.ActionFor
ward">
<forward name="logon" path="/logon.jsp"
redirect="false" />
</global-forwards>
23
Struts validation framework
A single definition of validation rules for an application
Validation rules are loosely coupled to the application
Supports Internationalization.
Supports regular expressions
24
Struts validator framework contd…
validator.-rules.xml- defines the rule to be applied
Example- “required”
<validator name="required" classname="org.apache.struts.util.StrutsValidator"
method="validateRequired"
methodparams=“” msg="errors.required"/>
25
Struts validator framework contd…validaton.xml- tie the rule to the ActionForm<form-validation>
<formset>
<form name="checkoutForm">
<field property="firstName"
depends="required">
<arg0 key="label.firstName"/>
</field>
26
Why all this?
Clear separation between layers resulting In clear separation of roles and clear interface between programmers
View writer responsible for JSPs and ActionForms
Model writer provides his objects as DAOs or EJBs
Application writer concentrates on “strutting” it all together with Action Classes and the config file
Resulting in faster development
27
With Struts 1.2 we have the ability to maintain multiple config files to enable to divide a large aplication into modules
This further facilitates easy co-ordination between programmers in a large application
28
Easy to maintain- how?
Most varying parts of an application ar defined at 1 central place- The config file
The names of JSPs in ActionForwards
The exception handlers
The global forwards
The Action calss itself changes
Facility of using wildcards in mappings
29
Easy to maintain- Internationalization
All the Message resources of an app defined in Application.resources
For a new language add a locale specific Application.resources and use it.
30
Best Practices
Designing Action Classes Use Business Delegate Objects or DAOs to access
databases Don’t validate Business rules in the Action classes-
A mail acount registration example Key idea- Separation between Data and
Presentation of data Action Classes should only do data type validation
but should leave Business rule validations to the Business tier
31
Use DispatchAction for CRUD functions on same set of data
Use Javascript to modify a variable in the form to specify operation(C or R or U or D)<SCRIPT>function set(target) {document.forms[0].methodToCall.value=target;}</SCRIPT><html:submit onclick="set(‘insert');">SAVE
</html:submit><html:submit onclick="set(‘update');">
SAVE AS NEW</html:submitl>
32
Modify the Action Mapping to indicate dispatch variable
<action path="/reg/dispatch" type="app.reg.RegDispatch" name="regForm" scope="request" validate="true" parameter=“methodToCall"/>
33
Add “methodToCall” methods in the Action class public ActionForward insert(
ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ...
public ActionForward update( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ...
34
Use LookupDispatchAction for script free dispatch In our JSP, we can refer to the buttons in the usual
way <html:form action="/test">
<html:submit><bean:message key="button.add"/></html:submit><html:submit><bean:message key="button.delete"/></html:submit></html:form>
35
LookupDispatchAction would have a method
protected Map getKeyMethodMap(ActionMapping mapping, ActionForm form, HttpServletRequest request) { Map map = new HashMap(); map.put("button.add", "add"); map.put("button.delete", "delete"); return map;}
36
Screens with dynamic fields
Use String[] getProperty() and setProperty(String[]) methods
Use DynaActionForm
37
Safeguarding JSPs <web-app>
<security-constraint> <web-resource-collection> <web-resource-name>no_access</web-resource-name> <url-pattern>*.jsp</url-pattern> </web-resource-collection> <auth-constraint/> </security-constraint> </web-app>
38
ActionForms- Coarse grained or fine grained
Fine-grained Too specific
Many in number
Ties records in database to view side
Coarse-grained Immune to changes in table structure
Better manageability
39
Use ResultObjects to return data to View
Result object is simply a transfer object equipped with methods designed to give the presentation layer a helping hand
Usually just a wrapper around some collection class int getSize() String getDescription() – Iterator getIterator()
40
Error Categorization
Register the errors under the appropriate category errors.add("fatal", new ActionError("....")); or
errors.add("error", new ActionError("...."));
Identify these messages and show them consistently
<logic:messagePresent property="error"> <html:messages property="error" id="errMsg" > <bean:write name="errMsg"/></html:messages></logic:messagePresent >