43132

Веб-приложения на Java, реализующее функциональность просто интернет-магазина

Курсовая

Информатика, кибернетика и программирование

Основные модели архитектуры JSP. Функционирование JSP. Заключение Список литературы Введение JSP JvServer Pges технология позволяющая веб-разработчикам легко создавать содержимое которое имеет как статические так и динамические компоненты.

Русский

2013-11-04

953 KB

17 чел.

1. Обзор технологии Java Server Pages

Технология Java Server Pages содержит четыре ключевых компонента:

  1. Директивы (directive) представляют собой сообщения для контейнера JSP, дающим возможность определить параметры страницы, подключения других ресурсов, использовать собственные нестандартные библиотеки тегов.

  2. Действия (actions) инкапсулируют функциональные возможности в предопределенных тегах, которые можно встраивать в JSP-страницу. Действия часто выполняются на основе информации, посылаемой на сервер в составе запроса от определенного клиента. Действия также могут создавать объекты Java для использования их в скриптлетах JSP.

  3. Скриптлеты (scriptlets) позволяют вставлять код Java в страницы JSP, который взаимодействует с объектами страницы при обработке запроса.

  4. Библиотеки тегов (tag library) являются составной частью механизма расширения тегов, допускающего разработку и использование собственных тегов.

Наличие данных с неизменяемой структурой определяют выбор программиста в принятии решения, какую технологию следует использовать: сервлеты или страницы JSP. Программисты предпочитают использовать страницы JSP, если основная часть посылаемого клиенту содержимого представляет собой данные с неизменяемой структурой, и лишь небольшая часть содержимого генерируется динамически с помощью кода Java. Сервлеты предпочтительнее использовать, если только небольшая часть содержимого, посылаемого клиенту, представляет собой данные с неизменяемой структурой. На самом деле отдельные сервлеты могут вообще не генерировать содержимого для клиента, выполняя определенную задачу в интересах клиента, а затем вызывают другие сервлеты или JSP-страницы, чтобы отправить ответ.

Во многих случаях сервлеты и JSP-страницы являются взаимозаменяемыми. Подобно сервлетам, JSP-страницы обычно выполняются на стороне Web-сервера, который называют контейнером JSP.

Когда Web-сервер, поддерживающий технологию JSP, принимает первый запрос на JSP-страницу, контейнер JSP транслирует эту JSP-страницу в сервлет Java, который обслуживает текущий запрос и все последующие запросы к этой странице. Если при компиляции нового сервлета возникают ошибки, эти ошибки приводят к ошибкам на этапе компиляции. Контейнер JSP на этапе трансляции помещает операторы Java, которые реализует ответ JSP-страницы, в метод _jspService. Если сервлет компилируется без ошибок, контейнер JSP вызывает метод _jspService для обработки запроса.

JSP-страница может обработать запрос непосредственно, либо вызвать другие компоненты Web-приложения, чтобы содействовать обработке запроса. Любые ошибки, которые возникают в процессе обработки, вызывают исключительную ситуацию в Web-сервере на этапе запроса.

Весь статический текст HTML, называемый в документации JSP шаблоном HTML (template HTML), сразу направляется в выходной поток. Выходной поток страницы буферизуется. Буферизацию обеспечивает класс JspWriter, расширяющий класс Writer. Размер буфера по умолчанию ограничен до 8 Кбайт, но его можно изменить атрибутом buffer тега <%@ page>. Наличие буфера позволяет заносить заголовки ответа в выходной поток совместно с выводимым текстом. В буфере заголовки будут размещены перед текстом.

Таким образом, достаточно написать страницу JSP, сохранить ее в файле с расширением jsp и установить файл в контейнер, так же, как и страницу HTML, не заботясь о компиляции. При установке можно задать начальные параметры страницы JSP так же, как и начальные параметры сервлета.

1.1 Архитектура JSP-страницы

Базовая архитектура Java Server Pages в самом общем виде представлена на рисунке. Платформа J2EE обеспечивает базу, на которой функционирует все приложение в целом и страницы JSP, в частности, в то время, как сеть Интернет предоставляет механизм транспортировки данных.

