Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSP — с чего начать? 
V
    Опции темы
patriot777
Дата 6.12.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.12.2007

Репутация: нет
Всего: нет



to Stampede:

Подскажи, пожалуйста, как в существующую архитектуру воркеров добавить загрузчик файлов. Чтобы пользователь кликнул по ссылке и перед ним появилось диалоговое окно загрузки файла. Т.е. перехватить обработку ссылки, т.к. воркером это сделать не получиться потому, что нужно возвращать page.

Мне нужно сделать так,  чтобы файлы могли загружать только зарегистрированные пользователи и браузер выводил окно загрузки, а не автоматически запускал приложения для выполнения.



PM MAIL   Вверх
Platon
Дата 6.12.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 10
Всего: 40



ИМХО, тему пора закрывать.
PM MAIL ICQ   Вверх
Warangel
Дата 6.2.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 6.2.2008
Где: Украина, Киев

Репутация: нет
Всего: нет



Помогите пожалуйста с JSP. Проюзал горы доки с сервлетом получилось, а JSP никак Томкат или не компилит тег, или не находит его! Что я не так делаю я ряльно новичок в вебе!
PM MAIL ICQ   Вверх
Zellulose
Дата 27.2.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 30.9.2007

Репутация: нет
Всего: нет



Огромное вам, Stampede и diablero,  спасибо! Очень помогли. Если можно, кто-нибудь поставте от меня плюсик : )
PM MAIL   Вверх
diablero
Дата 20.3.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата(Platon @  6.12.2007,  19:02 Найти цитируемый пост)
ИМХО, тему пора закрывать.

Не спеши сериал хоронить, у нас еще сдесь делаsmile

Следующий этап, в рамках сериала, это:

Сборка и обработка статистических данных:
1.    количество посещений сайта за определенный период времени, зарегистрированными и не зарегистрированными пользователями,      
       ботами.
2.    дата, время первого и последнего посещения.
3.    просматриваемый контент, ключевые слова поиска.
4.    количество запросов к базе данных, время обработки запроса.
и т.д.

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



Это сообщение отредактировал(а) diablero - 20.3.2008, 14:57


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Platon
Дата 20.3.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 10
Всего: 40



Ууууух, как завернули. Флаг вам в руки, а я с удовольствием понаблюдаю.  smile

Добавлено через 4 минуты и 10 секунд
А предложение поступило из-за того, что главные герои разбежались, и тема потеряла стройность, появился мусор. Я думаю, что некоторые посты из этой темы нужно бы поудалять.
PM MAIL ICQ   Вверх
Shaggie
Дата 20.3.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 2
Всего: 72



Предлагаю модераторам почистить тему. Особенно последние несколько страниц. Удалить лишние и не относящиеся к обучению посты, включая этот.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Stampede
Дата 20.3.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Знач делаем подсистему статистики. Сначала ряд общих соображений.

Владение по возможности более подробной статистикой - вещь абсолютно необходимая для сайтостроительства. Без статистики вы подобны водолазу с севшим фонарям, пытающемуся на ощупь выбраться из недр затонувшего Титаника.

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

И раз уж мы решили взять судьбу в свои руки, то и выбор деталей теперь тоже за нами. Так, в плане среды хранения мы без колебаний выбираем СУБД - это обеспечит нам надежность, быстродействие, масштабируемость, гибкость и прочие прелести.

