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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PHP-кодер учит сервлеты 
:(
    Опции темы
p0zt3r
  Дата 27.7.2009, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем!

Вопрос, наверное, достаточно ламерский.

Знаком с Java 3 дня. Передо мной достаточно большой интранет-веб сервис, работающий на контейнере JBOSS, и мне нужно его немного доработать и что-то переделать. Знаком с синтаксисом Java, но сам я PHP-программист, есть также опыт ActionScript.

Проблема первая:
Я не знаком с Java вообще. За 3 дня узнал, в принципе, как всё это работает, но поверхностно. 
Где посмотреть как устроен JBOSS и как происходит обработка запросов? Ведь, как я понимаю, JBOSS при своём запуске подключает сервлет-классы, вызывая в них init-метод, после чего начинается главный цикл JBOSS - биндинг к сокетам, получение HTTP-запроса, определение того, что клиенту нужно и выполнение doGet/doPost методов конкретного сервлета. Объясните мне, как программисту, который писал под TCP/IP на С++ когда-то небольшие программы, как работает весь цикл JBOSS'а.

Проблема вторая:
Подозреваю, что архитектура системы передо мной, мягко говоря, корявая.
Дело в том, что есть в ней набор представлений - экранов для пользователей, где они могут выполнять различные однотипные действия.
Их около сотни - всякие добавления новых юзеров, покупка товаров, вывод отчётов и т.п. Некоторые действия требуют подтверждения или состоят из нескольких шагов.
Все эти действия реализованы как сервлеты. Правильно ли это архитектурно?
Потому что,  как мне очевидно, сервлетов должно быть немного, например:
  • NewsServlet
  • SpecialOffersServlet
  • ProjectBlogServlet
А действия, выполняемые сервлетом (показать/добавить новость, показать RSS-feed блога, добавить специальное предложение для товара), это уже параметры HTTP-запроса, передаваемого им, как HttpRequest-объект.
Иными словами, сервлеты отражают объекты мира и действия над ними.

В данной же архитектуре это выглядит вот так:
  • ShowNewsAtMainPageServlet
  • ShowNewsInSidebarServlet
  • AddTopicToNewsServlet
  • RemoveTopicFromNewsServlet
  • AddToSpecialOffersServlet
  • GetStatsOfSpecialOffersServlet
  • GetSpecialOffersServlet
    ...
Т.е. сервлеты отражают все сущности предметной области.

Сервлеты, как я понимаю их философию, это как бы маленькие веб-серверы, которые работают внутри JBOSS, который реализует среду для их выполнения (надстройку над JVM), и маппинг физических HTTP-запросов в java-классы (сами сервлеты).

Ну и третий вопрос:
Какую книгу посоветуете, чтобы узнать, что значат хитромудрые слова, типа beans, web facets, что такое stripes и тому подобное?
Просто нужно много свечей, чтобы перечитать всё в Интернете, а нужна хорошая выборка по Веб-технологиям Java.

Не могу запомнить даже некоторые названия и не знаю, что конкретно мне может быть необходимо.

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

Спасибо за понимание! 
Благодарю всех за ответы!
Живите счастливо!
--------------------
24*7*365*геморой*зарплата=0
PM MAIL ICQ   Вверх
Platon
Дата 27.7.2009, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Интересно, что смогут человеку посоветовать.
Я так и не осмелился взяться за Java4Web, а когда возьмусь, то уберегу свой хрупкий мозг от кучи всяких тяжеловесных фреймворков.
А за судьбой ТС интересно понаблюдать. Сам я тоже на хлеб зарабатываю PHP, а Java в свободное время, хотя когда сайтец денежку приносить начнет, потихоньку переделаю под Java


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

Цитата(p0zt3r @  27.7.2009,  05:19 Найти цитируемый пост)
который писал под TCP/IP на С++ когда-то небольшие программы, как работает весь цикл JBOSS'а.

А смысл вам это знать? JBoss как раз такая "надстройка", которая позволяет программисту избежать этой головной боли.

Цитата(p0zt3r @  27.7.2009,  05:19 Найти цитируемый пост)
Все эти действия реализованы как сервлеты. Правильно ли это архитектурно?

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

Удачи!
PM MAIL ICQ   Вверх
serger
Дата 27.7.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

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



Есть ещё такой сериал:
http://java.sun.com/javaee/5/docs/tutorial/doc/



--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
p0zt3r
Дата 27.7.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Platon, а как я могу кодить не представляя как это устроено? Я не говорю о всех технических тонкостях. Но с чёрными ящиками тяжеловато.

Просто по факту это всё дико тормозит. Может ли это связано быть с количеством сервлетов, допустим? Или это просто код такой?
--------------------
24*7*365*геморой*зарплата=0
PM MAIL ICQ   Вверх
cube
Дата 27.7.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(p0zt3r @ 27.7.2009,  12:38)
Platon, а как я могу кодить не представляя как это устроено? Я не говорю о всех технических тонкостях. Но с чёрными ящиками тяжеловато.

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

JBoss вообще тяжеловесная штука, она будет тормозить. Если тебя берут как разработчика именно под то с чем тебе сложно, и не понятно. Я бы наверное отказался, хотя на яве сижу уже нормально. Но на JBoss, пока не претендую, мне кажется громоздко, сложно и немножко неоправданно.

Я долгое время примерно с год привыкал к apache cocoon, на работе был уже веб проект который крутился на этой штуке, за год, я научился писать свои проекты с использованием этой технологии, но сейчас сесть снова на cocoon - упаси господи... на мой взгляд такая же как jboss тяжелая во всех смыслах этого слова штука как для мозгов так и для компа.
PM MAIL   Вверх
Platon
Дата 27.7.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(p0zt3r @  27.7.2009,  13:38 Найти цитируемый пост)
а как я могу кодить не представляя как это устроено?

у черного ящика обычно есть белые API, которые обычно логично преподаются в книжках, которые пока почему-то никто не порекомендовал ещё, кроме как serger, но сановские доки читать - не лучший вариант. У меня есть 3 книжки по JBoss в формате chm. Сам, понятное дело, их даже не открывал и сильных рекомендаций дать не могу, если надо стучись в личку, отправлю по почте.

Добавлено через 1 минуту и 52 секунды
cube, бальзам а душу, а то я начал подозревать себя в слабоумии.

Это сообщение отредактировал(а) Platon - 27.7.2009, 17:34
PM MAIL ICQ   Вверх
Vasay
Дата 27.7.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

которые пока почему-то никто не порекомендовал 


Сложно что-то советовать не зная архитектуры приложения. Но из описания данного 
p0zt3r,  сложилось впечатление, что лучше и не знать. 

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


p0zt3r, 
Можете выложить код, например, ShowNewsAtMainPageServlet ?


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
p0zt3r
  Дата 27.7.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Vasay, с новостями всё понятно. Я покажу штуку, которая позволяет добавить заказ. В PHP это называется "быдлокодинг". Я не знаю, насколько это приемлимо в Java, несмотря даже на то, что просто нет шаблонизатора. (Кстати, какие есть шаблонизаторы?)

Есть, например, технология EJB, которая реализует динамическое обращение к объектам и в моём случае, она используется. Мне нужно вывести, допустим, пользователю список возможных действий в данном конкретном сервлете. Как это правильно (в стиле Java) сделать? Т.е. по сути, сервлет ещё не знает во время выполнения, что реализует конкретный класс (ex.: он создаётся во время выполнения отдельной факторией), отвечающий за логику, и ему надо на лету узнать какие доступны его методы. После этого он отрисовывает клиенту, скажем JSON (это уже понятно как делается), в котором есть список действий, доступных для клиента. Соответственно,  хотелось бы понять, как удобнее всего делать маппинг URI к сервлету в данном случае, ведь есть два варианта:
  • http://www.site.name/request/action ->  Сервлет RequestActionServlet
  • http://www.site.name/request?action -> Сервлет RequestServlet, в который action передаётся как параметр запроса и доступен через HttpRequest.getParameter(...)

Скажем, мне нужно сделать админку, с помощью которой можно было бы деплоить на сервер jar'ы и прикручивать их к интерфейсу (как, скажем в PHP CMS Joomla - каждый модуль может быть просто залит на сервер и сразу становится видимым для CMS). Насколько широки возможности работы с динамическими типами в Java?

А вот пример кода  smile 

Код

package com.krk.mnetwork.servlets.adddata;

import com.vangercat.mnetwork.WebHelper;
import com.vangercat.mnetwork.auth.PowerPrincipal;
import com.vangercat.mnetwork.auth.PowerPrincipalImpl;
import com.vangercat.mnetwork.forweb.GoodsRemainService;
import com.vangercat.mnetwork.forweb.MemberService;
import com.vangercat.mnetwork.forweb.SaleService;
import com.vangercat.mnetwork.frontendobjects.goods.GoodsReportForStorageOfCurrentPeriod;
import com.vangercat.mnetwork.frontendobjects.members.MemberShortInfo;
import com.vangercat.mnetwork.frontendobjects.sales.SaleShortInfo;
import com.vangercat.mnetwork.utils.AppUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.List;

/**
 * Сервлет формирования страницы для добавления заказа
 */
public class MainScreenToAddSelfOfferServlet extends HttpServlet {  // а вот
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();
        try {
            PowerPrincipal principal = new PowerPrincipalImpl(request);

            /***********************************************/
            //получили реквизиты
            //получили бин и тащим из него заголовок и начальную инфу о заказе

            SaleService saleService = (SaleService)
                    AppUtils.getInstance().internalLookupBean(SaleService.JNDI_NAME);
            MemberService memberService = (MemberService)
                    AppUtils.getInstance().internalLookupBean(MemberService.JNDI_NAME);

            GoodsRemainService goodsRemainService = (GoodsRemainService)
                    AppUtils.getInstance().internalLookupBean(GoodsRemainService.JNDI_NAME);
            Integer storageNumber = principal.getLoginToStorage().getStorageId();
            SaleShortInfo sale = saleService.getEmptySale(storageNumber);

            /***********************************************/
            String saleId = sale.getCode();
            String date = WebHelper.dateFormat.format(sale.getCreationDate());

            //формируем страницу

            out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" +
                    "<HTML>\n" +
                    "<HEAD>\n" +
                    "<TITLE>ООО Созвездие</TITLE>\n" +
                    "<META content=\"text/html; charset=utf-8\" http-equiv=Content-Type>\n" +
                    "</HEAD>\n" +
                    "<script LANGUAGE=\"JavaScript\">\n" +
                    "function formValid ()\n" +
                    "{\n" +
                    "   var i=0;\n" +
                    "   var rv=1;\n" +
                    "   var st=\"\";\n" +
                    "   for(i=0; i<1; i++)\n" +
                    "      if(!document.forms[1].elements[i].value) rv=0;\n" +
                    "   if(rv==0)\n" +
                    "   {\n" +
                    "      alert('Вы должны заполнить все поля формы, отмеченные звездочкой!');\n" +
                    "      return false;\n" +
                    "   }\n" +
                    "   if(confirm(\"\\nВы уверены в правильности введенной информации?\")) document.forms[1].submit();\n" +
                    "}\n" +
                    "function cardID(e)" +
                    "{\n" +
                    "   newWindow = window.open(\"./MainScreenToAddSelfOfferByCardId\",\"subWind\", \"HEIGHT=400,WIDTH=300\");" +
                    "   newWindow.focus( );\n" +
                    "}" +
                    "function setCustomerData()" +
                    "{" +
                    "   " +
                    "}" +
                    "" +
                    "\n" +
                    "function recalc_table(e, i)" +
                    "{" +
                    "   var sum = document.getElementById ('sum_'+i);" +
                    "   var tot_sum = document.getElementById ('tot_sum');" +
                    "   var atb = document.getElementById ('a_t_b_'+i);" +
                    "   var left = document.getElementById ('left_'+i);" +
                    "   var price = document.getElementById ('price_'+i);" +
                    "   var pos_name = document.getElementById ('pn_'+i);" +
                    "   \n" +
                    "   sum.innerHTML=price.innerHTML*atb.value;" +
                    "tot_sum.innerHTML= '0';" +
                    "   var j=0;" +
                    "   while (true)" +
                    "{" +
                    "   " +
                    "   var mysum = document.getElementById ('sum_'+j);" +
                    "   if (mysum!=null) {" +
                    "   var a = Number(tot_sum.innerHTML);" +
                    "var b = Number(mysum.innerHTML);" +
                    "a=a+b;" +
                    "tot_sum.innerHTML=a.toString();" +
                    "} else {return;}" +
                    "j++;}   " +
                    "" +
                    "   \n"+
                    "}\n" +
                    "\n"+
                    "</SCRIPT>\n" +
                    "<BODY bgcolor=\"#eeeeee\">\n" +
                    "\n" +
                    "\n" +
                    "<h1 align=center>Регистрация заказа</h1>\n" +
                    "<h1 align=center>Код склада - " + storageNumber + "</h1>\n" +
                    "<form name=\"toMenu\" action=\"LoginToMainScreenServlet\" method=\"post\"> <input type=\"submit\" Value=\"Меню\"></form>" +
                    "<FORM name=\"mainForm\" ACTION=\"RedirectedFromAddingOfferServlet\"  METHOD=\"POST\">\n" +
                    "\n" +
                    "<TABLE width=80% BORDER=0 CELLSPACING=0 CELLPADDING=2 ALIGN=center>\n" +
                    "<TR><TD colspan=2><B></B></TD></TR>\n" +
                    "<TR><TD>&nbsp;</TD></TR>\n" +
                    "<TR><TD colspan=2><TABLE width=100% BORDER=1 CELLSPACING=0 CELLPADDING=2 ALIGN=center>\n" +
                    "<TR height=30><TD BGCOLOR=cadetblue width=50%>&nbsp;<B><U>Шаг 1.</U>&nbsp;Выбор заказа</B></TD>\n" +
                    "<TD>&nbsp;Шаг 2. Сохранение заказа</TD>\n" +
                    "</TABLE></TD></TR>\n" +
                    "<TR><TD>&nbsp;</TD></TR>\n" +
                    "<TR><TD><B>Присваеваемый код заказу</B></TD><TD>" + WebHelper.formatCode(saleId) + "</TD></TR>\n" +
                    "\n" +
                    "<TR><TD><B>Дата заказа </B></TD><TD>" + date + "</TD></TR>\n" +
                    "<TR><TD>&nbsp;</TD></TR>");
            List<MemberShortInfo> members = memberService.getMemberListShortForStorage(storageNumber);
            out.println("<TR><TD><B>Заказчик * (" + members.size() + " чел.)</B></TD><TD><SELECT id=\"select_obj\" name=kod_kl SIZE=8>");
            
            Collections.sort(members);
            for (MemberShortInfo member: members) {
                out.println("<OPTION VALUE=" + member.getMemberId() + ">" + member.getNameShort() + " - " + WebHelper.formatCode(member.getCode()) + "</OPTION>");
               // out.println("<OPTION VALUE=" + member.getMemberId() + ">" + member.getNameShort() + "</OPTION>\n");
            }
            out.println("</SELECT><TR><TD>&nbsp;</TD>" +
                    "</TR><TR>\n" +
                    "<TD><A HREF=\"#\" ONCLICK=\"cardID(event);\">Или введите номер карты</A></TD>"+
                    "</TR>\n" +
                    "<TR><TD COLSPAN=3>&nbsp;</TD></TR>" +
                    "</TR><TR><TD colspan=2><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=2 ALIGN=center>\n" +
                    "<TR><TD colspan=6><B>Выбор продукции</B></TD></TR>\n" +
                    "<TR bgcolor=darkgray><TD align=center width=30%><B>Наименование товара</B></TD><TD align=center width=15%><B>Остаток на текущую дату</B></TD><TD align=center width=15%><B>Цена товара, руб.</B></TD><TD align=center width=15%><B>Сумма остатка, руб.</B></TD><TD align=center width=15%><B>Количество</B></TD><TD align=center><B>На сумму</B></TD>");
            //получаем список товаров
            List<GoodsReportForStorageOfCurrentPeriod> goodsList =
                    goodsRemainService.getReportsForStorage(storageNumber);
            Integer totalSum = 0;
            int i = 0;
            for (GoodsReportForStorageOfCurrentPeriod report : goodsList) {
                String name = report.getGoods().getName();
                Integer left = report.getRemainOnEnd();
                Integer price = report.getGoods().getMarketingPrice();
                Integer sum = left * price;

                String amountToBuy;
                if (report.getGoods().isSaleAble()) {
                    amountToBuy = "<INPUT TYPE=text name=tov" + i + " SIZE=5 MAXLENGTH=10 ONCHANGE=\"recalc_table(event, "+i+");\" ID=\"a_t_b_" + i + "\">";
                } else {
                    amountToBuy = "";
                }
                totalSum += sum;
                out.println("<TR bgcolor=darkgray><TD ID=\"pn_"+i+"\">" + name + "</TD><TD align=right ID=\"left_"+i+"\">" + left + "</TD>\n" +
                        "<TD align=right ID=\"price_"+i+"\">" + price + "</TD><TD align=right>" + sum + "</TD>\n" +
                        "<TD align=center>" + amountToBuy + "</TD>\n" +
                        "<TD ID=\"sum_"+i+"\">&nbsp;</TD></TR>");
                i++;
            }
            Integer realId = sale.getSaleId();
            //завершаем оторажение и отслылаем реквизиты
            out.println("<TR bgcolor=darkgray height=30><TD colspan=3 align=left><B>И Т О Г О</B></TD><TD align=right><B>" + totalSum + "</B>&nbsp;</TD><TD>&nbsp</TD><TD><SPAN ID=\"tot_sum\">0</SPAN></TD></TR></TABLE></TD></TR>\n" +
                    "<TR><TD>&nbsp;</TD></TR>\n" +
                    "<TD COLSPAN=2><B>Примечание</B> - знаком * отмечены поля, ОБЯЗАТЕЛЬНЫЕ для заполнения</TD><TR><TD>&nbsp;</TD></TR>\n" +
                    "<INPUT TYPE='HIDDEN' name='kod_z' value='" + realId + "'>\n" +
                    "<INPUT TYPE='HIDDEN' name='kod_visible' value='" + saleId + "'>\n" +
                    "<INPUT TYPE='HIDDEN' name='itemsSize' value='" + goodsList.size() + "'>\n" +
                    "<INPUT TYPE='HIDDEN' name='date' value=\"" + date + "\">\n" +
                    "<TR><TD><INPUT TYPE=button NAME=Submit VALUE=Продолжить onClick=formValid();></TD></TR></TABLE></FORM>\n" +
                    "</BODY>\n" +
                    "</HTML>");
        } catch (Exception e) {
            e.printStackTrace();
            out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" +
                    "<HTML>\n" +
                    "<HEAD>\n" +
                    "<TITLE>ООО Созвездие</TITLE>\n" +
                    "<META content=\"text/html; charset=utf-8\" http-equiv=Content-Type>\n" +
                    "<meta http-equiv=pragma content=no-cache>\n" + "</HEAD>\n" +
                    "<BODY bgcolor=\"#eeeeee\">");
            out.println("Сайт временно не работает. Приносим свои извинения.<br/></body></html>");
        }
    }
}