Страница JSP располагается на Web-сервере в среде виртуальной Java-машины. Доступ к страниц JSP, как и в случае сервлета, осуществляется через Web с использованием протокола HTTP.

Страница JSP функционирует под управлением JSP Engine (среды исполнения JSP). Страница JSP может взаимодействовать с программным окружением с помощью компонентов JavaBeans, получая и устанавливая его параметры, используя теги: <jsp:useBean>, <jsp:getProperty>, <jsp:setProperty>. Компонент JavaBean сам может участвовать в других процессах, предоставляя результаты в виде своих параметров, доступных страницам JSP, участвующим в сеасе, а через них - всем пользователям, запрашивающим эти страницы JSP.

Использование межплатформенных компонентов JavaBeans и библиотек тегов значительно расширяет возможности JSP. Программный Java-код в странице JSP, в идеале, должен использоваться только для управления представлением информации.

1.2. Основные модели архитектуры JSP

Возможны различные подходы к использованию технологии JSP. Два основных архитектурных подхода, нашедшие применение при реализации приложений уровня предприятия, имеют специальные названия:

  * JSP Model 1 (Первая модель архитектуры JSP);

  * JSP Model 2 (Вторая модель архитектуры JSP);

Первая модель архитектуры JSP

JSP Model 1 (Первая модель архитектуры JSP) практически реализует базовую архитектуру JSP. В архитектурном решении JSP Model 1 полностью отвечает за получение запроса от клиента, его обработку, подготовку ответа и доставку ответа пользователю. Разделение представления и динамического содержания обеспечивается тем, что доступ к данным осуществляется через компоненты JavaBeans. В сценарии JSP Model 1 предполагается следующая последовательность действий:

  1. Запрос пользователя посылается через Web-браузер странице JSP.

  2. Страница JSP компилируется в сервлет (при первом обращении).

  3. Скомпилированный сервлет обращается к некоторому компоненту JavaBean, запрашивая у него информацию.

  4. Компонент JavaBean, в свою очередь, осуществляет доступ к информационным ресурсам (непосредственно или через компонент Enterprise JavaBeans).

  5. Полученная информация отображается в свойствах компонента JavaBeans, доступных странице JSP.

  6. Формируется ответ в виде страницы HTML с комбинированным содержанием (статическое, динамическое).

Архитектура JSP Model 1 может с успехом применяться для небольших приложений. Однако использование данной модели для более сложных задач вызывает определенные трудности и не является технологичным из-за большого объема встроенных в страницу программных фрагментов. Для сложных корпоративных приложений рекомендуется применение второй модели архитектуры JSP.

Вторая модель архитектуры JSP

JSP Model 2 (Вторая модель архитектуры JSP) реализует гибридный подход к обслуживанию динамического содержания Web-страницы, при котором совместно используется сервлет и страница JSP. Эта модель позволяет эффективно использовать преимущества обеих технологий: сервлет поддерживает задачи, связанные с обработкой запроса и созданием объектов JavaBeans, используемых JSP, а страница JSP отвечает за визуальное представление информации. Сервлет используется как управляющее устройство (контроллер). Схематично вторая модель представлена на рисунке. Сценарии JSP Model 2, как правило реализует следующую типовую последовательность действий:

  1. Запрос пользователя посылается через Web-браузер сервлету.

  2. Сервлет обрабатывает запрос, создает и инициализирует объект JavaBean или другие объекты, используемые страницей JSP, и запрашивает динамическое содержание у компонента JavaBean.

  3. Компонент JavaBean осуществляет доступ к информации непосредственно или через компонент Enterprise JavaBeans.

  4. Сервлет, направляющий запрос, вызывает сервлет, скомпилированный из страницы JSP.

  5. Сервлет, скомпилированный из страницы JSP, встраивает динамическое содержание в статический контекст HTML-страницы и отправляет ответ пользователю.

Необходимо отметить, что в рамках этой модели страница JSP сама не реализует никакую логику, это входит в функции сервлета-контроллера. Страница JSP отвечает только за получение информации от компонента JavaBean, который был предварительно создан сервлетом, и за визуальное представление этой информации в удобном для клиента виде.