Далее возникает вопрос: какую инфу хранить в логах и откуда ее брать. Тут все достаточно просто. Большинство нужной нам инфы приходит вместе с запросом в заголовках HTTP: Если мы посмотрим каким-нибудь инструментом (например Firebug'ом) исходник запроса к этой самой странице, то увидим примерно следующее:

Код

Host    forum.vingrad.ru
User-Agent    Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
Accept    text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language    en-us,en;q=0.5
Accept-Encoding    gzip,deflate
Accept-Charset    ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive    300
Connection    keep-alive
Referer    http://forum.vingrad.ru/forum/java-j2ee.html
Cookie    pforumpass_hash=***скрыто***;


Значения этих заголовков доступны нам в Java чекрез HttpServletRequest.getHeader(String name).

Все, убегаю. Продолжение следует...

Это сообщение отредактировал(а) Stampede - 21.3.2008, 02:49


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Platon
Дата 20.3.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 10
Всего: 40



А я между прочим как-то предлагал дайджест этой темы.
PM MAIL ICQ   Вверх
Stampede
Дата 25.3.2008, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Знач продолжаем.

Используя инфу, доступную нам из текста запроса, мы можем без особых затруднений сохранить интересующие нас параметры в виде записи в предварительно созданной таблице базы данных. На одном из моих сайтов данные в таблице логов выглядят примерно таким образом:

user posted image (более полный скриншот приложен в аттачменте)

Для того чтобы записью было легче оперировать, удобно предусмотреть для нее собственную структуру данных, или в терминологии Java - отдельный класс (назовем его LogEntry). Из всего вышесказанного уже вырисовывается его биновая (bean) природа и примерное внутреннее содержание. Отсюда очередное задание:
  • Написать реализацию предложенного класса.
  • Разработать структуру соответствующей таблицы.
  • Написать DAO, осуществляющий (а) запись в эту таблицу, и (б) постраничный вывод записей.
  • Объект с инфой для логирования формировать в сервлете-контроллере до начала всякой обработки, сохранять его в контексте запроса и извлекать его оттуда по мере необходимости. Запись в таблицу осуществлять по окончании обработки в отдельной транзакции.

Если есть вопросы - прошу не стесняться.


Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  logs.png 98,09 Kb


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 25.3.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Я вернулся. Промежуточный результат:
LogEntry
Код

@javax.persistence.Entity
@Table(name = ("logentry_table"))
@NamedQueries({
@NamedQuery(
        name = "getLogEntryCount",
        query = "select count(distinct le.id) from LogEntry le"),
@NamedQuery(
        name = "getLogEntry",
        query = "select le from LogEntry le")
})
public class LogEntry implements Serializable {
    @javax.persistence.Id
    @Column(name = ("logentry_id"))
    @javax.persistence.GeneratedValue(strategy = GenerationType.TABLE)
    private int id;
    @Column(name = ("logentry_host"))
    private String host;
    @Column(name = ("logentry_user_name"))
    private String userName;
    @Column(name = ("logentry_date"))
    private Date date;
    @Column(name = ("logentry_method"))
    private String method;
    @Column(name = ("logentry_bytes"))
    private int bytes;
    @Column(name = ("logentry_millis"))
    private long millis;
    @Column(name = ("logentry_query_count"))
    private int queryCount;
    @Column(name = ("logentry_referer_url"))
    private String refererUrl;
    @Column(name = ("logentry_user_agent"))
    private String userAgent;
    @Column(name = ("logentry_search"))
    private String search;
    @Column(name = ("logentry_bot"))
    private String bot;
    @Column(name = ("logentry_post_title"))
    private String postTitle;
    @Column(name = ("logentry_download_file"))
    private String downloadFile;

    public LogEntry() {
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getHost() {
        return host;
    }
    public void setUserName(String userName){
        this.userName = userName;
    }
    public String getUserName() {
        return userName;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public Date getDate() {
        return date;
    }
    public void setMethod(String method){
        this.method = method;
    }
    public String getMethod() {
        return method;
    }
    public void setBytes(int bytes){
        this.bytes = bytes;
    }
    public int getBytes() {
        return bytes;
    }
    public void setMillis(long millis){
        this.millis = millis;
    }
    public long getMillis() {
        return millis;
    }
    public void setQueryCount(int queryCount){
        this.queryCount = queryCount;
    }
    public int getQueryCount() {
        return queryCount;
    }
    public void setRefererUrl(String refererUrl) {
        this.refererUrl = refererUrl;
    }
    public String getRefererUrl() {
        return refererUrl;
    }
    public void setUserAgent(String userAgent) {
        this.userAgent = userAgent;
    }
    public String getUserAgent() {
        return userAgent;
    }
    public void setSearh(String searh) {
        this.search = searh;
    }
    public String getSearh() {
        return search;
    }
    public void setBot(String bot) {
        this.bot = bot;
    }
    public String getBot() {
        return bot;
    }
    public void setPostTitle(String postTitle) {
        this.postTitle = postTitle;
    }
    public String getPostTitle() {
        return postTitle;
    }
    public void setDownloadFile(String downloadFile) {
        this.downloadFile = downloadFile;
    }
    public String getDownloadFile() {
        return downloadFile;
    }
}

Код

CREATE TABLE `logentry_table` (
  `logentry_id` int(10) unsigned NOT NULL auto_increment,
  `logentry_host` varchar(50) default NULL,
  `logentry_user_name` varchar(20) default NULL,
  `logentry_date` datetime default NULL,
  `logentry_method` varchar(5) default NULL,
  `logentry_bytes` int(10) default NULL,
  `logentry_millis` int(10) default NULL,
  `logentry_query_count` int(4) default NULL,
  `logentry_referer_url` varchar(50) default NULL,
  `logentry_user_agent` varchar(255) default NULL,
  `logentry_search` varchar(20) default NULL,
  `logentry_bot` varchar(20) default NULL,
  `logentry_post_title` varchar(100) default NULL,
  `logentry_download_file` varchar(100) default NULL,
  PRIMARY KEY  (`logentry_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Manager
Код

public class LogEntryManager implements Manager{
    @PersistenceUnit(unitName = "Infinite")
    private EntityManager entityManager;

    public void init() {
        entityManager = Infinite.getInstance().getEntityManager();
    }
    public void setLogEntry(LogEntry entry) {
        entityManager.persist(entry);
    }
    public void removeLogEntry(LogEntry entry) {
        entityManager.remove(entry);
    }
    public void refreshLogEntry(LogEntry entry) {
        entityManager.flush();
        entityManager.refresh(entry);
    }
    public LogEntry getLogEntry(int id) {
        return entityManager.find(LogEntry.class, id);
    }
    public int getLogEntryCount() {
        Query query = entityManager.createNamedQuery("getLogEntryCount");
        return Integer.parseInt(query.getSingleResult().toString());
    }
    public ArrayList<LogEntry> getLogEntry(int firstResult, int maxResult) {
        Query query = entityManager.createNamedQuery("getLogEntry");
        query.setFirstResult(firstResult);
        query.setMaxResults(maxResult);
        return new ArrayList <LogEntry> (query.getResultList());
    }
    public void destroy() {
    }
}

Worker
Код

public class LogEntryWorker extends AbstractWorker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        request.getSession().setAttribute("refererUrl", page.getRefererUrl());

        User user = page.getAuthUser();
        if(user == null) {
            page.setRedirectUrl("/form/login.shtml");
            return page;
        }
        HashMap<String, String> map = getParameterMap();

        Tool tool = new Tool();
        int pageIndex = tool.stringToInt(map.get("page"));
        int size = tool.stringToInt(map.get("size"));

        Pager pager = new Pager();
        if(pageIndex >= 1) {
            pager.setCurrentPage(pageIndex);
        }
        if(size >= 1) {
            pager.setPageSize(size);
        }
        pager.setBaseUrl(request.getRequestURI());

        Infinite infinite = Infinite.getInstance();
        LogEntryManager manager = infinite.getLogEntryManager();

        int total = manager.getLogEntryCount();
        if(total >=1) {
            pager.setTotal(total);
        }
        ArrayList<LogEntry> logEntries = manager.getLogEntry(pager.getFrom()-1, pager.getPageSize());

        page.put("pager", pager);
        page.put("logs", logEntries);
        page.put("content", "website/admin/logs.vm");
        return page;
    }
}

Код

public class ControllerServlet extends HttpServlet {
    private Logger logger = Logger.getLogger(Infinite.class);

    public void service(HttpServletRequest request,
                        HttpServletResponse response)
            throws IOException, ServletException {

        Infinite infinite = Infinite.getInstance();
        String encoding = infinite.getConfiguration().getfileEncoding();

        response.setContentType("text/html; charset=" + encoding);
        request.setCharacterEncoding(encoding);

        EntityTransaction tx = null;
        try {
            tx = infinite.getEntityManager().getTransaction();
            tx.begin();

            long time = System.currentTimeMillis();

            LogEntryManager manager = infinite.getLogEntryManager();
            LogEntry logEntry = new LogEntry();
            logEntry.setDate(new Date());
            logEntry.setUserAgent(request.getHeader("User-Agent"));
            logEntry.setRefererUrl(request.getHeader("Referer"));

            request.getSession().setAttribute("logEntry", logEntry);

            //...

            time = System.currentTimeMillis() - time;

            logEntry = (LogEntry)request.getSession().getAttribute("logEntry");
            logEntry.setMillis(time);
            manager.setLogEntry(logEntry);

            tx.commit();
        } catch (Exception err) {
            if (tx != null) {
                tx.rollback();
            }
            logger.error(err.getMessage(), err);
            //throw new ServletException(err);
        }
    }
}

Шаблон
Код

#if($logs)
<table class="grid" width="100%" border="0" cellpadding="0">
<caption><b>LogEntry list</b></caption>
<tr>
    <td><b>host</b></td>
    <td><b>userName</b></td>
    <td><b>date</b></td>
    <td><b>method</b></td>
    <td><b>bytes</b></td>
    <td><b>millis</b></td>
    <td><b>queryCount</b></td>
    <td><b>refererUrl</b></td>
    <td><b>userAgent</b></td>
    <td><b>search</b></td>
    <td><b>bot</b></td>
    <td><b>postTitle</b></td>
    <td><b>downloadFile</b></td>
</tr>
#foreach($log in $logs)
<tr>
   <td>$!log.host</td>
    <td>$!log.userName</td>
    <td>$!log.date</td>
    <td>$!log.method</td>
    <td>$!log.bytes</td>
    <td>$!log.millis</td>
    <td>$!log.queryCount</td>
    <td>$!log.refererUrl</td>
    <td>$!log.userAgent</td>
    <td>$!log.search</td>
    <td>$!log.bot</td>
    <td>$!log.postTitle</td>
    <td>$!log.downloadFile</td>
</tr>
#end
</table>
#end

#if ($pager && $pager.getPageLinks().size() > 1)
    <div>LogEntry($pager.total) с $pager.getFrom() по $pager.getTo()</div>
    <div>Page($pager.getPageCount()):
    #foreach ($link in $pager.getPageLinks())
        $link
    #end
    </div>
#end

to Stampede:
Мне кажется, что нужно предусмотреть механизм контроля,  за логом.  Потому, что несколько часов флуда и таблица будет немалых размеров. У меня есть пару вариантов решения, как ты считаешь, стоит над этим заморачиваться? 


Это сообщение отредактировал(а) diablero - 27.3.2008, 23:28


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
diablero
Дата 30.3.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



to Stampede:
Как распознать бота?


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Platon
Дата 31.3.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 10
Всего: 40



Я думаю, защититься от бота можно только картинками, вопросами и прочими человеческими задачами, но на каждой странице имхо, такое безобразие делать не стоит. Можно предусмотреть частоту кликов от каждого IP, клиента, но не думаю, что это цель. Одна из задача лог таблицы, возможно, заключается как раз выявить таких злостных нарушителей, и заносить их в черный список.
PM MAIL ICQ   Вверх
diablero
Дата 31.3.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата(Platon @  31.3.2008,  00:20 Найти цитируемый пост)
Я думаю, защититься от бота можно только картинками, вопросами и прочими человеческими задачами, но на каждой странице имхо, такое безобразие делать не стоит.

Ты не понял. Речь идет не о защите от ботов, а о их идентификации. Чтобы занести в лог, какие боты захаживали (Yandex, Google, Rambler)...


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
taro
Дата 2.4.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.8.2007

Репутация: нет
Всего: нет



Цитата(diablero @ 11.8.2007,  01:43)

Код

#set( $DEFAULT_ACTION = 0 )
#set( $LOGIN_ACTION = 1 )
#set( $LOGOUT_ACTION = 2 )
#set( $REGISTRATION_ACTION = 3 )

<html>
<head>
    <title>$message</title>
</head>
<body>
<center>
#if( $confirmData.getActionType() == $LOGIN_ACTION )
поскипано. 
    <br><br><br><h2>Действие выполнено.</h2><br>
    Перейти на <a href="/home.shtml">главную страницу</a>
#end
</center>
</body>
</html>

Не узнаю без грима: это что за разметка? никак опознать не получается. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1034 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.