blob: 9958071edcbd9a243cbcd23e99248ccf540c69fe [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="A tutorial describing how to create a simple,
two-tiered web application that connects to a MySQL database in NetBeans IDE">
<meta name="keywords" content="NetBeans, IDE, integrated development environment,
MySQL, SQL, structured query language, multithreaded, multi-user database
management system, DBMS, open source, JDBC, JSP, JavaServer Pages">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<link rel="stylesheet" type="text/css" href="../../../lytebox.css" media="screen">
<script type="text/javascript" src="../../../images_www/js/lytebox-compressed.js"></script>
<script src="../../../images_www/js/listCollapse.js" type="text/javascript"></script>
<title>Creating a Simple Web Application Using a MySQL Database - NetBeans IDE Tutorial</title>
</head>
<body>
<!-- Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. -->
<h1>Creating a Simple Web Application Using a MySQL Database</h1>
<div class="articledate">Written by Troy Giunipero</div>
<p>This document describes how to create a simple web application that connects to a MySQL
database server. It also covers some basic ideas and technologies in web development,
such as <a href="http://www.oracle.com/technetwork/java/overview-138580.html">JavaServer Pages</a> (JSP),
<a href="http://www.oracle.com/technetwork/java/index-jsp-135995.html">JavaServer Pages Standard Tag Library</a>
(JSTL), the <a href="http://docs.oracle.com/javase/tutorial/jdbc/overview/index.html">Java Database
Connectivity</a> (JDBC) API, and two-tier, client-server architecture. This tutorial
is designed for beginners who have a basic understanding of web development and are
looking to apply their knowledge using a MySQL database.</p>
<p><a href="http://www.mysql.com">MySQL</a> is a popular open source database management
system commonly used in web applications due to its speed, flexibility and reliability.
MySQL employs SQL, or <em>Structured Query Language</em>, for accessing and processing
data contained in databases.</p>
<p>This tutorial is a continuation from the <a href="../ide/mysql.html">Connecting to a
MySQL Database</a> tutorial and assumes that you have already created a MySQL database
named <code>MyNewDatabase</code>, which you have registered a connection for in the
NetBeans IDE. The table data used in that tutorial is contained in
<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252Fifpwafcad.sql">ifpwafcad.sql</a>
and is also required for this tutorial. This SQL file creates two tables, <code>Subject</code>
and <code>Counselor</code>, then populates them with sample data. If needed, save this
file to your computer, then open it in the NetBeans IDE and run it on the MySQL database
named <code>MyNewDatabase</code>.</p>
<p><strong>Contents</strong></p>
<img src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" class="stamp" alt="Content on this page applies to NetBeans IDE 7.2, 7.3, 7.4 and 8.0" title="Content on this page applies to the NetBeans IDE 7.2, 7.3, 7.4 and 8.0" >
<ul id="collapsableList">
<li><a href="#planStructure">Planning the Structure</a></li>
<li><a href="#createProject">Creating a New Project</a></li>
<li><a href="#prepareInterface">Preparing the Web Interface</a>
<ul>
<li><a href="#welcomePage">Setting up the welcome page</a></li>
<li><a href="#responsePage">Creating the response page</a></li>
<li><a href="#stylesheet">Creating a stylesheet</a></li>
</ul></li>
<li><a href="#prepareCommunication">Preparing Communication between the Application and Database</a>
<ul>
<li><a href="#setUpJDBC">Setting up a JDBC data source and connection pool</a></li>
<li><a href="#referenceDataSource">Referencing the data source from the application</a></li>
<li><a href="#addJar">Adding the database driver's JAR file to the server</a></li>
</ul></li>
<li><a href="#addLogic">Adding Dynamic Logic</a>
<ul>
<li><a href="#addJSTL">Adding the JSTL library to the project's classpath</a></li>
<li><a href="#addCode">Implementing JSTL code</a></li>
</ul></li>
<li><a href="#run">Running the Completed Application</a></li>
<li><a href="#troubleshoot">Troubleshooting</a>
<ul>
<li><a href="#access">Do database resources exist?</a></li>
<li><a href="#datasource">Do the connection pool and data source exist on the server?</a></li>
<li><a href="#driver">Is the MySQL Connector/J driver accessible to the GlassFish server?</a></li>
<li><a href="#password">Is the database password-protected?</a></li>
<li><a href="#ping">Are the connection pool properties correctly set?</a></li>
</ul></li>
<li><a href="#seeAlso">See Also</a></li>
</ul>
<p><strong>To follow this tutorial, you need the following software and resources.</strong></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.2, 7.3, 7.4, 8.0, Java EE bundle</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">version 7 or 8</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://dev.mysql.com/downloads/mysql/">MySQL database server</a></td>
<td class="tbltd1">5.x</td>
</tr>
<tr>
<td class="tbltd1">MySQL Connector/J JDBC Driver</td>
<td class="tbltd1">version 5.x</td>
</tr>
<tr>
<td class="tbltd1">GlassFish Server Open Source Edition</td>
<td class="tbltd1">3.x or 4.x</td>
</tr>
</tbody>
</table>
<p><strong class="notes">Notes:</strong></p>
<ul>
<li>The Java download bundle of the NetBeans IDE enables you to install the GlassFish server.
You require the GlassFish server to work through this tutorial.</li>
<li>The <a href="http://dev.mysql.com/downloads/connector/j/">MySQL Connector/J
JDBC Driver</a>, necessary for communication between Java platforms and the
MySQL database protocol, is included in the NetBeans IDE.</li>
<li>If you need to compare your project with a working solution, you can
<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FIFPWAFCAD.zip">download
the sample application</a>.</li>
</ul>
<br>
<h2 id="planStructure">Planning the Structure</h2>
<p>Simple web applications can be designed using a <em>two-tier architecture</em>,
in which a client communicates directly with a server. In this tutorial, a
Java web application communicates directly with a MySQL database using the
Java Database Connectivity API. Essentially, it is the
<a href="http://dev.mysql.com/downloads/connector/j/">MySQL Connector/J JDBC
Driver</a> that enables communication between the Java code understood by the
application server (the GlassFish server), and any content in SQL, the language understood
by the database server (MySQL).</p>
<p>The application you build in this tutorial involves the creation of two JSP pages.
In each of these pages you use HTML and CSS to implement a simple interface, and
apply JSTL technology to perform the logic that directly queries the database
and inserts the retrieved data into the two pages. The two database tables,
<code>Subject</code> and <code>Counselor</code>, are contained in the MySQL
database, <code>MyNewDatabase</code>, which you create by completing the
<a href="../ide/mysql.html">Connecting to a MySQL Database</a> tutorial.
Consider the following two-tier scenario.</p>
<div class="indent">
<a name="appStructure"></a>
<img src="../../../images_www/articles/72/web/mysql-webapp/ifpwafcad-structure.png"
alt="Diagram depicting the structure of a two-tier web application"
title="Sample structure of a two-tier web application" class="margin-around">
</div>
<p>The welcome page (<code>index.jsp</code>) presents the user with a simple HTML form.
When a browser requests <code>index.jsp</code>, the JSTL code within the page initiates
a query on <code>MyNewDatabase</code>. It retrieves data from the <code>Subject</code>
database table, and inserts it into to the page before it is sent to the browser. When
the user submits his or her selection in the welcome page's HTML form, the submit
initiates a request for the response page (<code>response.jsp</code>). Again, the JSTL
code within the page initiates a query on <code>MyNewDatabase</code>. This time, it
retrieves data from both the <code>Subject</code> and <code>Counselor</code> tables
and inserts it into to the page, allowing the user to view data based upon his or her
selection when the page is returned to the browser.</p>
<p>In order to implement the scenario described above, you develop a simple application
for a fictitious organization named IFPWAFCAD, The International Former Professional
Wrestlers' Association for Counseling and Development.</p>
<div class="indent">
<h4 class="cell">index.jsp</h4>
<img src="../../../images_www/articles/72/web/mysql-webapp/index-page.png"
alt="index.jsp displayed in a browser" class="b-all margin-around"
title="index.jsp displayed in a browser">
<br><br>
<h4 class="cell">response.jsp</h4>
<img src="../../../images_www/articles/72/web/mysql-webapp/response-page.png"
alt="response.jsp displayed in a browser" class="b-all margin-around"
title="response.jsp displayed in a browser">
</div>
<br>
<h2 id="createProject">Creating a New Project</h2>
<p>Begin by creating a new Java web project in the IDE:</p>
<ol>
<li>Choose File &gt; New Project (Ctrl-Shift-N; &#8984-Shift-N on Mac) from
the main menu. Select the Java Web category, then select Web Application. Click Next.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/new-project.png"
alt="New Project wizard"
title="Use the IDE's New Project wizard to create a new project"
class="margin-around b-all">
<p>The New Project wizard allows you to create an empty web application in
a standard IDE project. The standard project uses an IDE-generated Ant
build script to compile, deploy, and run the application.</p></li>
<li>In Project Name, enter <strong>IFPWAFCAD</strong>. Also, specify the location
for the project on your computer. (By default, the IDE places projects in a
<code>NetBeansProjects</code> folder located in your home directory.) Click Next.</li>
<li>In the Server and Settings panel, specify the GlassFish server as server which will be
used to run the application.
<p class="notes"><strong>Note. </strong>The GlassFish server displays in the Server drop-down
field if you installed the Java version of the <a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a>.
Because the GlassFish server is included in the download, it is automatically
registered with the IDE. If you want to use a different server for this project,
click the Add button located next to the Server drop-down field, and register
a different server with the IDE. However, working with servers other than the GlassFish server
is beyond the scope of this tutorial.</p></li>
<li>In the Java EE Version field, select <strong>Java EE 5</strong>.
<br>
<img src="../../../images_www/articles/74/web/mysql-webapp/server-settings.png"
alt="New Web Application wizard - Server and Settings"
title="Specify server settings in the New Web Application wizard"
class="margin-around b-all">
<p>
Java EE 6 and Java EE 7 web projects do not require the use of the <code>web.xml</code> deployment
descriptor, and the NetBeans project template does not include the <code>web.xml</code>
file in Java EE 6 and Java EE 7 projects. However, this tutorial demonstrates how to declare a
data source in the deployment descriptor, and it does not rely on any features specific
to Java EE 6 or Java EE 7, so you can set the project version to Java EE 5.</p>
<p class="notes"><strong>Note.</strong> You could equally set the project version to Java
EE 6 or Java EE 7 and then create a <code>web.xml</code> deployment descriptor. (From the New File wizard,
select the Web category, then Standard Deployment Descriptor.)</p></li>
<li>Click Finish. The IDE creates a project template for the entire application, and opens
an empty JSP page (<code>index.jsp</code>) in the editor. The <code>index.jsp</code> file
serves as the welcome page for the application.</li>
</ol>
<h2 id="prepareInterface">Preparing the Web Interface</h2>
<p>Begin by preparing the welcome (<code>index.jsp</code>) and response (<code>response.jsp</code>)
pages. The welcome page implements an HTML form that is used to capture user data. Both pages
implement an HTML table to display data in a structured fashion. In this section, you also
create a stylesheet that enhances the appearance of both pages.</p>
<ul>
<li><a href="#welcomePage">Setting up the welcome page</a></li>
<li><a href="#responsePage">Creating the response page</a></li>
<li><a href="#stylesheet">Creating a stylesheet</a></li>
</ul>
<div class="indent">
<h3 id="welcomePage">Setting up the welcome page</h3>
<p>Confirm that <code>index.jsp</code> is open in the editor. If the file is not already
open, double-click <code>index.jsp</code> under the Web Pages node in the
IFPWAFCAD project in the Projects window.</p>
<ol>
<li>In the editor, change the text between the <code>&lt;title&gt;</code>
tags to: <code>IFPWAFCAD Homepage</code>.</li>
<li>Change the text between the <code>&lt;h1&gt;</code> tags to: <code>Welcome
to IFPWAFCAD, the International Former Professional Wrestlers' Association
for Counseling and Development!</code>.</li>
<li>Open the IDE's Palette by choosing Window &gt; Palette (Ctrl-Shift-8;
&#8984-Shift-8 on Mac) from the main menu. Hover your pointer over the
Table icon from the HTML category and note that the default code snippet
for the item displays.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/palette.png"
alt="Palette displaying code snippet when hovering over an item"
title="Palette displays code snippet when hovering over an item"
class="margin-around b-all">
<br>
<span class="tips">You can configure the Palette to your liking - right-click
in the Palette and choose Show Big Icons and Hide Item Names to have
it display as in the image above.</span></li>
<li>Place your cursor at a point just after the <code>&lt;h1&gt;</code> tags.
(This is where you want to implement the new HTML table.) Then, in the Palette,
double-click the Table icon.</li>
<li>In the Insert Table dialog that displays, specify the following values
then click OK:
<br><br>
<ul>
<li><strong>Rows</strong>: 2</li>
<li><strong>Columns</strong>: 1</li>
<li><strong>Border Size</strong>: 0</li>
</ul>
The HTML table code is generated and added to your page.</li>
<li>Add the following content to the table heading and the cell of
the first table row (new content shown in <strong>bold</strong>):
<pre class="examplecode">
&lt;table border=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;<strong>IFPWAFCAD offers expert counseling in a wide range of fields.</strong>&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;<strong>To view the contact details of an IFPWAFCAD certified former
professional wrestler in your area, select a subject below:</strong>&lt;/td&gt;
&lt;/tr&gt;</pre></li>
<li>For the bottom row of the table, insert an HTML form. To do so, place your
cursor between the second pair of <code>&lt;td&gt;</code> tags,
then double-click the HTML form (
<img src="../../../images_www/articles/72/web/mysql-webapp/html-form-icon.png" alt="HTML form icon">
) icon in the Palette. In the Insert Form dialog, type in <code>response.jsp</code>
in the Action text field, then click OK.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/insert-form.png"
title="Specify form settings in the Insert Form dialog" alt="Insert Form dialog"
class="margin-around b-all"></li>
<li>Type in the following content between the <code>&lt;form&gt;</code> tags
(new content shown in <strong>bold</strong>):
<pre class="examplecode">
&lt;tr&gt;
&lt;td&gt;
&lt;form action=&quot;response.jsp&quot;&gt;
<strong>&lt;strong&gt;Select a subject:&lt;/strong&gt;</strong>
&lt;/form&gt;
&lt;/td&gt;
&lt;/tr&gt;</pre>
</li>
<li>Press Enter to add an empty line after the content you just added and then
double-click Drop-down List in the Palette to open the Insert Drop-down dialog box.</li>
<li>Type <code>subject_id</code> for
the Name text field in the Insert Drop-down dialog and click OK.
Note that the code snippet for the drop-down list is added to the form.
<p>
The number of options for the drop-down is currently not important.
Later in the tutorial you will add JSTL tags that dynamically
generate options based on the data gathered from the Subject database
table.</p></li>
<li>Add a submit button item (
<img src="../../../images_www/articles/72/web/mysql-webapp/submit-button.png" alt="Submit button icon">
) to a point just after the drop-down list you just added. You can either use
the Palette to do this, or invoke the editor's code completion as illustrated in
the previous step. In the Insert Button dialog, enter <code>submit</code> for
both the Label and Name text fields, then click OK.</li>
<li>To format your code, right-click in the editor and choose Format
(Alt-Shift-F; Ctrl-Shift-F on Mac). Your code is automatically formatted,
and should now look similar to the following:
<pre class="examplecode">
&lt;body&gt;
&lt;h2&gt;Welcome to &lt;strong&gt;IFPWAFCAD&lt;/strong&gt;, the International Former
Professional Wrestlers' Association for Counseling and Development!
&lt;/h2&gt;
&lt;table border=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IFPWAFCAD offers expert counseling in a wide range of fields.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;To view the contact details of an IFPWAFCAD certified former
professional wrestler in your area, select a subject below:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;form action=&quot;response.jsp&quot;&gt;
&lt;strong&gt;Select a subject:&lt;/strong&gt;
&lt;select name=&quot;subject_id&quot;&gt;
&lt;option&gt;&lt;/option&gt;
&lt;/select&gt;
&lt;input type=&quot;submit&quot; value=&quot;submit&quot; name=&quot;submit&quot; /&gt;
&lt;/form&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/body&gt;</pre>
<p>To view this page in a browser, right-click in the editor and choose
Run File (Shift-F6; Fn-Shift-F6 on Mac). When you do this, the JSP page is automatically
compiled and deployed to your server. The IDE opens your default browser
to display the page from its deployed location.</p>
<img src="../../../images_www/articles/72/web/mysql-webapp/browser-output.png"
title="index.jsp displays in a browser" alt="index.jsp displayed in a browser"
class="margin-around b-all"></li>
</ol>
<h3 id="responsePage">Creating the response page</h3>
<p>In order to prepare the interface for <code>response.jsp</code> you must first
create the file in your project. Note that most of the content that
displays in this page is generated dynamically using JSP technology.
Therefore, in the following steps you add <em>placeholders</em> which you
will later substitute for the JSP code.</p>
<ol>
<li>Right-click the IFPWAFCAD project node in the Projects window and choose
New &gt; JSP. The New JSP File dialog opens.</li>
<li>In the JSP File Name field, enter <code>response</code>. Note that Web Pages
is currently selected for the Location field, meaning that the file will
be created in the project's <code>web</code> directory. This is the same
location as where the <code>index.jsp</code> welcome page resides.</li>
<li>Accept any other default settings and click Finish. A template for the
new <code>response.jsp</code> page is generated and opens in the editor.
A new JSP node also displays under Web Pages in the Projects window.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/response-jsp-node.png"
class="margin-around b-all" alt="response.jsp node appears in the Projects window"
title="response.jsp node appears in the Projects window"></li>
<li>In the editor, change the title to: <code>IFPWAFCAD - {placeholder}</code>.</li>
<li>Remove the <code>&lt;h1&gt;Hello World!&lt;/h1&gt;</code> line between the
<code>&lt;body&gt;</code> tags, then copy and paste the following HTML table
into the body of the page:
<pre class="examplecode">
&lt;table border=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th colspan=&quot;2&quot;&gt;{placeholder}&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Description: &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size:smaller; font-style:italic;&quot;&gt;{placeholder}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Counselor: &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;{placeholder}
&lt;br&gt;
&lt;span style=&quot;font-size:smaller; font-style:italic;&quot;&gt;
member since: {placeholder}&lt;/span&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contact Details: &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;email: &lt;/strong&gt;
&lt;a href=&quot;mailto:{placeholder}&quot;&gt;{placeholder}&lt;/a&gt;
&lt;br&gt;&lt;strong&gt;phone: &lt;/strong&gt;{placeholder}
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</pre>
<p>To view this page in a browser, right-click in the editor and choose Run File
(Shift-F6; Fn-Shift-F6 on Mac). The page compiles, is deployed to the GlassFish server,
and opens in your default browser.</p>
<img src="../../../images_www/articles/72/web/mysql-webapp/browser-response.png"
title="response.jsp displays in a browser" alt="response.jsp displayed in a browser"
class="margin-around b-all"></li>
</ol>
<h3 id="stylesheet">Creating a stylesheet</h3>
<p>Create a simple stylesheet that enhances the display of the web interface. This
tutorial assumes that you understand how style rules function, and how they affect
corresponding HTML elements found in <code>index.jsp</code> and <code>response.jsp</code>.</p>
<ol>
<li>Open the New File wizard by pressing the New File (
<img src="../../../images_www/articles/72/web/mysql-webapp/new-file-btn.png" alt="New File button">
) button in the IDE's main toolbar. Select the Web category, then select
Cascading Style Sheet and click Next.</li>
<li>Type <code>style</code> for CSS File Name and click Finish. The IDE creates
an empty CSS file and places it in the same project location as
<code>index.jsp</code> and <code>response.jsp</code>. Note that a node for
<code>style.css</code> now displays within the project in the Projects
window, and the file opens in the editor.</li>
<li>In the editor, add the following content to the <code>style.css</code> file:
<pre class="examplecode">
body {
font-family: Verdana, Arial, sans-serif;
font-size: smaller;
padding: 50px;
color: #555;
}
h1 {
text-align: left;
letter-spacing: 6px;
font-size: 1.4em;
color: #be7429;
font-weight: normal;
width: 450px;
}
table {
width: 580px;
padding: 10px;
background-color: #c5e7e0;
}
th {
text-align: left;
border-bottom: 1px solid;
}
td {
padding: 10px;
}
a:link {
color: #be7429;
font-weight: normal;
text-decoration: none;
}
a:link:hover {
color: #be7429;
font-weight: normal;
text-decoration: underline;
}</pre></li>
<li>Link the stylesheet to <code>index.jsp</code> and <code>response.jsp</code>.
In both pages, add the following line between the <code>&lt;head&gt;</code>
tags:
<pre class="examplecode">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;style.css&quot;&gt;</pre>
<span class="tips">To quickly navigate between files that are open in the editor,
press Ctrl-Tab, then select the file you are wanting.</span></li>
</ol>
</div>
<br>
<h2 id="prepareCommunication">Preparing Communication between the Application and Database</h2>
<p>The most efficient way to implement communication between the server and database is
to set up a database <em>connection pool</em>. Creating a new connection for each
client request can be very time-consuming, especially for applications that continuously
receive a large number of requests. To remedy this, numerous connections are created
and maintained in a connection pool. Any incoming requests that require access to the
application's data layer use an already-created connection from the pool. Likewise,
when a request is completed, the connection is not closed down, but returned to the
pool.</p>
<p>After preparing the data source and connection pool for the server, you then need to
instruct the application to use the data source. This is typically done by creating
an entry in the application's <code>web.xml</code> deployment descriptor. Finally,
you need to ensure that the database driver (MySQL Connector/J JDBC Driver) is accessible
to the server.</p>
<div class="indent">
<div class="feedback-box float-left" style="width: 723px;">
<p><strong class="notes">Important: </strong> From this point forward, you need you
ensure that you have a MySQL database instance named <code>MyNewDatabase</code>
set up that contains sample data provided in
<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252Fifpwafcad.sql">ifpwafcad.sql</a>.
This SQL file creates two tables, <code>Subject</code> and <code>Counselor</code>, then
populates them with sample data. If you have not already done this, or if you need help
with this task, see <a href="../../docs/ide/mysql.html">Connecting to a MySQL Database</a>
before proceeding further.</p>
<p>Also, your database needs to be password-protected to create a data source and
work with the GlassFish server in this tutorial. If you are using the default MySQL <code>root</code>
account with an empty password, you can set the password from a command-line prompt.
<br><br>
This tutorial uses <code>nbuser</code> as an example password. To set your password
to <code><em>nbuser</em></code>, navigate to your MySQL installation's <code>bin</code>
directory in the command-line prompt and enter the following:</p>
<pre class="examplecode" style="width: 703px;">
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('<em>nbuser</em>')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES;</pre>
<p>For more information, see the official MySQL Reference Manual:
<a href="http://dev.mysql.com/doc/refman/5.1/en/default-privileges.html">Securing
the Initial MySQL Accounts</a>.</p>
</div>
</div>
<br style="clear: both;"/>
<ol>
<li><a href="#setUpJDBC">Setting up a JDBC data source and connection pool</a></li>
<li><a href="#referenceDataSource">Referencing the data source from the application</a></li>
<li><a href="#addJar">Adding the database driver's JAR file to the server</a></li>
</ol>
<div class="indent">
<h3 id="setUpJDBC">Setting up a JDBC data source and connection pool</h3>
<p>The GlassFish Server Open Source Edition contains Database Connection Pooling (DBCP)
libraries that provide connection pooling functionality in a way that is
transparent to you as a developer. To take advantage of this, you need to
configure a <a href="http://docs.oracle.com/javase/tutorial/jdbc/overview/index.html">JDBC</a>
(Java Database Connectivity) <em>data source</em> for the server which your
application can use for connection pooling.</p>
<p class="tips">For more information on JDBC technology, see
<a href="http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html">The
Java Tutorials: JDBC Basics</a>.</p>
<p>You could configure the data source directly within the GlassFish server Admin Console,
or, as described below, you can declare the resources that your application needs
in a <code>glassfish-resources.xml</code> file. When the application is deployed, the
server reads in the resource declarations, and creates the necessary resources.</p>
<p>The following steps demonstrate how to declare a connection pool, and a data source
that relies on the connection pool. The NetBeans JDBC Resource wizard allows you
to perform both actions.</p>
<ol>
<li>Open the New File wizard by pressing the New File (
<img src="../../../images_www/articles/72/web/mysql-webapp/new-file-btn.png" alt="New File button">
) button in the IDE's main toolbar. Select the GlassFish server category, then select
JDBC Resource and click Next.</li>
<li>In step 2, General Attributes, choose the Create New JDBC Connection Pool option,
then in the JNDI Name text field, type in <strong>jdbc/IFPWAFCAD</strong>.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/jdbc-resource-wizard.png"
title="Specify data source settings in the JDBC Resource wizard"
alt="JDBC Resource wizard, step 2: General Attributes"
class="b-all margin-around">
<br>
<span class="tips">The JDBC data source relies on
<a href="http://www.oracle.com/technetwork/java/jndi/index.html">JNDI</a>,
the Java Naming and Directory Interface. The JNDI API provides a uniform way for
applications to find and access data sources. For more information, see
<a href="http://docs.oracle.com/javase/jndi/tutorial/">The JNDI Tutorial</a>.</span></li>
<li>Optionally, add a description for the data source. For example, type in:
<code>Accesses the database that provides data for the IFPWAFCAD application</code>.</li>
<li>Click Next, then click Next again to skip step 3, Additional Properties.</li>
<li>In Step 4, type in <strong>IfpwafcadPool</strong> for JDBC Connection Pool Name.
Make sure the Extract from Existing Connection option is selected, and choose
<code>jdbc:mysql://localhost:3306/MyNewDatabase</code> from the drop-down list. Click Next.
<br>
<img src="../../../images_www/articles/74/web/mysql-webapp/jdbc-resource-wizard2.png"
title="Specify connection pool settings in the JDBC Resource wizard"
alt="JDBC Resource wizard, step 4: Choose Database Connection"
class="b-all margin-around">
<br><br>
<strong class="notes">Note: </strong>The wizard detects any database
connections that have been set up in the IDE. Therefore, you need to
have already created a connection to the <code>MyNewDatabase</code> database
at this point. You can verify what connections have been created by
opening the Services window (Ctrl-5; &#8984-5 on Mac) and looking for
connection nodes (
<img src="../../../images_www/articles/72/web/mysql-webapp/connection-node-icon.png"
alt="database connection node icon"> ) under the Databases category.</li>
<li>In Step 5, select <code>javax.sql.ConnectionPoolDataSource</code> in the Resource Type drop-down list.
<p>Note that the IDE extracts information from the database
connection you specified in the previous step, and sets name-value properties
for the new connection pool.</p>
<img src="../../../images_www/articles/74/web/mysql-webapp/jdbc-resource-wizard3.png"
title="Default values are based on information extracted from the selected database connection"
alt="JDBC Resource wizard, step 5: Add Connection Pool Properties" class="b-all margin-around"></li>
<li>Click Finish. The wizard generates a <code>glassfish-resources.xml</code> file that
contains entries for the data source and connection pool you specified.</li>
</ol>
<p>In the Projects window, you can open the <code>glassfish-resources.xml</code> file
that was created under the Server Resources node and note that, within the <code>&lt;resources&gt;</code>
tags, a data source and connection pool have been declared containing the values you
previously specified.</p>
<p class="tips">To confirm that a new data source and connection pool are indeed
registered with the GlassFish server, you can deploy the project to the server, then locate
the resources in the IDE's Services window:</p>
<ol>
<li>In the Projects window, right-click the IFPWAFCAD project node and
choose Deploy. The server starts up if not already running, and the project
is compiled and deployed to it.</li>
<li id="view-connection-pool">Open the Services window (Ctrl-5; &#8984-5 on Mac)
and expand the Servers &gt; GlassFish &gt; Resources &gt; JDBC &gt; JDBC
Resources and Connection Pools nodes. Note that the new data source and
connection pool are now displayed:
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/services-window-glassfish.png"
alt="New data source and connection pool displayed in Services window" class="margin-around b-all"
title="New data source and connection pool displayed in Services window">
</li>
</ol>
<h3 id="referenceDataSource">Referencing the data source from the application</h3>
<p>You need to reference the JDBC resource you just configured from the web application.
To do so, you can create an entry in the application's <code>web.xml</code> deployment
descriptor.</p>
<p>Deployment descriptors are XML-based text files that contain information describing
how an application is to be deployed to a specific environment. For example, they
are normally used to specify application context parameters and behavioral patterns,
security settings, as well as mappings for servlets, filters and listeners.</p>
<p class="notes"><strong>Note.</strong> If you specified Java EE 6 or Java EE 7 as the Java version when you
created the project, you need to create the deployment descriptor file by choosing
Web &gt; Standard Deployment Descriptor in the New File wizard.</p>
<p>Perform the following steps to reference the data source in the application's deployment
descriptor.</p>
<ol>
<li>In the Projects window, expand the Configuration Files folder and double-click
<code>web.xml</code> to open the file in the editor.</li>
<li>Click the References tab located along the top of the editor. </li>
<li>Expand the Resource References heading and click Add to open the Add Resource Reference dialog.</li>
<li>For Resource Name, enter the resource name that you gave when configuring the
data source for the server above (<code>jdbc/IFPWAFCAD</code>). </li>
<li>Type <strong><code>javax.sql.ConnectionPoolDataSource</code></strong> in the Resource Type field. Click OK.
<p>The Description field
is optional, but you can enter a human-readable description of the resource, e.g.,
<code>Database for IFPWAFCAD application</code>. </p>
<img src="../../../images_www/articles/74/web/mysql-webapp/add-resource-reference.png"
alt="Add Resource Reference dialog" class="margin-around b-all"
title="Specify resource properties in the Add Resource Reference dialog">
<p>The new resource is now listed under the Resource References heading.</p>
</li>
<li>To verify that the resource is now added to the <code>web.xml</code> file,
click the Source tab located along the top of the editor. Notice
that the following &lt;<code>resource-ref</code>&gt; tags are now included.
<pre class="examplecode">
&lt;resource-ref&gt;
&lt;description&gt;Database for IFPWAFCAD application&lt;/description&gt;
&lt;res-ref-name&gt;jdbc/IFPWAFCAD&lt;/res-ref-name&gt;
&lt;res-type&gt;javax.sql.ConnectionPoolDataSource&lt;/res-type&gt;
&lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;
&lt;/resource-ref&gt;</pre>
</li>
</ol>
<h3 id="addJar">Adding the database driver's JAR file to the server</h3>
<p>Adding the database driver's JAR file is another step that is vital to enabling the
server to communicate with your database. Ordinarily, you would need to locate your
database driver's installation directory and copy the <code>mysql-connector-java-5.1.6-bin.jar</code>
file from the driver's root directory into the library folder of the server you are
using. Fortunately, the IDE's server management is able to detect at deployment whether
the JAR file has been added - and if not, it does so automatically.</p>
<p>In order to demonstrate this, open the Servers manager (Choose Tools &gt; Servers).
The IDE provides a JDBC driver deployment option. If the option is enabled, it
initiates a check to determine whether any drivers are required for the server's
deployed applications. In the case of MySQL, if the driver is required and it is
missing, the IDE's bundled driver is deployed to the appropriate location on the
server.</p>
<ol>
<li>Choose Tools &gt; Servers to open the Servers manager. Select the GlassFish server
in the left pane.</li>
<li>In the main pane, select the Enable JDBC Driver Deployment option.
<br>
<img src="../../../images_www/articles/74/web/mysql-webapp/servers-window.png"
title="JDBC Driver Deployment option enables automatic driver deployment"
class="margin-around b-all" alt="Servers window - the GlassFish server 3.0.1"></li>
<li>Before you close the Servers manager, make a note of the path indicated in the Domains
folder text field. When you connect to the GlassFish server in the IDE, you are actually
connecting to an <em>instance</em> of the application server. Each instance runs
applications in a unique domain, and the Domain Name field indicates the name
of the domain your server is using. As shown in the image above, the driver JAR
file should be located within <code>domain1</code>, which is the default domain
created upon installing the GlassFish server.</li>
<li>Click Close to exit the Servers manager.</li>
<li>On your computer, navigate to the GlassFish server installation directory and drill into
the <code>domains</code> &gt; <code>domain1</code> &gt; <code>lib</code> subfolder.
Because you should have already deployed the IFPWAFCAD project to the server,
you should see the <code>mysql-connector-java-5.1.6-bin.jar</code> file.
If you do not see the driver JAR file, perform the following step.</li>
<li>Deploy your project to the server. In the IDE's Projects window, choose Deploy
from the right-click menu of the project node. You can view progress in the IDE's
Output window (Ctrl-4; &#8984-4 on Mac). The output indicates that the MySQL driver
is deployed to a location in the GlassFish server.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/output-window.png"
title="Output window indicates that the MySQL driver has been deployed"
class="margin-around b-all" alt="Output window indicating MySQL driver has been deployed">
<br>
Now, if you return to the <code>domain1/lib</code> subfolder on your computer, you can
see that the <code>mysql-connector-java-5.1.6-bin.jar</code> file has been automatically
added.</li>
</ol>
</div>
<br>
<h2 id="addLogic">Adding Dynamic Logic</h2>
<p>Returning to the <code>index.jsp</code> and <code>response.jsp</code> placeholders
that you created earlier in the tutorial, you can now implement the JSTL code
that enables pages to generate content <em>dynamically</em>, i.e., based on user
input. To do so, perform the following three tasks.</p>
<ol>
<li><a href="#addJSTL">Add the JSTL library to the project's classpath</a></li>
<li><a href="#implementCode">Implement JSTL code</a></li>
</ol>
<div class="indent">
<h3 id="addJSTL">Adding the JSTL library to the project's classpath</h3>
<p>You can apply the <a href="http://www.oracle.com/technetwork/java/index-jsp-135995.html">JavaServer Pages
Standard Tag Library</a> (JSTL) to access and display data taken from the database.
The GlassFish server includes the JSTL library by default.
You can verify this by expanding the GlassFish Server node under the Libraries
node in the Projects window, and
searching for the <code>javax.servlet.jsp.jstl.jar</code> library.
(Older versions of the GlassFish server use the <code>jstl-impl.jar</code> library.)
Because the GlassFish server libraries
are by default added to your project's classpath, you do not have to perform any steps
for this task.</p>
<p>JSTL provides the following four basic areas of functionality.</p>
<ul>
<li><code>core</code>: common, structural tasks such as iterators and conditionals
for handling flow control</li>
<li><code>fmt</code>: internationalization and localization message formatting</li>
<li><code>sql</code>: simple database access</li>
<li><code>xml</code>: handling of XML content</li>
</ul>
<p>This tutorial focuses on usage of the <code>core</code> and <code>sql</code>
tag libraries.</p>
<h3 id="implementCode">Implementing JSTL code</h3>
<p>Now you can implement the code that dynamically retrieves and displays data for
each page. Both pages require that you implement an SQL query that utilizes the
data source created earlier in the tutorial.</p>
<p>The IDE provides several database-specific JSTL snippets which you can select
from the Palette (Ctrl-Shift-8; &#8984-Shift-8 on Mac).</p>
<img src="../../../images_www/articles/72/web/mysql-webapp/palette-db.png"
title="Choose database-specific JSTL snippets from the Palette"
class="margin-around b-all" alt="Database snippets available from the Palette">
<h4>index.jsp</h4>
<p>In order to dynamically display the contents of the form in <code>index.jsp</code>,
you need to access all <code>name</code>s from the <code>Subject</code> database
table.</p>
<ol>
<li>Hover your mouse over the DB Report item in the Palette.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/db-report.png"
title="Type 'db' and press Ctrl-Space to access database-specific JSTL snippets"
class="margin-around" alt="Database snippets available from the Palette">
<p>The DB Report item uses the <code>&lt;sql:query&gt;</code> tag to create
an SQL query, then it uses the <code>&lt;c:forEach&gt;</code> tag to loop
through the query's <code>resultset</code> and output the retrieved data.</p></li>
<li>Place your cursor above the <code>&lt;%@page ... %&gt;</code> declaration (line 7),
then double-click the DB Report item in the Palette. In the dialog that displays,
enter the following details:
<ul>
<li><strong>Variable Name:</strong> <code>subjects</code></li>
<li><strong>Scope:</strong> <code>page</code></li>
<li><strong>Data Source:</strong> <code>jdbc/IFPWAFCAD</code></li>
<li><strong>Query Statement:</strong> <code>SELECT subject_id, name FROM Subject</code></li>
</ul>
<img src="../../../images_www/articles/72/web/mysql-webapp/insert-db-report.png"
title="Use the Insert DB Report dialog to specify query-specific details"
class="margin-around b-all" alt="Insert DB Report dialog"></li>
<li>Click OK. The following content is generated in the <code>index.jsp</code>
file. (New content shown in <strong>bold</strong>.)
<pre class="examplecode">
<strong>&lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;%&gt;
&lt;%@taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot;%&gt;</strong>
&lt;%--
Document : index
Author : nbuser
--%&gt;
<strong>&lt;sql:query var=&quot;subjects&quot; dataSource=&quot;jdbc/IFPWAFCAD&quot;&gt;
SELECT subject_id, name FROM Subject
&lt;/sql:query&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;!-- column headers --&gt;
&lt;tr&gt;
&lt;c:forEach var=&quot;columnName&quot; items=&quot;${subjects.columnNames}&quot;&gt;
&lt;th&gt;&lt;c:out value=&quot;${columnName}&quot;/&gt;&lt;/th&gt;
&lt;/c:forEach&gt;
&lt;/tr&gt;
&lt;!-- column data --&gt;
&lt;c:forEach var=&quot;row&quot; items=&quot;${subjects.rowsByIndex}&quot;&gt;
&lt;tr&gt;
&lt;c:forEach var=&quot;column&quot; items=&quot;${row}&quot;&gt;
&lt;td&gt;&lt;c:out value=&quot;${column}&quot;/&gt;&lt;/td&gt;
&lt;/c:forEach&gt;
&lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/table&gt;</strong>
&lt;%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</pre>
Note that the IDE automatically added <code>taglib</code> directives
needed for the JSTL tags used in the generated content (<code>&lt;sql:query&gt;</code>
and <code>&lt;c:forEach&gt;</code>). A <code>taglib</code> directive
declares that the JSP page uses custom (i.e., JSTL) tags, names the tag
library that defines them, and specifies their tag prefix.</li>
<li>Run the project to see how it displays in a browser. Right-click
the project node in the Projects window and choose Run.
<p>When you choose Run, the IDE deploys the project to the GlassFish server,
the index page is compiled into a servlet, and the welcome page opens in your default browser.
The code generated from the DB Report item creates the following table in the welcome page.</p>
<img src="../../../images_www/articles/72/web/mysql-webapp/db-report-table.png"
alt="Browser displaying table containing data from Subject database table"
title="Use DB Report for quick prototyping of database table data"
class="margin-around">
<p>
As you can see, the DB Report item enables you to quickly test your database
connection, and enables you to view table data from the database in your
browser. This can be particularly useful when prototyping.</p>
<p>
The following steps demonstrate how to integrate the generated code into the
HTML drop-down list you created earlier in the tutorial.</p></li>
<li>Examine the column data in the generated code. Two <code>&lt;c:forEach&gt;</code>
tags are used; one is nested inside the other. This causes the JSP container (i.e.,
the GlassFish server) to perform a loop on all table rows, and for each row, it loops through
all columns. In this manner, data for the entire table is displayed.</li>
<li>Integrate the <code>&lt;c:forEach&gt;</code> tags into the HTML form as follows.
The value of each item becomes the <code>subject_id</code>, and the output text
becomes the <code>name</code>, as recorded in the database. (Changes are displayed
in <strong>bold</strong>).
<pre class="examplecode">
&lt;form action=&quot;response.jsp&quot;&gt;
&lt;strong&gt;Select a subject:&lt;/strong&gt;
&lt;select name=&quot;subject_id&quot;&gt;
<strong>&lt;c:forEach var=&quot;row&quot; items=&quot;${subjects.rowsByIndex}&quot;&gt;
&lt;c:forEach var=&quot;column&quot; items=&quot;${row}&quot;&gt;</strong>
&lt;option <strong>value=&quot;&lt;c:out value=&quot;${column}&quot;/&gt;&quot;</strong>&gt;<strong>&lt;c:out value=&quot;${column}&quot;/&gt;</strong>&lt;/option&gt;
<strong>&lt;/c:forEach&gt;
&lt;/c:forEach&gt;</strong>
&lt;/select&gt;
&lt;input type=&quot;submit&quot; value=&quot;submit&quot; name=&quot;submit&quot; /&gt;
&lt;/form&gt;</pre>
<span class="tips">An alternative, simpler way to integrate the <code>&lt;c:forEach&gt;</code>
tags into the HTML form would be as follows.</span>
<pre class="examplecode">
&lt;form action=&quot;response.jsp&quot;&gt;
&lt;strong&gt;Select a subject:&lt;/strong&gt;
&lt;select name=&quot;subject_id&quot;&gt;
<strong>&lt;c:forEach var=&quot;row&quot; items=&quot;${subjects.rows}&quot;&gt;</strong>
&lt;option <strong>value=&quot;${row.subject_id}&quot;</strong>&gt;<strong>${row.name}</strong>&lt;/option&gt;
<strong>&lt;/c:forEach&gt;</strong>
&lt;/select&gt;
&lt;input type=&quot;submit&quot; value=&quot;submit&quot; name=&quot;submit&quot; /&gt;
&lt;/form&gt;</pre>
<p>In either case, the <code>&lt;c:forEach&gt;</code> tags loop through all
<code>subject_id</code> and <code>name</code> values from the SQL query, and
insert each pair into the HTML <code>&lt;option&gt;</code> tags. In this manner,
the form's drop-down list is populated with data.</p></li>
<li>Delete the table that was generated from the DB Report item. (Deletion shown
below as <strong><strike>strike-through text</strike></strong>.)
<pre class="examplecode">
&lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;%&gt;
&lt;%@taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot;%&gt;
&lt;%--
Document : index
Created on : Dec 22, 2009, 7:39:49 PM
Author : nbuser
--%&gt;
&lt;sql:query var=&quot;subjects&quot; dataSource=&quot;jdbc/IFPWAFCAD&quot;&gt;
SELECT subject_id, name FROM Subject
&lt;/sql:query&gt;
<strong><strike>&lt;table border=&quot;1&quot;&gt;
&lt;!-- column headers --&gt;
&lt;tr&gt;
&lt;c:forEach var=&quot;columnName&quot; items=&quot;${subjects.columnNames}&quot;&gt;
&lt;th&gt;&lt;c:out value=&quot;${columnName}&quot;/&gt;&lt;/th&gt;
&lt;/c:forEach&gt;
&lt;/tr&gt;
&lt;!-- column data --&gt;
&lt;c:forEach var=&quot;row&quot; items=&quot;${subjects.rowsByIndex}&quot;&gt;
&lt;tr&gt;
&lt;c:forEach var=&quot;column&quot; items=&quot;${row}&quot;&gt;
&lt;td&gt;&lt;c:out value=&quot;${column}&quot;/&gt;&lt;/td&gt;
&lt;/c:forEach&gt;
&lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/table&gt;</strike></strong>
&lt;%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</pre></li>
<li>Save your changes (Ctrl-S; &#8984-S on Mac).
<li>Refresh the welcome page of the project in your browser.
<p>Note that the drop-down list in the browser now
contains subject names that were retrieved from the database.</p>
<p class="tips">You do not need to redeploy your project because
compile-on-save is enabled for your project by default.
This means that when you modify and save a file, the file is
automatically compiled and deployed and you do not need to recompile the entire project.
You can enable and disable compile-on-save for your project in the Compiling category
of the Properties window of the project.</p>
</li>
</ol>
<h4>response.jsp</h4>
<p>The response page provides details for the counselor who corresponds to the
subject chosen in the welcome page. The query you create must select the counselor
record whose <code>counselor_id</code> matches the <code>counselor_idfk</code>
from the selected subject record.</p>
<ol>
<li>Place your cursor above the <code>&lt;%@page ... %&gt;</code> declaration (line 7),
and double-click DB Query in the Palette to open the Insert DB Query dialog box.</li>
<li>Enter the following details in the Insert DB Query dialog box.
<ul>
<li><strong>Variable Name:</strong> <code>counselorQuery</code></li>
<li><strong>Scope:</strong> <code>page</code></li>
<li><strong>Data Source:</strong> <code>jdbc/IFPWAFCAD</code></li>
<li><strong>Query Statement:</strong> <code>SELECT * FROM Subject, Counselor WHERE
Counselor.counselor_id = Subject.counselor_idfk AND Subject.subject_id = ?
&lt;sql:param value=&quot;${param.subject_id}&quot;/&gt;</code></li>
</ul>
<img src="../../../images_www/articles/72/web/mysql-webapp/insert-db-query2.png"
title="Use the Insert DB Query dialog to specify query-specific details"
class="margin-around b-all" alt="Insert DB Query dialog"></li>
<li>Click OK. The following content is generated in the <code>response.jsp</code>
file. (New content shown in <strong>bold</strong>.)
<pre class="examplecode">
<strong>&lt;%@taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot;%&gt;</strong>
&lt;%--
Document : response
Created on : Dec 22, 2009, 8:52:57 PM
Author : nbuser
--%&gt;
<strong>&lt;sql:query var=&quot;counselorQuery&quot; dataSource=&quot;jdbc/IFPWAFCAD&quot;&gt;
SELECT * FROM Subject, Counselor
WHERE Counselor.counselor_id = Subject.counselor_idfk
AND Subject.subject_id = ? &lt;sql:param value=&quot;${param.subject_id}&quot;/&gt;
&lt;/sql:query&gt;</strong>
&lt;%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</pre>
Note that the IDE automatically added the <code>taglib</code> directive
needed for the <code>&lt;sql:query&gt;</code> tag. Also, note that you
used an <code>&lt;sql:param&gt;</code> tag directly within the query.
Because this query relies on the <code>subject_id</code> value that
was submitted from <code>index.jsp</code>, you can extract the value
using an EL (Expression Language) statement in the form of
<code>${param.subject_id}</code>, and then pass it to the
<code>&lt;sql:param&gt;</code> tag so that it can be used in place of
the SQL question mark (<code>?</code>) during runtime.</li>
<li>Use a <code>&lt;c:set&gt;</code> tag to set a variable that corresponds
to the first record (i.e., row) of the <code>resultset</code> returned
from the query. (New content shown in <strong>bold</strong>.)
<pre class="examplecode">
&lt;sql:query var=&quot;counselorQuery&quot; dataSource=&quot;jdbc/IFPWAFCAD&quot;&gt;
SELECT * FROM Subject, Counselor
WHERE Counselor.counselor_id = Subject.counselor_idfk
AND Subject.subject_id = ? &lt;sql:param value=&quot;${param.subject_id}&quot;/&gt;
&lt;/sql:query&gt;
<strong>&lt;c:set var=&quot;counselorDetails&quot; value=&quot;${counselorQuery.rows[0]}&quot;/&gt;</strong></pre>
Although the <code>resultset</code> returned from the query should only
contain a single record, this is a necessary step because the page needs
to access values from the record using EL (Expression Language) statements.
Recall that in <code>index.jsp</code>, you were able to access values from
the <code>resultset</code> simply by using a <code>&lt;c:forEach&gt;</code>
tag. However, the <code>&lt;c:forEach&gt;</code> tag operates by setting a
variable for the rows contained in the query, thus enabling you to extract
values by including the row variable in EL statements.</li>
<li>Add the <code>taglib</code> directive for the JSTL <code>core</code> library
to the top of the file, so that the <code>&lt;c:set&gt;</code> tag is understood.
(New content shown in <strong>bold</strong>.)
<pre class="examplecode">
<strong>&lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;%&gt;</strong>
&lt;%@taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot;%&gt;</pre></li>
<li>In the HTML markup, replace all placeholders with EL statements code that
display the data held in the <code>counselorDetails</code> variable.
(Changes below shown in <strong>bold</strong>):
<pre class="examplecode">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;/&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;style.css&quot;&gt;
&lt;title&gt;<strong>${counselorDetails.name}</strong>&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th colspan=&quot;2&quot;&gt;<strong>${counselorDetails.name}</strong>&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Description: &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size:smaller; font-style:italic;&quot;&gt;<strong>${counselorDetails.description}</strong>&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Counselor: &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;<strong>${counselorDetails.first_name} ${counselorDetails.nick_name} ${counselorDetails.last_name}</strong>&lt;/strong&gt;
&lt;br&gt;&lt;span style=&quot;font-size:smaller; font-style:italic;&quot;&gt;
&lt;em&gt;member since: <strong>${counselorDetails.member_since}</strong>&lt;/em&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contact Details: &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;email: &lt;/strong&gt;
&lt;a href=&quot;mailto:<strong>${counselorDetails.email}</strong>&quot;&gt;<strong>${counselorDetails.email}</strong>&lt;/a&gt;
&lt;br&gt;&lt;strong&gt;phone: &lt;/strong&gt;<strong>${counselorDetails.telephone}</strong>&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></li>
</ol>
</div>
<br>
<h2 id="run">Running the Completed Application</h2>
<p>You've now completed the application. Try running it again to see how it displays
in a browser. Note that because of NetBeans' Compile on Save feature, you do not
need to worry about compiling or redeploying the application. When you run a project,
you can be sure the deployment contains your latest changes.</p>
<p>Click the Run Project (
<img src="../../../images_www/articles/72/web/mysql-webapp/run-project-btn.png"
alt="Run Project button"> ) button in the main toolbar. The <code>index.jsp</code>
page opens in the IDE's default browser.</p>
<p>When <code>index.jsp</code> displays in the browser, select a subject from the
drop-down list and click <code>submit</code>. You should now be forwarded to
the <code>response.jsp</code> page, showing details corresponding to your selection.</p>
<div class="indent">
<img src="../../../images_www/articles/72/web/mysql-webapp/response-display.png" class="margin-around"
alt="response.jsp displayed in a browser, showing data retrieved from database"
title="response.jsp displayed in a browser, showing data retrieved from database">
</div>
<p>This concludes the Creating a Simple Web Application Using a MySQL Database tutorial.
This document demonstrated how to create a simple web application that connects to
a MySQL database. It also demonstrated how to construct an application using a basic
two-tier architecture, and utilized numerous technologies including JSP, JSTL,
JDBC, and JNDI as a means of accessing and displaying data dynamically.</p>
<br>
<h2 id="troubleshoot">Troubleshooting</h2>
<p>Most of the problems that occur with the tutorial application are due to communication
difficulties between the GlassFish Server Open Source Edition and the MySQL database server.
If your application does not display correctly, or if you are receiving a server error,
the following examinations may be useful.</p>
<ul>
<li><a href="#access?">Do database resources exist?</a></li>
<li><a href="#datasource?">Do the connection pool and data source exist on the server?</a></li>
<li><a href="#driver?">Is the MySQL Connector/J driver accessible to the GlassFish server?</a></li>
<li><a href="#password?">Is the database password-protected?</a></li>
<li><a href="#ping?">Are the connection pool properties correctly set?</a></li>
</ul>
<div class="indent">
<h3 id="access">Do database resources exist?</h3>
<p>Use the IDE's Services window (Ctrl-5; &#8984-5 on Mac) to ensure that the MySQL
server is running, and that <code>MyNewDatabase</code> is accessible and contains
appropriate table data.</p>
<ul>
<li>To connect to the MySQL database server, right-click the MySQL Server node
and choose Connect.</li>
<li>If a connection node ( <img src="../../../images_www/articles/72/web/mysql-webapp/db-connection-node.png"
alt="Database connection node"> ) for <code>MyNewDatabase</code> does not display in
the Services window, you can create a connection by right-clicking the MySQL driver
node ( <img src="../../../images_www/articles/72/web/mysql-webapp/driver-node.png"
alt="Database driver node"> ) and choosing Connect Using. Enter the required details
in the dialog that displays.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/new-db-connection-dialog.png"
class="margin-around b-all" alt="New Database Connection dialog"
title="Establish a database connection in the IDE using the New Database Connection dialog">
<br>
<span class="tips">The fields provided in the New Database Connection dialog
mirror the URL string entered in the Show JDBC URL option. Therefore, if
you know the URL (e.g., <code>jdbc:mysql://localhost:3306/MyNewDatabase</code>)
you can paste it into the Show JDBC URL field, and the remaining dialog fields
become automatically populated.</span></li>
<li>To ensure that the <code>Subject</code> and <code>Counselor</code> tables exist
and that they contain sample data, expand the <code>MyNewDatabase</code> connection
node ( <img src="../../../images_www/articles/72/web/mysql-webapp/db-connection-node.png"
alt="Database connection node"> ) and locate the <code>MyNewDatabase</code> catalog
node ( <img src="../../../images_www/articles/72/web/mysql-webapp/db-catalog-node.png"
alt="Database catalog node"> ). Expand the catalog node to view existing tables. You
can view table data by right-clicking a table node and choosing View Data.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/services-window-view-data.png"
class="margin-around b-all" alt="Services window - right-click menu of database table node"
title="View table data by choosing View Data from the right-click menu of a database table node"></li>
</ul>
<h3 id="datasource">Do the connection pool and data source exist on the server?</h3>
<p>After deploying the application to the GlassFish server, the <code>glassfish-resources.xml</code> contained
in the project should instruct the server to create a JDBC resource and connection pool.
You can determine whether these exist from the Servers node in the Services window.</p>
<ul>
<li>Expand the Servers &gt; the GlassFish Server &gt; Resources node. Expand JDBC Resources
to view the <code>jdbc/IFPWAFCAD</code> data source that was created from
<code>glassfish-resources.xml</code>. Expand the Connection Pools node to view the
<code>IfpwafcadPool</code> connection pool that was created from
<code>glassfish-resources.xml</code>. (This is <a href="#view-connection-pool">demonstrated
above</a>.)</li>
</ul>
<h3 id="driver">Is the MySQL Connector/J driver accessible to the GlassFish server?</h3>
<p>Make sure that the MySQL Connector/J driver has been deployed to the GlassFish server. (This is
discussed in <a href="#addJar">Adding the database driver's JAR file to the server</a>.)</p>
<ul>
<li>Locate the GlassFish server installation folder on your computer and drill down into
the <code>GlassFish domains/domain1/lib</code> subfolder. Here you should find
the <code>mysql-connector-java-5.1.6-bin.jar</code> file.</li>
</ul>
<h3 id="password">Is the database password-protected?</h3>
<p>The database needs to be password-protected to enable the GlassFish server data source to work
properly in this tutorial. If you are using the default MySQL <code>root</code>
account with an empty password, you can set the password from a command-line prompt.</p>
<ul>
<li>To set your password to <code><em>nbuser</em></code>, navigate to your MySQL
installation's <code>bin</code> directory in the command-line prompt and enter
the following:
<pre class="examplecode" style="width: 703px;">
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('<em>nbuser</em>')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES;</pre>
For more information, see the official MySQL Reference Manual:
<a href="http://dev.mysql.com/doc/refman/5.1/en/default-privileges.html">Securing
the Initial MySQL Accounts</a>.</li>
</ul>
<h3 id="ping">Are the connection pool properties correctly set?</h3>
<p>Ensure that the connection pool is working correctly for the server.</p>
<ol>
<li>Open the Services window (Ctrl-5; &#8984-5 on Mac) and expand the Servers node.</li>
<li>Right-click the GlassFish server node and choose View Admin Console.</li>
<li>Enter the username and password if you are prompted.
You can view the username and password in the Servers manager.</li>
<li>In the tree on the left side of the console, expand the Resources &gt; JDBC
&gt; JDBC Connection Pools &gt; <code>IfpwafcadPool</code> node. Details for the
<code>IfpwafcadPool</code> connection pool display in the main window.</li>
<li>Click the Ping button. If the connection pool is set up correctly, you will
see a '<code>Ping Succeeded</code>' message.
<br>
<img src="../../../images_www/articles/72/web/mysql-webapp/ping-succeeded.png"
class="margin-around b-all"
alt="the GlassFish server Admin Console - Connection Pool display"
title="Test your connection pool by clicking Ping in the GlassFish server Admin Console"></li>
<li>If the ping fails, click the Additional Properties tab and ensure that the
listed property values are correctly set.</li>
</ol>
</div>
<br>
<div class="feedback-box"><a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Creating%20Web%20App%20MySQL">Send
Us Your Feedback</a></div>
<br style="clear:both;">
<h2 id="seealso">See Also</h2>
<p>For more information about Java web development, see the following resources.</p>
<ul id="collapsableList2">
<li><strong>NetBeans Articles and Tutorials</strong>
<ul>
<li><a href="../ide/mysql.html">Connecting to a MySQL Database in NetBeans IDE</a>. Covers
the basics of working with a MySQL database in the IDE.</li>
<li><a href="jsf20-intro.html">Introduction to JavaServer Faces 2.x</a>. An introductory
tutorial describing how to use the JSF framework in a Java web project.</li>
<li><a href="quickstart-webapps-spring.html">Introduction to the Spring Framework</a>. An
introductory tutorial describing how to create an MVC web application using the Spring
Framework.</li>
</ul></li>
<li><strong>Java Database Connectivity (JDBC)</strong>
<ul>
<li><a href="http://docs.oracle.com/javase/tutorial/jdbc/overview/index.html">JDBC Overview</a></li>
<li><a href="http://download.oracle.com/javase/6/docs/technotes/guides/jdbc/getstart/GettingStartedTOC.fm.html">Getting Started with the JDBC API</a></li>
<li><a href="http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html">The Java Tutorials: JDBC Basics</a></li>
</ul></li>
<li><strong>JavaServer Pages Standard Tag Library (JSTL)</strong>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/index-jsp-135995.html">JavaServer Pages Standard Tag Library</a> (official product page)</li>
</ul></li>
<li><strong>Java Naming and Directory Interface (JNDI)</strong>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/jndi-136720.html">Java SE Core Technologies - Java Naming and Directory Interface</a></li>
<li><a href="http://docs.oracle.com/javase/jndi/tutorial/">The JNDI Tutorial</a></li>
<li><a href="http://docs.oracle.com/javase/tutorial/jndi/index.html">The Java Tutorials: Java Naming and Directory Interface</a></li>
</ul></li>
</ul>
<script type="text/javascript">
<!--
compactMenu('collapsableList', true, '&plusmn; ');
compactMenu('collapsableList2', true, '&plusmn; ');
-->
</script>
</body>
</html>