Архитектуры JSP Model 2 в большей степени, чем архитектура JSP Model 1, соответствует идее отделения представления от содержания. Эта модель позволяет четко выделить отдельные части приложения и связанные с ними роли и обязанности персонала, занятого в разработке:

  * Дизайнер - разработка дизайна Web-страницы;

  * Разработчик - реализация функций управления и обработки.

Чем сложнее разрабатываемая система, тем заметнее становятся преимущества архитектуры JSP Model 2.

1.3. Функционирование JSP

Работа со страницей JSP становится возможной только после ее преобразования в сервлет. В процессе трансляции как статическая, так и динамическая части JSP преобразуются в Java-код сервлета, который передает преобразованное содержимое браузеру через выходной поток Web-сервера.

Технология JSP является технологией серверной стороны, поэтому все процессы обработки JSP протекают на стороне сервера. Страница JSP - текстовый документ, который в соответствии со спецификацией JSP, проходит две фазы:

  * фазу трансляции;

  * фазу выполнения.

При трансляции, которая выполняется один раз для каждой страницы JSP, создается или локализуется класс типа Servlet, реализующий JSP. Трансляция JSP может производиться как отдельно, до ее использования, так и в процессе размещения JSP на Web-сервере или сервере приложений.

Во второй фазе осуществляется обработка запросов и подготовка ответов.

2. Построение веб-приложения

Программа представляет собой  — простой подсистему обработки заказов. Данный пример сильно упращен, но зато он демонстрирует основные возможности сервлетов, библиотеки стандартных тегов и пр.:

• Разбиение кода на представления (JSP), обработчики запросов, формы, модель.

•   Выборка данных из БД с использованием JDBC.

2.1. Описание приложения

Система обработки заказов позволяет пользователю просмотреть список товаров, которых можно пробрести, т. е. Добавить в корзину покупок  (рис. 1) и список помещенных товаров в корзину и общую сумму, на которую были выбраны товары(рис. 2).

Рисунок 1. Список товаров.

Рисунок 2. Покупка товаров

Рисунок 3. Отмена покупки.

Так же существует возможность отмены всех выбранных покупок (рис. 3).

 2.2. База данных 

CREATE TABLE IF NOT EXISTS `tovar` (

 `Name` varchar(40) CHARACTER SET utf8 NOT NULL,

 `Price` int(10) NOT NULL,

 `type` varchar(40) CHARACTER SET utf8 NOT NULL,

 `id` int(2) NOT NULL

)

2.3. Конфигурация

Веб-приложения в Java конфигурируются через специальные дескрипторы веб-приложений web.xml и server.xml.

Листинг 1.  web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true">

<display-name>A test application</display-name>

<description> A scriptable management web application for the Tomcat Web Server; Manager lets you view, load/unload/etc particular web applications. </description>    

   <resource-ref>

 <description>MySQL_Lab</description>

 <res-ref-name>jdbc/inetmagazine</res-ref-name>

 <res-type>javax.sql.DataSource</res-type>

 <res-auth>Container</res-auth>

</resource-ref>

</web-app>

 Листинг 2. Часть листинга из  server.xml, необходимая для конфигурации данного веб-приложения.

<GlobalNamingResources>

   <!-- Editable user database that can also be used by

        UserDatabaseRealm to authenticate users

   -->

   

   <Resource name="jdbc/inetmagazine" auth="Container"

       type="javax.sql.DataSource"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost/webshop?user=root"

username="root" password=""

maxActive="20" maxIdle="10" maxWait="-1"/>

   

 </GlobalNamingResources>

2.4. Текст сервлетов 

 Листинг 3. DataObject.java

package kurs_rab;

import java.sql.*;

public abstract class DataObject {

   protected String selectStatement;  

protected String searchStatement;  

protected String insertStatement;   

protected String updateStatement;  

protected String deleteStatement;  

   public int id;      

   public void showSelectStatement()

   {

       System.out.println(this+".selectStatement = "+this.selectStatement);

   }