Если кто-то заметил, в этой каше, форма передаётся сервлету RedirectedFromAddingOfferServlet. В  нём происходит отрисовка второго шага действия. И т.п.

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

Какие есть решения и какие мысли? 
--------------------
24*7*365*геморой*зарплата=0
PM MAIL ICQ   Вверх
Vasay
Дата 27.7.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



p0zt3r, 

мда...  Могу Вам только посочувствовать. 

Цитата

Кстати, какие есть шаблонизаторы?

 Шаблогизаторы: Velocity, freemarker.


Мысли - выкинуть этот движок, взять, например, Spring+Hibernate(TopLink или JPA)+Velocity (freemarker или Jsp) и сделать с нуля...
Так как расширение функционала такого проекта будет стоить много крови и нервов.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Platon
Дата 27.7.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Vasay @  27.7.2009,  21:00 Найти цитируемый пост)
мда...  Могу Вам только посочувствовать. 

присоединяюсь. Мегажестоко (( техлида в отставку! поставить вопрос перед начальством.
PM MAIL ICQ   Вверх
p0zt3r
Дата 27.7.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Platon, техлиду  самому посочувствовать можно smile Проект создавался не при нём smile

Добавлено через 2 минуты и 32 секунды
Пойду лучше за водкой  smile 
--------------------
24*7*365*геморой*зарплата=0
PM MAIL ICQ   Вверх
fixxer
Дата 27.7.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

По существу. Очень желательно сразу начать рефакторить. Первым делом - разметку в jsp не меня функционала. (или в Velocity) Привести все к виду Model 2. А потом уже смотреть и рефакторить архитектуру, прикручивать фреймворки и всякие хибернейты, на следующей итерации. Если сразу за все взяться - ничего не получится и пойдете потом в интернетах java'у хулить smile

Это сообщение отредактировал(а) fixxer - 27.7.2009, 23:20


--------------------
user posted image
PM MAIL ICQ   Вверх
p0zt3r
Дата 28.7.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я хочу поблагодарить Platon за отличные книги по JBOSS! Особенно за доку JBOSS at Work!

fixxer, не! Я почитал сейчас про JBOSS и всё встало на свои места. Сервлеты рулят однозначно!
Спасибо за поддержку, но думаю тут надо всё под корень сносить. И к этому и идём. 

Собственно, бизнес-логика переработана. Веб всё равно с нуля писать. Причём, я там хочу реализовать так, чтобы сборка страницы на клиенте делалась. Т.е. больше уклон на написание мощного js-клиента. А сервер будет только ресурсы предоставлять. 

JSP я не вижу смысла использовать пока. Т.е. он-то конечно будет, но только для того, чтобы выдать клиенту клиентское js приложение и интерфейс нескольких страниц. Всё остальное будет собираться уже этим клиентом. 
--------------------
24*7*365*геморой*зарплата=0
PM MAIL ICQ   Вверх
fixxer
Дата 28.7.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хозяин, конечно, барин. Но как на мой вкус js и ajax это в конце - шлифовка, лоск или когда ничего уже не помогает. (Другой вариант если все вокруг ajax строить. Но на это есть GWT и прочее) Если грамотно страничку по кусочкам собирать - посмотри Tiles. Или компонентные фреймворки Tapestry 5, Wicket, JSF.


--------------------
user posted image
PM MAIL ICQ   Вверх
Vasay
Дата 28.7.2009, 01:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



p0zt3r, 

Я так понял это интернет сайт?   Если так, то
Цитата

Т.е. больше уклон на написание мощного js-клиента. А сервер будет только ресурсы предоставлять. 

неверный ход. 
для 99% проектов - это смерть:

- Несовместимость с SEO
- Несоответствие URL контенту 
- Вы не заставить все это корректно работать во всех браузерах 

Так же лучше избегать для публичных ресурсов фрэймворков активно использующих js (jsf, gwt....)

Цитата

Я почитал сейчас про JBOSS и всё встало на свои места. Сервлеты рулят однозначно!


Почитайте, например, про Spring MVC, например это: http://static.springsource.org/docs/Spring-MVC-step-by-step/


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

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

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


 




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


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

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