epurchasing system using struts framework java administration special interest group december 9,...
Post on 21-Dec-2015
215 views
TRANSCRIPT
ePurchasing System ePurchasing System using using
Struts FrameworkStruts Framework
Java Administration Special Interest Group
December 9, 2002
Mimpin Halim
University of Hawai’i
Presentation Goals
Introduce UH ePurchasing System from 1,001 miles away Highlight ePurchasing requisition processing steps Benefits and Limitations of using Struts Introduce backend technologies from even further away
ePurchasing Goals
Mitigate risk by reducing human errors Shorter turn-around time Shift employees' focus from paperwork to productivity Use information more efficiently by integrating enhanced
transaction data with the existing systems Reduce cost of papers Transition to completely paperless purchasing system
University of Hawai’i ePurchasing System Overview
Supports requisition, purchase order, purchase order change, invoice and payment processing
Provides electronic approvals Supports multiple user roles with varied access to the
system features using LDAP authentication Validates accounts for activity and available budget
University of Hawai’i ePurchasing System Overview
(cont.)
Integrated with SuperQUOTE™ from CommercePoint Supports real-time encumbering of purchases and
real-time posting of payment expenditures Handles the creation, modification and storage/retrieval of
purchasing documents. Built using Struts Framework v1.0 in transition to v1.1
ePurchasing Implementation
System development started in August 2001 System was implemented in December 2001 Currently in phased development and release cycles
ePurchasing Statistics
As of November 5, 2002: 38 out of 58 units implemented 585 out of ± 800 users 3,891 processed purchase orders 3,767 payments $8,547,487.60 processed purchases
Purchase Order Document Flowfrom Business Logic Perspective
Account access validation Encumbrance posting
Struts Overview
Open source framework for building web applications created by Craig MacClanahan.
Donated to Apache Software Foundation (ASF) in 2000 Provides extensible development environment Based on standard technologies like Java Servlets,
JavaBeans, ResourceBundles and XML Based on Model 2 architecture, a variation of MVC design
paradigm
Benefits of using Struts from Management perspective
Open Source Good documentation Stable and Mature Developed by industry experts Manageable learning curve Large user community
Benefits of using Struts from Developer perspective
Highly customizable
Feature-rich
Extendable and flexible
Widely supported with many free third party tools
Solid design with good documentation
Large user community with very active mailing list
Provides good separation between presentation and business logic.
Modular architecture promotes easier development
Limitations of using Struts from Developer perspective
Building large and complicated form
Lack of “dynamic properties”
Complicated client-side form/JavaScript interaction
Last two limitation have been addressed in Struts 1.1
Struts Framework Features
Supports internationalization - I18N
Database support and JDBC Connection pooling capabilities
Compatible with a variety of model implementations - EJB, JavaBeans, CORBA, etc.
Compatible with a varietiy of presentation layers - JSP, XML/XSLT, etc.
Write once, run anywhere philosophy
Struts Environment
Java Software Development Kit 1.2 or higher
Servlet 2.2/JSP 1.1 container or higher
XML parser compliant with JAXP 1.1 or higher
Extends <javax.servlet.http.HttpServlets>
Receives all framework requests
Selects proper application module
Delegates request handling to the RequestProcessor instance
One instance per web application
Default implementation provided by framework
Controller : ActionServlets
One instance per web application module
Processes all request for module
Invokes proper Action instance
Default implementation provided by framework
Controller : RequestProcessor
Extends <org.apache.struts.action.Action>
In Struts 1.0 overrides the perform() method
In Struts 1.1 overrides the execute() method
Acts as a bridge between user-invoked URI and a business method
Provides information about which view should be rendered and returned
Controller : Action Classes
<!-- Initial requisition form with user defaults -->
<struts-config>
…
<action-mappings type="org.apache.struts.action.ActionMapping">
…
<!-- Initial requisition form with user defaults -->
<action path="/newReqInit"
type="edu.hawaii.purchasing.NewReqInitAction"
name="reqForm"
scope="request"
attribute="reqForm">
<forward name="success" path="/jsp/reqForm.jsp" />
</action>
…
</action-mappings>
</struts-config>
Example of ActionMapping
Example of Action Class
public class NewReqAction
extends Action {
public ActionForward perform(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// Check if user logged in
// (can be implemented by extending RequestProcessor)
HttpSession session = request.getSession(false);
LoginModel loginModel = new LoginModel();
if (!loginModel.isLoggedIn(session)) {
ActionForward login = mapping.findForward("login");
login.setRedirect(true);
return login;
}…
Example of Action Class (cont.)
…
// Get User’s information
String userID = (String) session.getAttribute("userID");
UserBean userBean = UserModel.getUserInfo(userID);
userBean.setFirstName((String) session.getAttribute("firstName"));
userBean.setLastName((String) session.getAttribute("lastName"));
userBean.setMiddleInitial((String) session.getAttribute("middleInitial"));
ReqModel reqModel = new ReqModel();
ReqBean reqBean = new ReqBean();
VndrBean vndrBean = new VndrBean();
reqBean = (ReqBean) reqModel.init(userBean, vndrBean, reqBean);
request.setAttribute("reqBean", reqBean);
return (mapping.findForward("success"));
} // perform()
} // eof: NewReqAction
No model components provided
Struts supports any model component - EJB, Corba, JavaBeans, etc
Decouple model implementation from the framework
Model : Facts
Java Data Base Connectivity (JDBC 2.0) with Oracle Database utilizing Poolman Connection Pooling.
EntireX Java ACI v5.2.1.0 by Software AG to tap into the IBM Mainframe for Remote Procedure Call.
Model Component of ePurchasing
Example of Model Class
public class UserModel {
private static Category logger =
Category.getInstance(UserModel.class.getName());
public static UserBean getUserInfo(String userID)
throws IOException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn =
DriverManager.getConnection(
PropertiesLoader.getProperty("oracle.datasource"));
stmt = conn.createStatement();
Example of Model Class (cont.)
// SQL Statement
String colNames =
"dept, deliv_addr_1, deliv_addr_2, deliv_addr_3, " +
“deliv_addr_4, deliv_city, deliv_st, deliv_zip, …”;
String tableName = "fmis_user ";
String sqlStmt = "select " + colNames + "from " + tableName +
"where user_id = '" + userID + "'";
rs = stmt.executeQuery(sqlStmt);
UserBean user = new UserBean();
while (rs.next()) {
user.setDelivDept(rs.getString("dept"));
user.setDelivAddr1(rs.getString("deliv_addr_1"));
user.setDelivAddr2(rs.getString("deliv_addr_2"));
…
}
return user;
} … //catch exception and finally close ResultSet, Statement, Connection
Invoker Action Class
…
// Get User’s information
String userID = (String) session.getAttribute("userID");
UserBean userBean = UserModel.getUserInfo(userID);
userBean.setFirstName((String) session.getAttribute("firstName"));
userBean.setLastName((String) session.getAttribute("lastName"));
userBean.setMiddleInitial((String) session.getAttribute("middleInitial"));
ReqModel reqModel = new ReqModel();
ReqBean reqBean = new ReqBean();
VndrBean vndrBean = new VndrBean();
reqBean = (ReqBean) reqModel.init(userBean, vndrBean, reqBean);
request.setAttribute("reqBean", reqBean);
return (mapping.findForward("success"));
} // perform()
} // eof: NewReqAction
<!-- Initial requisition form with user defaults -->
<struts-config>
…
<action-mappings type="org.apache.struts.action.ActionMapping">
…
<!-- Initial requisition form with user defaults -->
<action path="/newReqInit"
type="edu.hawaii.purchasing.NewReqInitAction"
name="reqForm"
scope="request"
attribute="reqForm">
<forward name="success" path="/jsp/reqForm.jsp" />
</action>
…
</action-mappings>
</struts-config>
Struts ActionMapping
Execute Remote Procedure Call to specific Broker program running in the Mainframe
Call is sent to the Broker as a String containing program name, parameters needed for the program to execute
Return user-defined number of bytes in the form of byte arrays
Can do more than one invocation with a given open connection to the host running the EntireX Broker server
Model : Natural Broker
Using Natural Broker
public String[][] getBalance(String document)
throws IOException
{
…
String brokerParms = "JWSPEBAL28000" + document + fisYear;
int receiveBufferSize = 28000;
byte[] replyArray = null;
String[][] acctBalances = new String[1][5];
BrokerMessage bReply = nb.perform(brokerParms, receiveBufferSize);
if (bReply == null) {
if (logger.isDebugEnabled()) {
logger.debug("getBalance() - No results");
}
return acctBalances;
} else {
…
Using Natural Broker (cont.)
replyArray = nb.getResults(bReply);
String count = new String(replyArray, 0, 2);
int acctCount = Integer.parseInt(count);
if (acctCount == 0) {
return acctBalances;
}
acctBalances = new String[acctCount][5]; // each account has 5 properties
for (int i = 0; i < acctCount; i++) {
int rOffset = 2 + (i * 40);
acctBalances[i][0] = new String(replyArray, rOffset, 2); // campus
acctBalances[i][1] = new String(replyArray, rOffset + 2, 6); // account
acctBalances[i][2] = new String(replyArray, rOffset + 8, 4); // subcode
acctBalances[i][3] = new String(replyArray, rOffset + 12, 14); // curr. amt
acctBalances[i][4] = new String(replyArray, rOffset + 26, 14); // liq. amt …
Java Server Pages
HTMLs
JavaScripts and StyleSheets
Resources Bundles
JavaBeans extending ActionForms
Custom Tags - HTML, Bean, Logic
View : Components
Upgrade to Struts 1.1
Utilize Validators and Tiles from Struts 1.1
Use XML/XSLT for View Component
What’s new in 1.1?
http://jakarta.apache.org/struts/userGuide/release-notes-1.1-b2.html
Future Improvements