Tutorial: Building a Web Application with Struts



Similar documents
Struts Tools Tutorial. Version: M5

DTS Web Developers Guide

In this chapter, we lay the foundation for all our further discussions. We start

SSC - Web development Model-View-Controller for Java web application development

Development. with NetBeans 5.0. A Quick Start in Basic Web and Struts Applications. Geertjan Wielenga

Have you ever done something the long way and then

CrownPeak Java Web Hosting. Version 0.20

An introduction to creating JSF applications in Rational Application Developer Version 8.0

MVC pattern in java web programming

WEB APPLICATION DEVELOPMENT. UNIT I J2EE Platform 9

Glassfish, JAVA EE, Servlets, JSP, EJB

Developing Java Web Applications with Jakarta Struts Framework

Building and Using Web Services With JDeveloper 11g

<Insert Picture Here> Betting Big on JavaServer Faces: Components, Tools, and Tricks

NetBeans IDE Field Guide

Portals, Portlets & Liferay Platform

Complete Java Web Development

Course Number: IAC-SOFT-WDAD Web Design and Application Development

Web Container Components Servlet JSP Tag Libraries

Building an Agile PLM Web Application with JDeveloper and Agile 93 Web Services

Tutorial: Design Patterns in the VSM

Web Application Developer s Guide

Developing Rich Web Applications with Oracle ADF and Oracle WebCenter Portal

Oracle JDeveloper 10g for Forms & PL/SQL

Architectural models of J2EE Web tier frameworks. Timo Westkämper

Client-server 3-tier N-tier

Tutorial on Building a web Application with Jdeveloper using EJB, JPA and Java Server Faces By Phaninder Surapaneni

JBoss SOAP Web Services User Guide. Version: M5

Case Studies of Running the Platform. NetBeans UML Servlet JSP GlassFish EJB

Accessing Data with ADOBE FLEX 4.6

Crystal Reports for Borland JBuilder

Building Web Services with Apache Axis2

: Test 217, WebSphere Commerce V6.0. Application Development

Developing XML Solutions with JavaServer Pages Technology

Design Approaches of Web Application with Efficient Performance in JAVA

Publishing, Consuming, Deploying and Testing Web Services

Oracle Application Development Framework Overview

Model-View-Controller: A Design Pattern for Software. June 2004

Course Name: Course in JSP Course Code: P5

Oracle Service Bus Examples and Tutorials

Building Web Applications, Servlets, JSP and JDBC

A Guide to Understanding Web Application Development Corey Benson, SAS Institute, Inc., Cary, NC Robert Girardin, SAS Institute, Inc.

Model-View-Controller. and. Struts 2

Java Application Developer Certificate Program Competencies

IBM Rational Web Developer for WebSphere Software Version 6.0

Getting Started with Web Applications

Using XForms to Simplify Web Programming

SESM Tag Library. Configuring a Tag Library APPENDIX

Web-JISIS Reference Manual

zen Platform technical white paper

JEE Web Applications Jeff Zhuk

Creating Web Services Applications with IntelliJ IDEA

Application. 1.1 About This Tutorial Tutorial Requirements Provided Files

Design and Functional Specification

Communiqué 4. Standardized Global Content Management. Designed for World s Leading Enterprises. Industry Leading Products & Platform

Efficiency of Web Based SAX XML Distributed Processing

Client-Server Architecture & J2EE Platform Technologies Overview Ahmed K. Ezzat

IBM Operational Decision Manager Version 8 Release 5. Getting Started with Business Rules

Mastering Tomcat Development

Java EE Introduction, Content. Component Architecture: Why and How Java EE: Enterprise Java

Server-Side Web Development JSP. Today. Web Servers. Static HTML Directives. Actions Comments Tag Libraries Implicit Objects. Apache.

Building Java Servlets with Oracle JDeveloper

Japan Communication India Skill Development Center

Performance Comparison of Persistence Frameworks

TechTips. Connecting Xcelsius Dashboards to External Data Sources using: Web Services (Dynamic Web Query)

Oracle9i Application Server: Options for Running Active Server Pages. An Oracle White Paper July 2001

