Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть пятая В заключительной части материала речь идёт о сохранении разобранного запроса в документ базы Notes и об изменениях, сделанных для этого сохранения в классе Memo |
|
|
|
Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть четвёртая В предлагаемой вниманию читателя части описания идёт речь об обработке полученной информации запроса после разбора multipart-data |
|
|
|
Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть третья Продолжение материала, посвящённого сервлету Domino, выполняющего обработку post-запроса с данными типа multipart/form-data. В настоящей части продолжается описание разбора запроса к сервлету |
|
|
|
|
Главная Библиотека Шаблоны и примерыJava-апплет: альтернатива встроенному представлению
Соков Василий Викторович
ООО Системы качества
sokov@qm-s.com
О возможностях использования такого интерфейсного элемента как представление, кажется, много писать не надо. Не стоит писать и об ограничениях, налагаемых на эти самые возможности в силу определенных правил, которые способствуют высокой скорости доступа к документам базы Notes, но держат в жестких рамках полет фантазии разработчиков
Впрочем, о разработке представлений достаточно полно рассказано в материалах этого проекта:
Динамический отбор документов в представления (перейти >>>)
Как отобразить документы... (перейти >>>)
Проектирование представлений (перейти >>>)
Появление в версии 5 встроенных представлений дало возможность для более интересных решений, но не сняло основных ограничений:
- Для реализации динамического отбора документов существует три возможности - использование Single show category во встроенном представлении или приблизительно похожей по функционалу @-функции @SetViewInfo, замена представлений папками с реализацией их программного наполнения или, начиная с версии R6, встроенной возможностью программного доступа к формуле отбора. Недостаточная гибкость первого варианта (к примеру, тяжело вывести в одной категории документы за произвольный временной отрезок) и сложность поддержки "многопотоковости" в двух других вариантах решения (Представление-то одно, как быть в случае, если нужно сравнить результаты двух "запросов"?) остаются камнем преткновения при проектировании
- По-прежнему невозможно обойти фундаментальные ограничения: в одном представлении отобразить документы из различных баз Notes, в одной строке представления оперировать с данными из нескольких документов
Собственно, как альтернатива представлению, функционирующему по заложенным в него правилам, можно рассматривать самописный элемент дизайна, чей функционал ограничивается лишь фантазией разработчика
Понятное дело, в апплете, "расширяющем" возможности представления, не стоит отказываться от некоторых привычных и удобных функций оригинала
Из наличествующих вариантов моделей - JTable и JTree - в апплете использована модель JTable, по крайней мере пока, ибо иерархию в таблицу вписать будет нелегко, проще их скомбинировать, взяв за основу JTable (дерево JTree в одиночку не подходит, т.к. требуется не просто отображать, скажем, дочерние документы, но и отображать их статусы цветом или иконкой, иметь возможность редактировать эти самые данные аналогично тем функциям, которые есть в представлении).
Скачать пример >>>
Подключение стандартных java-классов и объявление класса апплета
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;
import lotus.domino.*;
public class appTable extends JApplet implements Runnable{
private int columnCount;
private int rowCount;
private String server;
private String dbname;
private String[] columnHeader;
private String[] columnWidth;
private String[] columnFormula;
private String[][] cellsValues;
private String[] ids;
private JTable table;
private DefaultTableModel model;
private JPopupMenu pm;
private Container contentPane;
Инициализация апплета
public void init(){
getParams();
getTable();
contentPane=getContentPane();
JScrollPane jsp=new JScrollPane(table);
jsp.setBorder(new BevelBorder(BevelBorder.RAISED));
contentPane.add(jsp,BorderLayout.CENTER);
if(getParameter("addMenuBar")!=null)
setJMenuBar(getMenuBar());
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e){e.printStackTrace();}
}
Конструирование окна апплета
private void getTable(){
model=new DefaultTableModel(cellsValues,columnHeader);
table=new JTable(model); // таблица
table.setGridColor(Color.lightGray);// цвет сетки
if(getParameter("addPopupMenu")!=null){
table.add(getPopupMenu()); // добавление меню
table.addMouseListener(new PopupListener()); // добавление обработчика событий мыши
}
if (getParameter("horizScroll")!=null)
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
if (getParameter("multiString")!=null)
table.setDefaultRenderer(table.getColumnClass(0),new JTextCellRenderer());
setColumnWidths();
}
private void setColumnWidths(){
TableColumnModel cmodel=table.getColumnModel();
TableColumn column;
for(int i=0;i<columnCount;i++){
column=cmodel.getColumn(i);
column.setPreferredWidth(Integer.parseInt(columnWidth[i]));
}
}
public void refreshTable(Session session,DocumentCollection dc) throws NotesException{
setCellsValues(session,dc);
model.setDataVector(cellsValues,columnHeader);
setColumnWidths();
table.updateUI();
}
Формирование объектов меню
private JPopupMenu getPopupMenu(){
pm=new JPopupMenu();
JMenuItem open=new JMenuItem(" открыть документ ");
open.addActionListener(new openListener());
open.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn026.gif")));
JMenuItem delete=new JMenuItem(" удалить документ ");
delete.addActionListener(new deleteListener());
delete.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn081.gif")));
JMenuItem edit=new JMenuItem(" изменить документ ");
edit.addActionListener(new editListener());
edit.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn012.gif")));
JMenuItem refresh=new JMenuItem(" обновить данные ");
refresh.addActionListener(new refreshListener());
refresh.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn033.gif")));
edit.setEnabled(getParameter("enableEditing")!=null);
delete.setEnabled(getParameter("enableDeleting")!=null);
open.setEnabled(getParameter("enableOpening")!=null);
refresh.setEnabled(getParameter("enableRefreshing")!=null);
pm.add(open);
pm.add(edit);
pm.addSeparator();
pm.add(delete);
pm.addSeparator();
pm.add(refresh);
return pm;
}
private JMenuBar getMenuBar(){
JMenuBar jmb=new JMenuBar();
JMenu docMenu=new JMenu("Документ");
docMenu.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn001.gif")));
JMenuItem open=new JMenuItem(" открыть ");
open.addActionListener(new openListener());
open.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn026.gif")));
JMenuItem delete=new JMenuItem(" удалить ");
delete.addActionListener(new deleteListener());
delete.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn081.gif")));
JMenuItem edit=new JMenuItem(" изменить ");
edit.addActionListener(new editListener());
edit.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn012.gif")));
JMenuItem refresh=new JMenuItem(" обновить ");
refresh.addActionListener(new refreshListener());
refresh.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn033.gif")));
edit.setEnabled(getParameter("enableEditing")!=null);
delete.setEnabled(getParameter("enableDeleting")!=null);
open.setEnabled(getParameter("enableOpening")!=null);
refresh.setEnabled(getParameter("enableRefreshing")!=null);
docMenu.add(open);
docMenu.add(edit);
docMenu.addSeparator();
docMenu.add(delete);
docMenu.addSeparator();
docMenu.add(refresh);
jmb.add(docMenu);
jmb.setBorder(new BevelBorder(BevelBorder.RAISED));
return jmb;
}
Из классов обработки событий комментариев требует класс открытия документа
Открытие документа реализовано с использованием обработки операционной системой URL-адреса с префиксом notes://
Подробнее об использовании гиперссылки на объект см. здесь >>>
Для того, чтобы передать эту гиперссылку для обработки Windows вызывается выполнение внешней программы - в данном случае, виндовсового Explorer, - и передачи ему Notes-ссылки в качестве параметра командной строки:
process=Runtime.getRuntime().exec("explorer notes://server/dbname/view/docID?OpenDocument")
Собственно, класс обработки этого события выглядит следующим образом:
private class openListener implements ActionListener{
public void actionPerformed(ActionEvent e){
try{
NotesThread.sinitThread();
Session session=NotesFactory.createSession();
Database db=session.getDatabase(server,dbname);
int[] rows=table.getSelectedRows();
Process process=null;
String runPath="explorer " + "notes://" + session.evaluate("@Name([cn];'"+server+"')").firstElement()+ "/"+dbname+"/$defaultview/";
for (int i=0;i<rows.length;i++)
process=Runtime.getRuntime().exec(runPath+ids[rows[i]]+"?OpenDocument");
DocumentCollection dc=db.search(getParameter("searchFormula"));
setCellsValues(session,dc);
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
NotesThread.stermThread();
}
}
Полный код апплета и базу с примером работы апплета читатель найдет в прилагаемом к материалу файле (Скачать пример >>>)
Для корректной работы примера нужно, чтобы в клиенте Notes была включена (Команда Главного меню File -> Preferences -> User Preferences... поле Additional Options) возможность выполнения java-апплетов (Enable Java applets)
И, конечно же, стоит предварительно переподписать дизайн базы или внести соответствующие изменения в ECL рабочей станции
Апплет встроен в форму родительского документа (parentForm)
Читайте на Notesnet.ru:
Java-апплет для визуализации графических объектов >>>
|
Опубликовано — 12/17/2004 |
| |
|
|
Последнее на форуме |
 |
|
 |
|