ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Извлечение значений полейБиблиотеки JSLT и EL позволяют легко обрабатывать данные, полученные из форм, так как JSP-страница имеет доступ к неявному объекту param, который состоит из объектов типа java.util.Map.Entry, что позволяет обращаться к данным как к парам «ключ-значение». В следующем примере в документе params.jspx производится извлечение значений параметров, передаваемых из страницы form.jspx. <!--пример # 21: страница, которая выводит форму и передает данные <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.0"> <jsp:directive.page contentType= "text/html; charset=Utf-8" /> <html><head><title>Форма для заполнения</title></head> <body> <form action="params.jspx"> Введите, пожалуйста, ваши данные: <br/> Фамилия: <input type="text" name="fname" value="" /><br/> Имя: <input type="text" name="lname" value="" /><br/> E-mail: <input type="text" name="e-mail" value="" /><br/> <input type="submit" value="Отправить" /><br/> </form> </body></html> </jsp:root> Рис. 19.1. Документ для задания и передачи параметров <!--пример # 22: считывание информации и генерация ответа: params.jspx --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.0"> <jsp:directive.page contentType= "text/html; charset=Utf-8" /> <html><head><title>Обработка данных</title></head> <body> Вывод данных с помощью JSTL и EL<br/> <c:forEach var="items" items="${param}"> <b><c:out value="${items.key}"></c:out></b>: <c:out value="${items.value}"></c:out><br/> </c:forEach> <c:if test="${not empty param.fname}"> <b>Имя:</b><c:out value="${param.fname}"/><br/> </c:if> <c:if test="${not empty param.lname}"> <b>Фамилия:</b><c:out value="${param.lname}"/> </c:if> </body></html> </jsp:root> В результате работы документа в браузер будет выведено: Вывод данных с помощью JSTL и EL Фамилия: Балаганов В вышеприведенном примере с помощью тега c:forEach перебираются все данные, полученные из формы. Так же можно выводить отдельные параметры, обращаясь к ним с помощью EL. Конструкция ${param.lname} возвращает значение параметра lname. С помощью тега jsp:forward можно добавлять данные к запросу. <!--пример # 23: добавление параметра add_param и перенаправление запроса <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> <jsp:directive.page contentType= "text/html; charset=Utf-8" /> <html><head><title>Добавление параметра</title></head> <body> <jsp:forward page="params.jspx"> <jsp:param name="addparam" value="added"/> </jsp:forward> </form> </body></html> </jsp:root> Если обратиться к этой странице, передавая в строке запроса параметры (например http://localhost:8082/FirstJSP/forward.jspx?name=UserName), то, кроме этих параметров, странице param.jspx будет передан параметр addparam со значением added. Технология взаимодействия JSP и сервлета В большинстве приложений используются не сервлеты или JSP, а их сочетание. В JSP представляется, как будут выглядеть результаты запроса, а сервлет отвечает за вызов классов бизнес-логики и передачу результатов выполнения бизнес-логики в соответствующие JSP и их вызов. Т.е. сервлеты не генерируют ответа сами, а только выступают в роли контроллера запросов. Такая архитектура построения приложений носит название MVC (Model/View/Controller). Model – классы бизнес-логики и длительного хранения, View – страницы JSP, Controller – сервлет. Реализацию достаточно простой, но эффективной технологии построения распределенного приложения можно рассмотреть на примере решения задачи проверки логина и пароля пользователя с выводом приветствия в случае положительного результата. Схематично организацию данного приложения можно представить в виде следующей диаграммы: Рис. 19.2. Диаграмма взаимодействия классов и страниц JSP приложения. <!--пример # 24: прямой вызов контроллера: index.jspx --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> <jsp:directive.page contentType="text/html; charset=Utf-8" /> <html><head><title>Index JSP</title></head> <body> <a href="controller">Main Controller</a> </body></html> </jsp:root> Следующая страница login.jsp содержит форму для ввода логина и пароля для аутентификации в системе: <!--пример # 25: форма ввода информации и вызов контроллера: login.jsp --> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <html><head><title>Login</title></head> <body><h3>Login</h3> <hr/> < form name=" loginForm " method="POST" action="controller" > <input type=" hidden " name=" command " value=" login " /> Login:<br/> <input type="text" name=" login " value=""><br/> Password:<br/> <input type="password" name=" password " value=""> <br/> <input type="submit" value="Enter"> </ form ><hr/> </body></html> Код сервлета-контроллера Controller: /* пример # 26: контроллер запросов: Controller.java */ package by.bsu.famcs.jspservlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import by.bsu.famcs.jspservlet.commands.Command; import by.bsu.famcs.jspservlet.manager.MessageManager; import by.bsu.famcs.jspservlet.manager.ConfigurationManager;
public class Controller extends HttpServlet implements javax.servlet.Servlet { //объект, содержащий список возможных команд RequestHelper requestHelper = RequestHelper.getInstance(); public Controller() { super (); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ processRequest(request, response); } private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String page = null; try { //определение команды, пришедшей из JSP Command command = requestHelper.getCommand(request); /*вызов реализованного метода execute() интерфейса Command и передача page = command.execute(request, response); // метод возвращает страницу ответа } catch (ServletException e) { e.printStackTrace(); //генерация сообщения об ошибке request.setAttribute("errorMessage", MessageManager.getInstance().getProperty( MessageManager.SERVLET_EXCEPTION_ERROR_MESSAGE)); //вызов JSP-страницы c cообщением об ошибке page = ConfigurationManager.getInstance() .getProperty(ConfigurationManager.ERROR_PAGE_PATH); } catch (IOException e) { e.printStackTrace(); request.setAttribute("errorMessage", MessageManager.getInstance() .getProperty(MessageManager.IO_EXCEPTION_ERROR_MESSAGE));
page = ConfigurationManager.getInstance().getProperty(ConfigurationManager.ERROR_PAGE_PATH); } //вызов страницы ответа на запрос RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page); dispatcher.forward(request, response); } } /* пример # 27: класс контейнер команд: RequestHelper.java */ package by.bsu.famcs.jspservlet; import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import by.bsu.famcs.jspservlet.commands.Command; import by.bsu.famcs.jspservlet.commands.LoginCommand; import by.bsu.famcs.jspservlet.commands.NoCommand;
public class RequestHelper { private static RequestHelper instance = null;
HashMap<String, Command> commands = new HashMap<String, Command>();
private RequestHelper() { //заполнение таблицы командами commands.put("login", new LoginCommand()); } public Command getCommand(HttpServletRequest request) { //извлечение команды из запроса String action = request.getParameter("command"); //получение объекта, соответствующего команде Command command = commands.get(action); if (command == null) { //если команды не существует в текущем объекте command = new NoCommand(); } return command; } //создание единственного объекта по шаблону Singleton public static RequestHelper getInstance() { if (instance == null) { instance = new RequestHelper(); } return instance; } } /* пример # 28: интерфейс, определяющий контракт и его реализации: Command.java: LoginCommand.java: NoCommand.java */ package by.bsu.famcs.jspservlet.commands; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException;
public interface Command { public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } package by.bsu.famcs.jspservlet.commands; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import by.bsu.famcs.jspservlet.logic.LoginLogic; import by.bsu.famcs.jspservlet.manager.ConfigurationManager; import by.bsu.famcs.jspservlet.manager.MessageManager;
public class LoginCommand implements Command {
private static final String PARAM_NAME_LOGIN = "login"; private static final String PARAM_NAME_PASSWORD = "password";
public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String page = null; //извлечение из запроса логина и пароля String login = request.getParameter(PARAM_NAME_LOGIN); String pass = request.getParameter(PARAM_NAME_PASSWORD); //проверка логина и пароля if (LoginLogic.checkLogin(login, pass)) { request.setAttribute("user", login); //определение пути к main.jsp page = ConfigurationManager.getInstance() .getProperty(ConfigurationManager.MAIN_PAGE_PATH); } else { request.setAttribute("errorMessage", MessageManager.getInstance() .getProperty(MessageManager.LOGIN_ERROR_MESSAGE)); page = ConfigurationManager.getInstance() .getProperty(ConfigurationManager.ERROR_PAGE_PATH); } return page; } } package by.bsu.famcs.jspservlet.commands; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import by.bsu.famcs.jspservlet.manager.ConfigurationManager; public class NoCommand implements Command {
public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*в случае прямого обращения к контроллеру переадресация на страницу ввода логина*/ String page = ConfigurationManager.getInstance() .getProperty(ConfigurationManager.LOGIN_PAGE_PATH); return page; } } /* пример # 29: служебные классы, извлекающие из properties-файлов ConfigurationManager.java: MessageManager.java */ package by.bsu.famcs.jspservlet.manager; import java.util.ResourceBundle;
public class ConfigurationManager { private static ConfigurationManager instance; private ResourceBundle resourceBundle;
//класс извлекает информацию из файла config.properties private static final String BUNDLE_NAME = "config";
public static final String DATABASE_DRIVER_NAME = "DATABASE_DRIVER_NAME"; public static final String DATABASE_URL = "DATABASE_URL"; public static final String ERROR_PAGE_PATH = "ERROR_PAGE_PATH"; public static final String LOGIN_PAGE_PATH = "LOGIN_PAGE_PATH"; public static final String MAIN_PAGE_PATH = "MAIN_PAGE_PATH";
public static ConfigurationManager getInstance() { if (instance == null) { instance = new ConfigurationManager(); instance.resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME); } return instance; } public String getProperty(String key) { return (String)resourceBundle.getObject(key); } } package by.bsu.famcs.jspservlet.manager; import java.util.ResourceBundle; public class MessageManager { private static MessageManager instance; private ResourceBundle resourceBundle; //класс извлекает информацию из файла messages. properties private static final String BUNDLE_NAME = "messages"; public static final String LOGIN_ERROR_MESSAGE = "LOGIN_ERROR_MESSAGE"; public static final String SERVLET_EXCEPTION_ERROR_MESSAGE = "SERVLET_EXCEPTION_ERROR_MESSAGE"; public static final String IO_EXCEPTION_ERROR_MESSAGE = "IO_EXCEPTION_ERROR_MESSAGE";
public static MessageManager getInstance() { if (instance == null) { instance = new MessageManager(); instance.resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME); } return instance; }
public String getProperty(String key) { return (String)resourceBundle.getObject(key); } } Далее приведено содержимое файла config.properties: ############################### ## Application configuration ## ############################### DATABASE_DRIVER_NAME=com.mysql.jdbc.Driver DATABASE_URL=jdbc:mysql://localhost:3306/db1?user= root&password=root ERROR_PAGE_PATH=/jsp/error.jspx LOGIN_PAGE_PATH=/jsp/login.jspx MAIN_PAGE_PATH=/jsp/main.jspx Далее приведено содержимое файла messages.properties: ############################### ## Messages ## ############################### LOGIN_ERROR_MESSAGE=Incorrect login or password SERVLET_EXCEPTION_ERROR_MESSAGE=ServletException: Servlet encounters difficulty IO_EXCEPTION_ERROR_MESSAGE=IOException: input or output error while handling the request Ниже приведен код класса бизнес-логики LoginLogic, выполняющий проверку правильности введенных логина и пароля с помощью запроса в БД: /* пример # 30: бизнес-класс проверки данных пользователя: LoginLogic.java */ package by.bsu.famcs.jspservlet.logic; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.DriverManager; import by.bsu.famcs.jspservlet.manager.ConfigurationManager;
public class LoginLogic { public static boolean checkLogin( String login, String password) { // проверка логина и пароля try { //организация простейшего соединения с базой данных String driver = ConfigurationManager.getInstance().getProperty(ConfigurationManager.DATABASE_DRIVER_NAME);
Class.forName(driver); Connection cn = null; try { String url = ConfigurationManager.getInstance() .getProperty(ConfigurationManager.DATABASE_URL); cn = DriverManager.getConnection(url); PreparedStatement st = null; try { st = cn.prepareStatement( "SELECT * FROM USERS WHERE LOGIN =? AND PASSWORD =?"); st.setString(1, login); st.setString(2, password); ResultSet rs = null; try { rs = st.executeQuery(); /* проверка, существует ли пользователь с указанным логином и паролем */ return rs.next(); } finally { if (rs!= null) rs.close(); } } finally { if (st!= null) st.close(); } } finally { if (cn!= null) cn.close(); } } catch (SQLException e) { e.printStackTrace(); return false; } catch (ClassNotFoundException e) { e.printStackTrace(); return false; } } } Страница main.jsp показывается пользователю в случае успешной аутентификации в приложении: <!--пример # 31: сообщение о входе: main.jsp --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c=http://java.sun.com/jsp/jstl/core version="2.0"> <jsp:directive.page contentType="text/html; charset=Utf-8" /> <html><head><title>Welcome</title></head> <body><h3>Welcome</h3> <hr /> <c:out value="${ user }, Hello!"/> <hr /> <a href="controller">Return to login page</a> </body></html> </jsp:root> Страница error.jsp загружается пользователю в случае возникновения ошибок (например, если неправильно введены логин и пароль): <!-- пример # 32: страница ошибок, предлагающая повторить процедуру ввода информации: error.jspx --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c= "http://java.sun.com/jsp/jstl/core" version="2.0"> <jsp:directive.page contentType= "text/html; charset=Utf-8" /> <html><head><title>Error</title></head> <body> <h3>Error</h3> <hr /> <jsp:expression> (request.getAttribute("errorMessage")!= null) ? (String) request.getAttribute("errorMessage") : "unknown error"</jsp:expression> <hr /> <a href="controller">Return to login page</a> </body></html> </jsp:root> И последнее, что надо сделать в приложении, – это настроить файл web.xml, чтобы можно было обращаться к сервлету-контроллеру по имени controller, т.е. необходимо настроить mapping. <!--пример # 33: имя сервлета и путь к нему: web.xml --> <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" > <display-name>Project</display-name> <servlet> <description> </description> <display-name> Controller</display-name> <servlet-name>Controller</servlet-name> <servlet-class> by.bsu.famcs.jspservlet.Controller</servlet-class> </servlet> <servlet-mapping> <servlet-name>Controller</servlet-name> <url-pattern>/controller</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> В данном случае в поле <servlet-name> было занесено имя Запуск примера производится из командной строки Web-браузера при запущенном контейнере сервлетов Tomcat 5.5.*, например в виде: http://localhost:8082/Project/index.jspx В этом случае при вызове сервлета в браузере будет отображен путь и имя в виде: http://localhost:8082/Project/controller Задания к главе 19 Вариант А Реализовать приложение, используя технологию взаимодействия JSP и сервлетов. Вся информация должна храниться в базе данных. d) Банк. Осуществить перевод денег с одного счета на другой с указанием реквизитов: Банк, Номер счета, Тип счета, Сумма. Таблицы должны находиться в различных базах данных. Подтверждение о выполнении операции должно выводиться в JSP c указанием суммы и времени перевода. e) Регистрация пользователя. Должны быть заполнены поля: Имя, Фамилия, Дата рождения, Телефон, Город, Адрес. Система должна присваивать уникальный ID, генерируя его. При регистрации пользователя должна производиться проверка на несовпадение ID. Результаты регистрации с датой регистрации должны выводиться в JSP. При совпадении имени и фамилии регистрация не должна производиться. f) Телефонный справочник. Таблица должна содержать Фамилию, Адрес, Номер телефона. Поиск должен производиться по части фамилии или по части номера. Результаты должны выводиться вместе с датой выполнения в JSP. g) Склад. Заполняются поля Товар и Количество. Система выводит промежуточную информацию о существующем количестве товара и запрашивает подтверждение на добавление. При отсутствии такого товара на складе добавляется новая запись. h) Словарь. Ввод слова. Системой производится поиск одного или нескольких совпадений и осуществляется вывод результатов в JSP. Перевод может осуществляться в обе стороны. Одному слову может соответствовать несколько значений. i) Каталог библиотеки. Выдается список книг, наличествующих в библиотеке. Запрос на заказ отправляется пометкой требуемой книги. Система проверяет в БД, свободна книга или нет. В случае занятости выводится информация о сроках возвращения книги в фонд. j) Голосование. Выводится вопрос и варианты ответа. Пользователь имеет возможность проголосовать и просмотреть результаты голосования по данному вопросу. БД должна хранить дату и время каждого голосования и выводить при необходимости соответствующую статистику по датам подачи голоса. Вариант B Для заданий варианта В главы 4 создать информационную систему, использующую страницы JSP на стороне клиента, сервлет в качестве контроллера и БД для хранения информации. Тестовые задания к главе 19 Вопрос 19.1. Как правильно объявить и проинициализировать переменную j типа int в тексте JSP? 1) <%! int j = 1 %>; 2) <%@ int j = 2 %>; 3) <%! int j = 3; %>; 4) <%= int j = 4 %>; 5) <%= int j = 5; %>. Вопрос 19.2. Какие из перечисленных переменных можно использовать в выражениях и скриптлетах JSP без предварительного объявления? 1) error; 2) page; 3) this; 4) exception; 5) context. Вопрос 19.3. Какой из следующих интерфейсов объявляет метод _jspService()? 1) javax.servlet.jsp.Jsp; 2) javax.servlet.jsp.JspServlet; 3) javax.servlet.jsp.JspPage; 4) javax.servlet.jsp.HttpJspPage; 5) javax.servlet.jsp.HttpJspServlet. Вопрос 19.4. Тег jsp:useBean объявлен как <jsp:useBean id="appJsp" class="main.ApplicationJSP" scope="application" /> В объекте какого типа должен быть сохранен созданный экземпляр? 1) ServletConfig; 2) HttpApplication; 3) ServletContext; 4) ServletConfig; 5) ApplicationContext. Вопрос 19.5. Какой тег JSP используется для извлечения значения поля экземпляра JavaBean в виде строки? 1) jsp:useBean.toString; 2) jsp:param.property; 3) jsp:propertyType; 4) jsp:getProperty; 5) jsp:propertyToString; JDBC Драйверы, соединения и запросы JDBC (Java DataBase Connectivity) – стандартный прикладной интерфейс (API) языка Java для организации взаимодействия между приложением и СУБД. Это взаимодействие осуществляется с помощью драйверов JDBC, обеспечивающих реализацию общих интерфейсов для конкретных СУБД и конкретных протоколов. В JDBC определяются четыре типа драйверов: 1. Драйвер, использующий другой прикладной интерфейс взаимодействия с СУБД, в частности ODBC (так называемый JDBC-ODBC – мост). Стандартный драйвер первого типа sun.jdbc.odbc.JdbcOdbcDriver входит в JDK. 2. Драйвер, работающий через внешние (native) библиотеки (т.е. клиента СУБД). 3. Драйвер, работающий по сетевому и независимому от СУБД протоколу с промежуточным Java-сервером, который, в свою очередь, подключается к нужной СУБД. 4. Сетевой драйвер, работающий напрямую с нужной СУБД и не требующий установки native-библиотек. Предпочтение естественным образом отдается второму типу, однако если приложение выполняется на машине, на которой не предполагается установка клиента СУБД, то выбор производится между третьим и четвертым типами. Причем четвертый тип работает напрямую с СУБД по ее протоколу, поэтому можно предположить, что драйвер четвертого типа будет более эффективным по сравнению с третьим типом с точки зрения производительности. Первый же тип, как правило, используется редко, т.е. в тех случаях, когда у СУБД нет своего драйвера JDBC, зато есть драйвер ODBC. Рис. 20.1. Доступ к БД с помощью JDBC-ODBC-моста JDBC предоставляет интерфейс для разработчиков, использующих различные СУБД. С помощью JDBC отсылаются SQL-запросы только к реляционным базам данных (БД), для которых существуют драйверы, знающие способ общения с реальным сервером базы данных. Строго говоря, JDBC не имеет прямого отношения к J2EE, но так как взаимодействие с СУБД является неотъемлемой частью Web-приложений, то эта технология рассматривается в данном контексте. Не нашли, что искали? Воспользуйтесь поиском:
|