   protected DataObject[] parseData(ResultSet rs) throws SQLException

   {

       // возвращаем пустой массив

       return new DataObject[0];

   }

   

   protected static int getRecordCount(ResultSet rs) throws SQLException

   {

       int cnt;

       // переставляем курсор на последнюю запись набора

       if(rs.last())

       {           

           cnt=rs.getRow();

           rs.beforeFirst();

           return cnt;

       }

       else

       {

           return 0;

       }

   }

   

     public DataObject select(Connection conn,int id) throws SQLException

   {

      

       PreparedStatement ps=conn.prepareStatement( selectStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

       ps.setInt(1, id);

       DataObject obj=parseData(ps.executeQuery())[0];        

       ps.close();

       return obj;

   }    

}

 Листинг 4. Client.java

package kurs_rab;

import java.util.*;

import java.sql.*;

public class Tovar extends DataObject

{

   public String Name;

   public String Last;

   public String Tel;

   public Tovar()

   {

     

        this.selectStatement="select id, Name, Last, tel, In, Out, Room from Clients where id=?";

   

        this.searchStatement="select id, Name, Last, tel, In, Out, Room from Clients where 1=1";

      

        this.insertStatement= "insert into clients (Name, Last, Tel, `In`, `Out`, Room, Tarif) values (?,?,?,`?`,`?`,?,?)";

       

   }

   @Override

   protected Tovar[] parseData(ResultSet rs) throws SQLException

   {

       // вызываем getRecordCount для определения количества найденых записей

       Tovar[] o=new Tovar[getRecordCount(rs)];

               // последовательно просматриваем ResultSet

       while (rs.next())

               {

                   int i=rs.getRow()-1;

                   o[i]=new Tovar();

                   o[i].id=rs.getInt("id");

                   o[i].Name=rs.getString("Name");

                   o[i].Last=rs.getString("Last");     

                   o[i].Tel=rs.getString("Tel");

                   o[i].In=rs.getString("In");

                   o[i].Out=rs.getString("Out");

                   o[i].Room=rs.getString("Room");

                   o[i].Tarif=rs.getString("Tarif");

               }

       return o;

   }

   public Tovar[] search(Connection conn, String Name,String Last,String Tel,String In,String Out,String Room) throws SQLException

   {

       String ss=this.searchStatement;

                     

       if (Name!=null)

       {

           //поиск по Client_ID по шаблону

           ss=ss+" and `Client_Name` LIKE ?"/*+Client_Name+"'"*/;

       }

       

       if (Last!=null)

       {

           //поиск по Client_ID по шаблону

           ss=ss+" and  Client_Last_Name = ?"/*+Client_Last_Name+"'"*/;

       }

       

       if (Tel!=null)

       {  

           //поиск по Client_ID по шаблону

           ss=ss+" and Client_Phone_Number = ?"/*+Client_Phone_Number+"'"*/;

       }

       

       if (In!=null)

       {  

           //поиск по Client_ID по шаблону

           ss=ss+" and Date_In = ?"/*+Date_In+"'"*/;

       }

       if (Out!=null)

       {  

           //поиск по Client_ID по шаблону

           ss=ss+" and Date_Out = ?"/*+Date_Out+"'"*/;

       }

       

       if (Room!=null)

       {  

           //поиск по Client_ID по шаблону

           ss=ss+" and Room_Number = ?"/*+Room_Number+"'"*/;

       }

      System.out.printf(ss);

      // создаем запрос

      

       PreparedStatement ps=conn.prepareStatement(ss);

               

       if (Name!=null)

       {

           ps.setString(i,Name);

    i++;

       }

 

       if (Last!=null)

       {

           ps.setString(i,Last);

           i++;

       }

      

       if (Tel!=null)

       {

           ps.setString(i,Tel);

           i++;

       }

       

       if (In!=null)

       {

           ps.setString(i,In);

           i++;

       }

       

       if (Out!=null)

       {

           ps.setString(i,Out);

           i++;

       }

       

       if (Room!=null)

       {

           ps.setString(i,Room);

       }

       

       // выполняем запрос, вызываем метод обработки набора результатов

       Tovar[] o=this.parseData(ps.executeQuery());

       // закрывыем запрос

       ps.close();

       return o;

   }