Topics. Incorporating JSP Custom Tags Into Your Web Apps. A Quick Example of Using One. What They Are. Why Developers Should Consider Them

BEAWebLogic. Portal. Portlet Development Guide

New Web Application Development Tool and Its MDA-Based Support Methodology

Programming on the Web(CSC309F) Tutorial: Servlets && Tomcat TA:Wael Aboelsaadat

PRACTICAL ADF APPLICATION DEPLOYMENT FOR FUSION MIDDLEWARE ADMINISTRATORS

An Oracle White Paper June RESTful Web Services for the Oracle Database Cloud - Multitenant Edition

WebObjects Web Applications Programming Guide. (Legacy)

Core Java+ J2EE+Struts+Hibernate+Spring

Tutorial: Building a Dojo Application using IBM Rational Application Developer Loan Payment Calculator

CREATE A CUSTOM THEME WEBSPHERE PORTAL

Query JD Edwards EnterpriseOne Customer Credit using Oracle BPEL Process Manager

How to Build an E-Commerce Application using J2EE. Carol McDonald Code Camp Engineer

EVALUATION ONLY. WA2088 WebSphere Application Server 8.5 Administration on Windows. Student Labs. Web Age Solutions Inc.

VB.NET - WEB PROGRAMMING

Creating Java EE Applications and Servlets with IntelliJ IDEA

Japan Communication India Skill Development Center

ACM Crossroads Student Magazine The ACM's First Electronic Publication

JBoss Portlet Container. User Guide. Release 2.0

Agenda. Summary of Previous Session. Application Servers G Session 3 - Main Theme Page-Based Application Servers (Part II)

Oracle Forms Services Secure Web.Show_Document() calls to Oracle Reports Server 6i

Workshop for WebLogic introduces new tools in support of Java EE 5.0 standards. The support for Java EE5 includes the following technologies:

Virtual Credit Card Processing System

DEVELOPING CONTRACT - DRIVEN WEB SERVICES USING JDEVELOPER. The purpose of this tutorial is to develop a java web service using a top-down approach.

This course provides students with the knowledge and skills to develop ASP.NET MVC 4 web applications.

How to make a good Software Requirement Specification(SRS)

OUR COURSES 19 November All prices are per person in Swedish Krona. Solid Beans AB Kungsgatan Göteborg Sweden

Business Process Management IBM Business Process Manager V7.5

2012 LABVANTAGE Solutions, Inc. All Rights Reserved.

Net-WMS FP Net-WMS SPECIFIC TARGETED RESEARCH OR INNOVATION PROJECT. Networked Businesses. D.8.1 Networked architecture J2EE compliant

Enterprise Service Bus

Java technológiák 7. előadás A Struts keretrendszer

Database Forms and Reports Tutorial

SharePoint Integration Framework Developers Cookbook

MarkLogic Server. Reference Application Architecture Guide. MarkLogic 8 February, Copyright 2015 MarkLogic Corporation. All rights reserved.

Transcription:

Tutorial: Building a Web Application with Struts Tutorial: Building a Web Application with Struts This tutorial describes how OTN developers built a Web application for shop owners and customers of the BC4J Virtual Shopping Mall (BC4J-VSM) sample application. Contents 1. Concepts 2. Design 3. Required Software 4. Setup 5. Implementation 6. Resources 7. Feedback file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/toc.htm [04/15/2003 11:58:46 AM]

