Using the JavaBean The generated JavaBean, GetCustomerBean, can be used in a servlet or JSP to execute the stored procedure and access the result set.. The code is available in: \sg24695
Trang 1Two classes are generated:
GetCustomerBeanRow—Provides access to one row of the result set
GetCustomerBean—Executes the stored procedure and provides a method to retrieve an array of GetCustomerBeanRow objects
Using the JavaBean
The generated JavaBean, GetCustomerBean, can be used in a servlet or JSP to execute the stored procedure and access the result set
A simple JSP to execute the JavaBean is shown in Figure 9-16 The code is available in:
\sg246957\sampcode\dev-proc\RunGetCustomerBean.jsp
Figure 9-16 Simple JSP to execute the JavaBean with the stored procedure The GetCustomerBean is instantiated using a <useBean> tag The stored procedure is executed and the first row of the result set (there is only one) is retrieved and displayed
Note that the customer ID is passed as a constant and no error checking is performed In a real application the code would be more complex
<BODY>
<H1>JSP -> JavaBean -> Stored Procedure</H1>
<jsp:useBean id="getCustomer"
class="itso.storedproc.bean.GetCustomerBean"></jsp:useBean>
<% getCustomer.execute( new Integer(106) ); %>
<% itso.storedproc.bean.GetCustomerBeanRow row = getCustomer.getRows()[0];
%>
<TABLE border="1">
<TR><TH align="left">ID</TH>
<TD><%= row.getCUSTOMER_CUSTOMERID() %></TD></TR>
<TR><TH align="left">Title</TH>
<TD><%= row.getCUSTOMER_TITLE() %></TD></TR>
<TR><TH align="left">Firstname</TH>
<TD><%= row.getCUSTOMER_FIRSTNAME() %></TD></TR>
</TABLE>
</BODY>
Tip: Restart the enterprise application in the server after making changes to
the Web application deployment information
Trang 2Using the JSP tag library
Stored procedures can also be executed through the jspsql tag library See
“Accessing a database using JSP taglib” on page 262 for a description
To make the tag library available for the Web application, we have to import the JAR file into the lib directory and add the tag library to the deployment
descriptor:
Select the ItsoProGuideStroedProcWeb\Web Content\WEB-INF\lib folder and
Import (context) Select File system, then locate the directory:
<wsadhome>\wstools\eclipse\plugins\com.ibm.etools.dbjars_5.0.1\jars
Select only the jspsql.jar file and click Finish
Open the deployment descriptors (web.xml) On the References page, select the JSP tag libraries tab Click Add and select the jspsql tag library Save the deployment descriptor
Figure 9-17 shows a sample JSP that uses the tag library to execute the stored procedure The code is available in:
\sg246957\sampcode\dev-proc\RunStoredProcedure.jsp
<%@taglib uri="jspsql" prefix="dab"%>
<BODY>
<H1>JSP with Stored Procedure Call</H1>
<dab:dataSourceSpec id="DSConnect" scope="page" dataSource='jdbc/ejbbank' />
<dab:procedureCall id="getCust" connectionSpec="DSConnect" scope="request">
<dab:sql>
{ CALL ITSO.GETCUSTOMER(:customerID) }
</dab:sql>
<dab:parameter parmName="customerID" type="INTEGER" mode="in" value="104" />
</dab:procedureCall>
<TABLE border="1">
<TR><TH align="left">ID</TH>
<TD><dab:getColumn name="getCust" index="1" /></TD></TR>
<TR><TH align="left">Title</TH>
<TD><dab:getColumn name="getCust" index="2" /></TD></TR>
<TR><TH align="left">Firstname</TH>
<TD><dab:getColumn name="getCust" index="3" /></TD></TR>
</TABLE></BODY>
Trang 3Generate JavaBean Web pages
You can use the Create Web Pages from a JavaBean wizard to build the input and output pages to test the JavaBean that calls the stored procedure
This wizard is described in “Creating Web pages from a JavaBean” on page 237, therefore we only provide short instructions here to run through the wizard:
Select New -> Other -> Web -> JavaBean Web Pages
Select /ItsoProGuideStoredProcWeb/Web Content as destination and itso.storedproc.web as package
Select itso.storedproc.bean.GetCustomerBean as the bean Click Introspect
if necessary
Select the rows property (the result of the stored procedure) and the execute method (to run the stored procedure)
Select Create a new front controller
Tailor the input page with:
– Title: Execute Stored Procedure – Prompt: Enter a customer ID:
Tailor the result page with:
– Title: Stored Procedure Results – Label for rows property: Customer – Expand rows, select the six properties (all except class), and set short labels for all the properties (Title, Lastname, UserID, Password, ID, Firstname)
Leave GetCustomerBean as prefix and click Finish to generate the code You get a servlet, an HTML input page, and a result JSP:
GetCustomerBeanController.java GetCustomerBeanInputForm.html GetCustomerBeanResultsForm.jsp
To test the generated application, restart the enterprise application (select the ItsoServer and Restart Project -> ItsoProGuide) or restart the server
Select the GetCustomerBeanInputForm.html file and Run on Server Enter a customer ID and click Submit A sample run is shown in Figure 9-18
Trang 4Figure 9-18 Running the generated Web application
Creating a stored procedure with multiple statements
Here we want to create a stored procedure that transfers money between two accounts Therefore, we have to execute two SQL statements in sequence, one
to withdraw money from one account, and one to deposit money into another account
To create this stored procedure:
In the Data perspective, select the Stored Procedures folder and New -> Stored Procedure
Enter transferMoney as name
On the definition page, select None for result sets and SP_JAVA_HDR.FRAGMENT
Trang 5 In the SQL statement dialog (Figure 9-19) enter the first SQL statement as: UPDATE ITSO.ACCOUNT
SET BALANCE = (BALANCE - :amount) WHERE ACCID = :account1
AND BALANCE > :amount
Click Add to get space for another SQL statement and enter:
UPDATE ITSO.ACCOUNT SET BALANCE = (BALANCE + :amount) WHERE ACCID = :account2
Click OK and then click Next
Figure 9-19 Stored procedure with two statements
In the Parameters dialog, one parameter named whichQuery is predefined The generated code assumes that you want to run one of the two statements
We will have to run both We will take care of this in the generated code
Define these parameters (Figure 9-20):
– In: account1, VARCHAR, 8 – In: account2, VARCHAR 8 – In: amount, DECIMAL, 8.2 – Out: success, INTEGER
Trang 6Figure 9-20 Parameters for the stored procedure
You can skip the rest of the dialog and click Finish
Edit the generated code
The generated Java class TransferMoney uses the whichQuery parameter to decide which statement to execute We have to change the code to execute both statements and to set the return value
Our changes are as follows:
Remove the whichQuery parameter
Remove the switch and case statements
Create variables for both SQL statements
Run both statements in sequence
Set the result as the sum of the changed rows (a result of 2 would be a success)
The changed method is shown in Figure 9-21
Trang 7Figure 9-21 Updated stored procedure with two SQL statements
String account1, String account2, java.math.BigDecimal amount, int[] success )
throws SQLException, Exception {
// Get connection to the database Connection con = DriverManager.getConnection("jdbc:default:connection"); PreparedStatement stmt = null;
PreparedStatement stmt2 = null;
int updateCount = 0;
int updateCount2 = 0;
boolean bFlag;
String sql, sql2;
switch (whichQuery) {
case 0:
sql = "UPDATE ITSO.ACCOUNT"
+ " SET BALANCE = (BALANCE - ?) "
+ " WHERE ACCID = ? "
+ " AND BALANCE > ?";
stmt = con.prepareStatement( sql );
stmt.setBigDecimal( 1, amount );
stmt.setString( 2, account1 );
stmt.setBigDecimal( 3, amount );
bFlag = stmt.execute();
rs1 = stmt.getResultSet();
updateCount = stmt.executeUpdate();
break;
case 1:
sql2 = "UPDATE ITSO.ACCOUNT"
+ " SET BALANCE = (BALANCE + ?) "
+ " WHERE ACCID = ?";
stmt2 = con.prepareStatement( sql2 );
stmt2.setBigDecimal( 1, amount );
stmt2.setString( 2, account2 );
bFlag = stmt.execute();
rs1 = stmt.getResultSet();
updateCount2 = stmt2.executeUpdate();
break;
default:
sql = "SELECT PROCSCHEMA, PROCNAME FROM SYSCAT.PROCEDURES"; stmt = con.prepareStatement( sql );
} updateCount = stmt.executeUpdate();
// Set return parameter
success[0] = updateCount + updateCount2;
}
Trang 8Build and execute
Build the stored procedure by selecting Build from the context menu
Test the procedure by selecting Run Enter 106-6001, 106-6002, and 100.00 as parameters The DB Output view (Figure 9-22) shows the result value in the Parameters tab
Figure 9-22 Stored procedure run
Using a JSP
We provide the RunTranfer.jsp to execute the transferMoney stored procedure The core code is shown in Figure 9-23
Tip: The database is not updated by default Select the transferMoney stored procedure and Run Settings (context) On the Options tab you can select
Commit changes to the database
<dab:dataSourceSpec id="DSConnect" scope="page" dataSource='jdbc/ejbbank' />
<dab:procedureCall id="transfer" connectionSpec="DSConnect" scope="request">
<dab:sql>
{ CALL ITSO.TRANSFERMONEY (:account1, :account2, :amount, :success) }
</dab:sql>
<dab:parameter parmName="account1" type="VARCHAR" mode="in"
value="106-6002" />
<dab:parameter parmName="account2" type="VARCHAR" mode="in"
value="106-6001" />
<dab:parameter parmName="amount" type="DECIMAL" mode="in"
value="100.00" />
<dab:parameter parmName="success" type="INTEGER" mode="out" />
</dab:procedureCall>
Amount: <dab:getParameter name="transfer" parmName="amount" /><br>
Result: <dab:getParameter name="transfer" parmName="success" />
Trang 9In this chapter we developed two stored procedures, one with a result set and one that updates the database
We also showed how stored procedures can be invoked through JavaBeans and JSPs
Trang 10Chapter 10. Developing Struts
applications
In this chapter we introduce you to the Jakarta Struts framework and Application Developer’s support for building Struts-based Web applications
The chapter describes how to:
Create a Web project with Struts support
Create a Web diagram and lay out the components of the application
Implement form beans, JSPs, and actions
Use the Struts configuration file editor
Test the application
10