   public void insert(Connection conn) throws SQLException

{

   PreparedStatement ps=conn.prepareStatement(this.insertStatement);

       if (this.Name!=null){ ps.setString(1,this.Name); }

       else{ps.setNull(1, Types.VARCHAR);}

       

       if (this.Last!=null){ ps.setString(2,this.Last); }

       else{ps.setNull(2, Types.VARCHAR);}

       

       if (this.Tel!=null){ ps.setString(3,this.Tel); }

       else{ps.setNull(3, Types.VARCHAR);}

       

       if (this.In!=null){ ps.setString(4,this.In); }

       else{ps.setNull(4, Types.DATE);}

       if (this.Out!=null){ ps.setString(5,this.Out); }

       else{ps.setNull(5, Types.DATE);}

       if (this.Room!=null){ ps.setString(6,this.Room); }

       else{ps.setNull(6, Types.VARCHAR);}

       

       if (this.Tarif!=null){ ps.setString(7,this.Tarif); }

       else{ps.setNull(7, Types.INTEGER);}

 

           ps.execute();

           ps.close();

       }

       

}

2.5. Текст JSP-страницы 

 Листинг 5. index.jsp

<%@page import="javax.naming.*, javax.sql.*, java.sql.*" contentType="text/html; charset=UTF-8"%>

<html>

<head><title>Веб-интерфейс системы управления отелем - общая информация о клиентах</title></head>

<body style="background-color: #000000; background-image: url(img/bgw.png); background-position: center top; background-repeat: repeat-x">

   <div style="min-height: 800px; text-align: center; background-image: url(img/menu.png); background-position: center top;  background-repeat: no-repeat;">

       <br><br><a href="#" onclick="price()"><img src="img/but.png"></a>&nbsp;&nbsp;<a href="#" onclick="cancel()"><img src="img/but2.png"></a>

       

       

                   <table border=0 align="center">  

                       <tr> <td>  </td>  

 <td bgcolor="#CDB5CD">Серьги и кольца :)</td>     

   </tr>

<%

 //получаем JNDI-контекст

 Context initContext = new InitialContext();

 Context envContext  = (Context)initContext.lookup("java:/comp/env");

 //из контекста получаем пул соединений

 DataSource ds = (DataSource)envContext.lookup("jdbc/MySQL_Lab");

 //а из пула - соединение

 Connection conn = ds.getConnection();

 //создаем запрос

 Statement stmt=conn.createStatement();

 //выполняем его

 ResultSet rs=stmt.executeQuery("select name,price from tovar");

 //выводим результат

               int i=0;

 while(rs.next())

 {i++;

  

   %>

   <tr> <td><a href="#" onclick="summ(<%=i%>)"><img src="img/but1.png"></a>&nbsp;&nbsp;</td>

                                   <td><img src="img/<%=i%>.jpg"></td>

    <td bgcolor="#A9A9A9"><%=rs.getString("name")%></td>

                                       <td bgcolor="#A9A9A9"><%=rs.getInt("price")%></td>

                                       

   </tr>

   <%

   

 }

 //закрываем объекты - освобождаем ресурсы

 stmt.close();

 rs.close();

 //а этот вызов фактически не закрывает соединение, а возвращает его в пул

 conn.close();

%>

</table>