Concepts Concepts The Jakarta Project's Struts framework, version 1.1b2, from Apache Software Organization is an open source framework for building web applications that integrate with standard technologies, such as Java Servlets, JavaBeans, and JavaServer Pages. Struts offers many benefits to the web application developer, including Model 2 implementation of Model-View-Controller (MVC) design patterns in JSP web applications. The MVC Model 2 paradigm applied to web applications lets you separate display code (for example, HTML and tag libraries) from flow control logic (action classes). Following is a brief overview of the MVC Model 2 design pattern. For complete information about how Struts implements the MVC design patterns, see the Introduction to the Struts User's Guide on the Jakarta Project's Web site: http://jakarta.apache.org/struts/userguide/index.html. The Model portion of an MVC-based system typically comprises JavaBean classes that define the internal state of the system; they also specify the actions that can be taken to change that state. If you use the BC4J data access framework, this layer implements the model entirely for you. Otherwise, you will need to create the classes that implement your model. The View portion of a Struts-based application is generally constructed using JSP technology. JSP pages can contain static HTML (or XML) text called "template text", plus the ability to insert dynamic content based on the interpretation (at page request time) of special action tags. The JSP environment includes a set of custom JSP tag libraries (such as the Struts tag libraries), standard JSP action tags (such as those described in the JavaServer Pages Specification), and a facility to install your own JSP custom tag libraries. If you use the BC4J data access framework, you can take advantage of JDeveloper's JSP generation wizards and the custom tag libraries that allow your JSP pages to display databound dynamic content. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/concepts.htm (1 of 4) [04/15/2003 11:58:48 AM]

Concepts The Controller portion of the application is focused on receiving requests from the client (typically a user running a web browser), deciding what business logic function is to be performed, and then delegating responsibility for producing the next phase of the user interface to an appropriate View component. In Struts, the primary components of the Controller is a servlet of class ActionServlet and the class RequestProcessor. If you use the BC4J data access framework, the RequestProcessor is extended for you and is known as the BC4JRequestProcessor. JDeveloper helps you implement the MVC Model 2 design patterns using core technology familiar to all web developers: You can create JSP pages with HTML and custom tag libraries to implement the View of the data. You use links to let the user trigger actions on the HTTP Request. You can enhance your JSP pages using a large set of custom JSP tag libraries that work with the Struts framework. All of the Struts tag libraries are accessible from the JDeveloper Component Palette, when you open a JSP in the Code Editor. For example, the Struts Form tag works closely with the Struts actions and form bean to retain the state of a data-entry form and validate entered data. Unlike non-struts JSPs, when you run your application, action requests do not invoke another JSP or Servlet directly. Instead, the request URI specifies a logical page request, which the request processor (RequestProcessor class) provided by the Struts controller handles. The Struts servlet may direct the responsibility for displaying the action results to the appropriate JSP page of your application, where the page may vary according to the exit code. The Struts framework includes custom JSP tag libraries that you can use to create JSP pages that work with the rest of the Struts framework objects in your web application: Tag library Struts HTML Description Used to create Struts input forms, as well as other tags generally useful in the creation of HTML-based user interfaces. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/concepts.htm (2 of 4) [04/15/2003 11:58:48 AM]

Concepts Struts Bean Struts Logic Struts Nested Struts Tiles Struts Templates Useful in accessing beans and their properties, as well as defining new beans (based on these accesses) that are accessible to the remainder of the page via scripting variables and page scope attributes. Convenient mechanisms to create new beans based on the value of request cookies, headers, and parameters are also provided. Useful in managing conditional generation of output text, looping over object collections for repetitive generation of output text, and application flow management. Brings a nested context to the functionality of the Struts custom tag library. The purpose of this tag library is to enable the tags to be aware of the tags which surround them so they can correctly provide the nesting property reference to the Struts system. Provides tiles tags. Tiles were previously called Components. Three tags: put, get, and insert. A put tag moves content into request scope, which is retrieved by a get tag in a different JSP page (the template). That template is included with the insert tag. Tags from the various Struts custom JSP tag libraries appear in JDeveloper on the Component Palette. The JDeveloper Help system lets you display the Struts Developer's Guide (obtained from the Apache Software Organization) for specific tags on the palette. JDeveloper provides set of JSP 1.1 compliant custom tags known as Business Components for Java (BC4J) Data Tags. The BC4J Data Tags custom tag library allows for simplified interaction with Business Components based on the BC4J framework. The tag-based approach to building JSP web applications with Business Components does not require extensive Java programming and is very much like coding an HTML page. The tags provide complete access to Business Components and allow viewing, editing, navigating, and full DML control. In the case of BC4J JSP pages you run with Struts, the BC4JRequestProcessor class handles actions specific to the databound JSP pages. You create classes that implement the actions, which are specific to the operations file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/concepts.htm (3 of 4) [04/15/2003 11:58:48 AM]