<script>

   var sum=0;

   var k = 0;

   

   function cancel(){

       sum=0;k = 0;

       alert("Корзинка очищена, все покупки отменены");

   }

   

   function price(){

       alert("Вы купили товаров " +k+ " штук, на сумму: " +sum+ " руб");

   }

   

   function summ(idnum){

       switch (idnum){

           case "1": {sum+=120;k++; break;}

           case "2": {sum+=120;k++; break;}

           case "3": {sum+=100;k++; break;}

           case 4: {sum+=70;k++; break;}

           case 5: {sum+=120;k++; break;}

           case 6: {sum+=80;k++; break;}

           case 7: {sum+=80;k++; break;}

           case 8: {sum+=180;k++; break;}

           case 9: {sum+=180;k++; break;}

           case 10: {sum+=100;k++; break;}

           default: {sum+=0;k++; break; }

           }

   }

   

   $('a').on('click', function( e ) {

 // аПаОаЛбƒб‡аАаЕаМ ббб‹аЛаКбƒ аНаА б‚аЕаКбƒб‰аИаЙ баЛаЕаМаЕаНб‚ <a>, аИаЗаВаЛаЕаКаАаЕаМ аИаЗ аНаЕаГаО аАб‚б€аИаБбƒб‚ href

 var href = $(this).attr('href');

   });

</script>

  </div>

</body>

</html>


Заключение

В данной работе было проведено исследование технологии JSP, для разработки веб-приложений, а также приведен пример простого веб-приложения на Java, реализующего функциональность просто интернет-магазина. Хотя рассмотренное приложение не выглядит полностью законченным, оно реализует все основные концепции, которые могут применяться для создания подобных веб-приложений.


Список литературы

  1.  Хабибуллин И. Ш. Создание распределённых приложений на Java 2. – СПб.: БХВ-Петербург, 2001 г. – 688с.: ил.
  2.  Хантер. Д. Введение в XML. – СПб.: Лори, 2001. – 656с.:ил.


 

А также другие работы, которые могут Вас заинтересовать

6100. Правовое отношение: понятие и признаки 24.39 KB
  Правовое отношение: понятие и признаки Правовое отношение - это такое общественное отношение, в котором стороны связаны между собой взаимными юридическими правами и обязанностями, охраняемыми государством. Правоотношение есть та мера внешней св...
6101. План-конспект внеклассного мероприятия 27 KB
  План-конспект внеклассного мероприятия Внеклассное мероприятие - это особый вид деятельности, отличающийся от урока. Внеклассные мероприятия - это события, ситуации, ситуации в коллективе, организуемые преподавателем или кем-нибудь другим...
6102. Основы межкультурной коммуникации 26.29 KB
  Основы межкультурной коммуникации Межкультурное общение в современном мире Сегодня становится все более очевидным, что человечество развивается по пути расширения взаимосвязи и взаимозависимости различных стран, народов и их культур. Этот проц...
6103. Предмет, метод і система адміністративного права 24.66 KB
  Предмет, метод і система адміністративного права 1. Адміністративне право України як галузь права Адміністративне право - це галузь права (сукупність правових норм), що регулює з метою реалізації завдань і функцій держави суспільні відносини управлі...
6104. Еволюція світової валютної системи 25.58 KB
  Еволюція світової валютної системи 1 Світова валютна система. Золотий та золотодевізний стандарт 2. Бреттон-Вудська валютна система 3. Ямайська валютна система Конкретною формою організації валютних відносин є світова валютна система (СВС). Вона явл...
6105. Становление и развитие оториноларингологии 27.5 KB
  Становление и развитие оториноларингологии Оториноларингология - это наука, занимающаяся изучением заболеваний органов: уха (otos), горла (laringos), носа (rhinos). Накоплением знаний о строении и функциях, методах исследования и заболеваниях у...
6106. Самоанализ внеклассного мероприятия 26.09 KB
  Самоанализ внеклассного мероприятия 18 апреля 2012 года нами было проведено внеклассное мероприятие в 6 А и Б классах Гимназии №76. Тема внеклассного мероприятия Welcome to the Knowledge Land является очень актуальной, так как все темы, св...
6107. Технологія гостинності 28.7 KB
  Технологія гостинності План Поняття технології гостинності. Терміни та визначення. Модель гостинності. Чинники, що впливають на середовище гостинності. Уніфіковані технології готельних послуг.(С.Р.) Поняття технології гости...
6108. Відповідальність працівників за порушення норм і правил з охорони праці 29.5 KB
  Відповідальність працівників за порушення норм і правил з охорони праці Види відповідальності: Дисциплінарна відповідальність включає догану або звільнення з роботи. Притягнути до відповідальності має право особа...