Concepts and flow control of your application. Actions can respond to the request, ask the servlet controller to forward the request to another handler or to another JSP, such as an input form. You create JavaBean classes, known as form beans, which work closely with the action classes to retain the state of a data-entry form and validate the data entered. In this way, the form bean provides access to the data with which you application works. You configure actions through an XML resource file, known as the strutsconfig.xml, rather than hardcode it in the action class. The Struts RequestProcessor uses the file to map the request URI to the appropriate action and form beans. Struts version 1.1 provides the SwitchAction class to let your application move between separate Struts configuration files for independent application modules. Component tags belong to the BC4J Data Tags custom tag library. These tags function much like the other BC4J data tags in that they operate on Business Components to access and manipulate data from the database. In a web application that you create with Struts support, you can use a special version of component tags to handle typical Business Components actions. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/concepts.htm (4 of 4) [04/15/2003 11:58:48 AM]

Design Design When you create databound web applications using the Struts and BC4J frameworks, you gain these benefits over BC4J web applications without Struts: All the benefits of the MVC approach to flow control that Struts supports. For example, MVC model 2 allows Web application developers to cleanly separate the display code (for example, HTML and tag libraries) from the action-handling code (Java and JSP scriplets). As a result, Web applications based on the Struts framework are easier to both read and maintain. Struts uses a single.xml file to define the application module binding information that would otherwise appear inside each BC4J JSP page of a project. Struts handles the Business Component events as prebuilt action classes that the Struts ServletController executes at runtime. This eliminates the need to include event handling code in each BC4J JSP page (such as is provided by the <jbo:datahandler> component tag or the <jbo:onevent> tag). Struts uses a single, easy to localize.properties file to consolidate message strings that would otherwise appear inside each BC4J JSP page of a project. While it is possible to develop Web applications that do not follow the MVC paradigm, in general the Struts framework provides significant advantages to the developer: Struts makes it possible for JSP pages to externalize flow control. Rather than specify physical links to various JSP pages within the JSP file, the JSP file contains a Struts-defined logical URI. The Struts URI defines a logical page request mapped to actions that may return different physical JSP pages depending on the context of the HTTP request. Struts simplifies the development of the actual JSP file content by limiting it to user file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/design.htm (1 of 3) [04/15/2003 11:58:49 AM]

Design interface generation only. Java that would otherwise appear inside the JSP files appears in separate servlet action classes that the JSP page invokes at runtime. Struts helps to separate the development roles into user interface designer (HTML or tag library user) and JSP action-handler developer. For example, one person can write JSP page using only HTML or suitable tag libraries, while another person works independently to create the page action handling classes in Java. Struts externalizes JSP actions that would otherwise appear inside all the JSP pages of your project into a single configuration file. This greatly simplifies debugging and promotes reuse. Struts consolidates String resources that would otherwise appear inside all the JSP pages of your project (for example, form labels) into a single file. This greatly simplifies the task of localizing JSP applications. The figure below (created with JDeveloper) shows some of the key classes in the BC4J- VSM end-user interface. To display the complete class diagram, click here. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/design.htm (2 of 3) [04/15/2003 11:58:49 AM]

Design Other apects of the BC4J-VSM design are covered in various lessons in this tutorial series. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/design.htm (3 of 3) [04/15/2003 11:58:49 AM]

Required Software Required Software This tutorial presents several code examples. If you want to study them in context, download and install the BC4J-VSM source code. If you also want to build and run the BC4J-VSM application, you will need the software listed in the Required Software section of About the BC4J Virtual Shopping Mall. JDeveloper ships the source for the Struts framework in <jdev_install>/jakartastruts/ directory. This directory contains the same Struts package and Web application samples that you can download from the Jakarta Project's home page. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/reqsw.htm [04/15/2003 11:58:50 AM]

Setup Setup No special setup steps are required to use Struts with JDeveloper. In order to work with Struts and BC4J frameworks, JDeveloper provides a set of wizards that resemble the standard (non-struts) BC4J JSP page wizards, but with the added functionality of being able to generate a web application that relies on a BC4J-specific request processor for use in the Struts MVC paradigm. For example, the BC4J JSP Struts Web Application Wizard helps you to quickly create an entire web application based on your existing Business Components project. Standard actions are implemented using the Struts framework and a Struts version of the component tags from the BC4J Data Tags custom tag library. For information about setting up the BC4J-VSM sample application, see the Setup section of the Overview tutorial. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/setup.htm [04/15/2003 11:58:50 AM]

Implementation Implementation This section describes how the BC4J-VSM uses Struts and JBO tags together with the BC4J framework to display a list of orders to a mall customer. The Struts technologies used are: Struts Controller Sevlet - MVC Controller servlet which controls all access to application. Struts Action - A java class designated to handle a Struts application Action which is in the form of a URL request. Struts ActionForm (Form Bean) - A Java class which represents the contents of an HTML form. It also provides a validation method. Struts "Bean" and "HTML" tag libraries - JSP tag libraries which allow for interaction with Struts components from JSP. Struts-Config.xml - The master configuration file for all Struts applications. ApplicationResources.properties - A resource file which can store multi-lingual messages and data for a Struts application. JDeveloper provides these facilities to develop a web application based on Jakarta Project's Struts framework that you deploy as either Java servlets or JavaServer Pages. The Struts Configuration Editor lets you manage the struts-config.xml file, which defines the ActionMappings for your application. The Struts controller uses the mappings to turn HTTP requests into application actions. The various Struts dialogs in the Web Tier - Struts category of the New Gallery let you add the Struts framework components to a generic JSP web application. When you add Struts to a generic JSP project, you may also work with BC4J through its request processor (BC4JRequestProcessor). The BC4J Struts JSP Web Application Wizard in the Web Tier - Struts-Based JSP for Business Components category of the New Gallery lets you generate an entire databound web application. The generated JSP pages rely on a BC4J-specific action controller that functions with a model file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/impl.htm (1 of 5) [04/15/2003 11:58:52 AM]

Implementation implemented by Oracle's data access layer, Business Components for Java (BC4J). For work with Struts and BC4J frameworks, JDeveloper provides a set of wizards that resemble the standard (non-struts) BC4J JSP page wizards, but they generate a web application that relies on a BC4J-specific request processor for use in the Struts MVC paradigm. The wizard-generated code implements the BC4J framework and provides full database access, state management, and transaction control to web application clients. For example, the BC4J JSP Struts Web Application Wizard helps you create an entire web application based on a Business Components project. Standard actions are implemented using the Struts framework and a Struts version of the component tags from the BC4J Data Tags custom tag library. All Struts actions begin with a URL that is submitted to the JSP request object when the end user clicks a Struts-defined link. The link must be of the form actionpathname.do, where the extension.do causes the ActionServlet to locate the corresponding action in the struts-config.xml configuration file. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/impl.htm (2 of 5) [04/15/2003 11:58:52 AM]

Implementation The runtime process for handling actions in the Struts framework implemented by the BC4J component tags is: 1. User clicks a link that submits a.do parameter. 2. ActionServlet maps the request URI to the Action class through the definition in strutsconfig.xml. 3. The action class processes the request through a method implementation. The following HTML code (with jbo tags) comes from mallusers/allorders.jsp. It includes an HTML anchor tag that defines a link to manageorder.do. <%UserOrdersRow row = null;%> <jbo:rowsetiterate datasource="ordertrackingservice.userorders"> <jbo:row id="currrow" action="active" datasource="ordertrackingservice.userorders"/> <% row = (UserOrdersRow)currRow; %> <TR>... <TD align="center" class="blacktext" width="82"> <A href="manageorders.do?jborowkey= <%=row.getkey().tostringformat(true)%> &jboevent=getorders" class="link">details</a> </TD> </TR> </jbo:rowsetiterate> The following XML code comes form struts-config.xml. It defines the action manageorders, specifying a Java class (OrderEditAction) and method (getallorders) to handle the action, and associated JSPs (including allorders.jsp).... <action path="/manageorders" parameter="jboevent" scope="request" type="oracle.otnsamples.vsm.controllers.user.ordereditaction" validate="false"> <set-property property="releasemode" value="stateless"/> <set-property property="application" value="ordertrackingservice"/> <set-property property="viewobject" value="userorders"/> <forward name="getorders" path="/jsps/malluser/myorders.jsp"/> <forward name="getallorders" path="/jsps/malluser/allorders.jsp"/> </action> file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/impl.htm (3 of 5) [04/15/2003 11:58:52 AM]

Implementation... The following Java code comes from OrderEditAction.java. It implements the action method defined in the Struts configuration file (shown above). It imports Struts action classes (org.apache.struts.action.*) and BC4J classes (oracle.jbo.*) to gain access to those frameworks' functionality. This code calls BC4JContext.getContext to get context data from the HTTP request parameter, then uses this data to instantiate the UserOrders View Object, a BC4J component. Then the code uses the View Object to execute a query and iterate through the results. package oracle.otnsamples.vsm.controllers.user;... import org.apache.struts.action.actionform; import org.apache.struts.action.actionforward; import org.apache.struts.action.actionmapping; import org.apache.struts.action.actionerror; import org.apache.struts.action.actionerrors; import oracle.jbo.client.jboutil; import oracle.jbo.viewobject; import oracle.jbo.html.struts11.actions.editaction; import oracle.jbo.html.struts11.bc4jutils; import oracle.jbo.rowiterator; import oracle.jbo.key; import oracle.jbo.html.bc4jcontext; import oracle.jbo.row; import oracle.otnsamples.vsm.views.common.userorders; import oracle.otnsamples.vsm.views.common.userordersrow; import oracle.otnsamples.vsm.views.common.orderitemsrow; import oracle.otnsamples.vsm.views.common.itemrow; import oracle.otnsamples.util.utilities;... public ActionForward getallorders(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BC4JContext context = BC4JContext.getContext(request); try { String uname = (String)request.getSession().getAttribute("USER_NAME"); UserOrders orders = (UserOrders)context.getViewObject(); orders.setusername(uname); orders.executequery(); UserOrdersRow row = null; double total = 0.0; RowIterator iter = null; OrderItemsRow currrow = null; while(orders.hasnext()) { row = (UserOrdersRow)orders.next(); file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/impl.htm (4 of 5) [04/15/2003 11:58:52 AM]

Implementation } total = 0.0; iter = row.getorderitems(); while(iter.hasnext()) { currrow = (OrderItemsRow)iter.next(); total += currrow.getunitprice().doublevalue() * currrow.getquantity().doublevalue(); } request.setattribute(row.getid().getsequencenumber().stringvalue(), new Double(total)); } orders.reset(); } catch(exception ex) {... } return BC4JUtils.getForwardFromContext(context, mapping); The other tutorials in this series describe various application features and explain how they were implemented. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/impl.htm (5 of 5) [04/15/2003 11:58:52 AM]

Resources Resources This tutorial is part of a series based on the BC4J version of the Virtual Shopping Mall (VSM) sample application. Following are links to resources that can help you understand and apply the concepts and techniques presented in the tutorials. See the Required Software section to obtain the BC4J-VSM source code and related files. Resource URL Struts Overview JDeveloper Online Help Using Struts with JDeveloper http://jakarta.apache.org/struts/ http://otn.oracle.com/jdeveloper903/help/ http://otn.oracle.com/products/jdev/htdocs/handson/struts/strutshandson.html OTN Sample Code http://otn.oracle.com/sample_code/ file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/rsrc.htm [04/15/2003 11:58:53 AM]

Feedback Feedback If you have questions or comments about this tutorial, you can: Post a message in the OTN Sample Code discussion forum. OTN developers and other experts monitor the forum. Send email to the author. mailto:robert.hall@oracle.com If you have suggestions or ideas for future tutorials, you can Post a message in the OTN Member Feedback forum. Send email to mailto:raghavan.sarathy@oracle.com. file:///d /otndocs/sample_code/tutorials/bc4jvsm/struts/fdbk.htm [04/15/2003 11:58:53 AM]