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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> все jsp через один сервлет 
:(
    Опции темы
NikitOS9
Дата 25.1.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



использую tomcat.
суть такова, есть желание сделать чтобы все запрашиваемые страницы ходили через один сервлет и только по мапингам, т.е запретить вызывать jsp явно в запросе
для этого сделал следущее:

web.xml
.......
Код

    <servlet>
        <servlet-name>userLogin</servlet-name>
        <servlet-class>BaseServlet</servlet-class>
        <init-param>
            <param-name>next</param-name>
            <param-value>/uLogin.jsp</param-value>
        </init-param>
    </servlet>
    <servlet>
        <servlet-name>userBoard</servlet-name>
        <servlet-class>BaseServlet</servlet-class>
        <init-param>
            <param-name>next</param-name>
            <param-value>/uBoard.jsp</param-value>
        </init-param>
    </servlet>
    <servlet>
        <servlet-name>infoPage</servlet-name>
        <servlet-class>BaseServlet</servlet-class>
        <init-param>
            <param-name>next</param-name>
            <param-value>/infoPage.jsp</param-value>
        </init-param>
    </servlet>
........
    <servlet-mapping>
        <servlet-name>userLogin</servlet-name>
        <url-pattern>/userLogin</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>userBoard</servlet-name>
        <url-pattern>/userBoard</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>infoPage</servlet-name>
        <url-pattern>/infoPage</url-pattern>
    </servlet-mapping>




сам BaseServlet

.......
Код

public class BaseServlet extends HttpServlet {

    private String forwardUrl = null;

    //Load init param from web.xml
    public void init(ServletConfig s) throws ServletException {
        super.init(s);
        this.forwardUrl = s.getInitParameter("next");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        detectForwardDestination(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        detectForwardDestination(request, response);
    }

    private void detectForwardDestination(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        if( null != this.forwardUrl || !"".equals(this.forwardUrl) || !"/".equals(this.forwardUrl) ){
            request.getRequestDispatcher(this.forwardUrl).forward(request, response);
        } else{
            throw new ServletException("Destination Is Not Defined");
        }
    }
}


но при вызовах например..localhost/userBoard на BaseServlet никакого внимания, вызываются замечально даже если я в методах 
doPost, doGet ставлю явный екцепшн
 
Код

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        throw new ServletException("alert!");
        //detectForwardDestination(request, response);
    }


и как запретить например явный вызов ...localhost/uBoard.jsp


Это сообщение отредактировал(а) NikitOS9 - 25.1.2008, 21:13
PM MAIL   Вверх
Kangaroo
Дата 25.1.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



NikitOS9, 
1)используй тег код! Тогда будет удобнее читать твой пост.

2) Добавь это в web.xml:
Код

<security-constraint>
     <display-name>Access denied for jsp!!!!!!</display-name>
      <web-resource-collection>
          <web-resource-name>
               access_denied
          </web-resource-name>
           <url-pattern>*.jsp</url-pattern>
      </web-resource-collection>
      <auth-constraint />
</security-constraint>




Это сообщение отредактировал(а) Kangaroo - 25.1.2008, 21:03


--------------------
Lost....
PM MAIL MSN   Вверх
NikitOS9
Дата 25.1.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ок буду использовать.

1) там где запрет нужно что поставить ? названия <servlet-name>userLogin</servlet-name> ?

2) а как это повлияет на BaseServlet, он никак не сказывается, при обращении просто вызывается та jsp на которая указана 
<param-value>

то есть

Код

    <servlet>
        <servlet-name>userLogin</servlet-name>
        <servlet-class>BaseServlet</servlet-class>
        <init-param>
            <param-name>next</param-name>
            <param-value>/uLogin.jsp</param-value>
        </init-param>
    </servlet>


вопрос почему ? я же указал что ходить надо через BaseServlet.
PM MAIL   Вверх
Ulysses4j
Дата 25.1.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(NikitOS9 @  25.1.2008,  21:25 Найти цитируемый пост)
как запретить например явный вызов ...localhost/uBoard.jsp

Все ресурсы, в которых нуждается данная веб-апликация, но к которым клиент апликации не должен иметь доступа, должны быть помещены в папку WEB-INF (в корне апликации) — спецификация Java EE гарантирует, что любой контейнер ей удовлетворяющий, не пустит туда клиента. Обычно создают WEB-INF/jsp/.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
NikitOS9
Дата 25.1.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ок, с этим возможно нужно поступить так.

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

PM MAIL   Вверх
Ulysses4j
Дата 25.1.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

The Servlet specification also defines that the entire /WEB-INF directory of any Web Application must be kept hidden from users of the application.

Falkner, Jones. Servlets and JSP, 2003

Правда, на счет папок внутри, туториал от Sun по JEE 5 рекомендует создавать "свои" папки внутри /WEB-INF/classes/ 

Цитата
The document root contains a subdirectory named /WEB-INF/, which contains the following files and directories: 
  • web.xml: The web application deployment descriptor
  • Tag library descriptor files (see Tag Library Descriptors)
  • classes: A directory that contains server-side classes: servlets, utility classes, and JavaBeans components
  • tags: A directory that contains tag files, which are implementations of tag libraries (see Tag File Location)
  • lib: A directory that contains JAR archives of libraries called by server-side classes


You can also create application-specific subdirectories (that is, package directories) in either the document root or the /WEB-INF/classes/ directory.

The Java™ EE 5 Tutorial


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
v2v
Дата 25.1.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ты пытаешься реализовать паттерн FrontController.
я как раз тоже с ним мучаюсь.
возникает много вопросов:
например если реализовывать forward в сервлете, то там же будет и формирование url-a и инициализация входных параметров и контроль залогинин пользователь или нет: в общем очень внушытельных размеров сервлет получается, что мне не сильно нравится ...


--------------------
PM   Вверх
Ulysses4j
Дата 25.1.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что значит игнорируется? Приведите пример запроса и ответа сервера на него, который вас не устраивает. Кидать исключения в сервлетах нет никакого смысла — их нельзя нигде поймать, конейнер сам решает, что делать в таких случаях, чаще всего он дает ошибку 500 (Internal server error), но в принципе, может быть все, что угодно, это не специфицировано. И еще: то, что вы делаете, создает впечатление, что вам нужен фильтр (javax.servlet.Filter) — пробуйте про них почитать.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Ulysses4j
Дата 25.1.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v2v @  25.1.2008,  23:07 Найти цитируемый пост)
ты пытаешься реализовать паттерн FrontController

+1
Возьмите книжку Алюра (на англ.; бумажная переведенная есть) и почитайте про него.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
NikitOS9
Дата 25.1.2008, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ок, все по порядку

1) то есть каталог с jsp рекомендуется размещать в /WEB-INF/classes/jsp ?
хотя в доках по jsp везде написано что, jsp, html и тд. фалы должны находиться в каталоге верхнего уровня, т.е 
...jsp
...html
/WEB-INF/classes/...
/WEB-INF/lib/...
вот такая структура.
да и я чесно сказать слышу впервые что нужно jsp размещать в /WEB-INF/classes/jsp. ну ладно, раз вы привели
цитату с сана, видимо гонят o`reilly, я у них читаю доки )

2) что значит игнорируется. если посмотреть на код выше, то логично получается, что при любом запросе, например 
localhost/userLogin, запрос переходит к BaseServlet, он уже читает getInitParameter("next") этого userLogin, а в нем находится реальный путь к jsp, это видно из в web.xml. Из этого логично предположить, что если в BaseServlet написать например что в любом случае делать  форвард на постоянную jsp, 
...
 
Код

private void detectForwardDestination(HttpServletRequest request, HttpServletResponse response) throws IOException,      ServletException {
        if( null != this.forwardUrl || !"".equals(this.forwardUrl) || !"/".equals(this.forwardUrl) ){
            request.getRequestDispatcher("/constantPage.jsp").forward(request, response);
        } else{
            throw new ServletException("Destination Is Not Defined");
        }
    }

..

то туда мы и должны попасть.
но нет! попадаем все равно на ту jsp, которая указана в <param-value>. То есть можно совсем убрать BaseServlet из web.xml и все будет так же работать.
а кидать исключения в сервлетах как же нет смыла, ошибка 500, обрабатывается например так в том же web.xml
Код

    <error-page>
        <error-code>500</error-code>
        <location>/error_page.jsp</location>
    </error-page>

а на error_page.jsp можно сделать например так 

<%
Код

    //Throwable throwable = (java.lang.Throwable)request.getAttribute( "javax.servlet.jsp.jspException" );
    Throwable error = (java.lang.Throwable)request.getAttribute("error");
    //response.getWriter().println(request.getAttribute("error"));
    String msg = ( error != null ? error.getMessage() : null );
    if( msg == null ) msg = "Unhandled error.";

%>

или еще вот так
    <%
Код

    String attrib;
    for( Enumeration attribs = request.getAttributeNames(); attribs.hasMoreElements(); ) {
        attrib = (String)attribs.nextElement();
        %><%= attrib %> = <%= request.getAttribute( attrib ) %>
        <%
    }
  
  %>
уфф, надеюсь понятно излагаю )





Это сообщение отредактировал(а) NikitOS9 - 25.1.2008, 23:15
PM MAIL   Вверх
v2v
Дата 26.1.2008, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(NikitOS9 @  25.1.2008,  23:13 Найти цитируемый пост)
/WEB-INF/classes/jsp

без classes/ - надо: /WEB-INF/jsp
 
-
рассказываю как я сделал - это не совсем правильно имхо, но оно пашет именно так как тебе надо : 

показываю главный кусок моего вебточкаиксэмэля.
Код

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>entrpoint</servlet-name>
    <servlet-class>web.EnterPoint</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>entrpoint</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

пояснения : 
есть страничка по умолчанию index.jsp , в которой код редиректит сразу на сервлет web.EnterPoint , этот сервлет обрабатывает входящие урлы :
Код

String path=req.getPathInfo(); 
// <-  путь запроса, например вернёт: /page2.jsp при запросе  http://127.0.0.1/MyApp/page2.jsp 


и делает редирект на нужную страничку: 

Код

scx.getRequestDispatcher("/WEB-INF/jsp/page2.jsp").forward(req, res);


вот. так работает. и странички прячутся. и весь контент идёт через главный сервлет web.EnterPoint ... но уже при обработке только 2х разных видов страниц (форм ) этот самый сервлет очень сильно распух , дальше хуже... мне это как то не нравится...надо что то другое придумать...


Это сообщение отредактировал(а) v2v - 26.1.2008, 02:18


--------------------
PM   Вверх
NikitOS9
Дата 26.1.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



v2v

То есть как я понял, запрос любого урла переходит к web.EnterPoint.
в нем String path=req.getPathInfo(); для определения что было вызвано, и дальше форвард на него ?
тут вроде все ясно, но что не верно в моем.. ?

я хотел чтобы все jsp, даже не все, а те что мне нужно, ходили через BaseServlet, а например сервлеты и другие jsp через другой.. 







 
PM MAIL   Вверх
XEugene
Дата 26.1.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(NikitOS9 @  26.1.2008,  20:28 Найти цитируемый пост)
я хотел чтобы все jsp, даже не все, а те что мне нужно, ходили через BaseServlet, а например сервлеты и другие jsp через другой.. 
Тут ведь упоминали уже фильтры... Напиши по фильтру на каждую нужную jsp и не мучайся.

Только тогда вариант размещения jsp в WEB-INF не пройдёт.  Так делают когда хотят исключить возможность прямого доступа к jsp,  чтобы попасть на неё можно было только через вышеупомянутый FrontController. Так сделано, например,  в Spring.




PM MAIL   Вверх
Ulysses4j
Дата 26.1.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(XEugene @  26.1.2008,  22:16 Найти цитируемый пост)
через вышеупомянутый FrontController. Так сделано, например,  в Spring.

Да так сделано в большинстве web-frameworks, насколько я знаю, Spring MVC и Struts — точно (пробовал...). Просто человек хочет с нуля написать веб-приложение — ну, флаг в руки, изобретение велосипедов иногда может быть весьма полезным. На самом деле, усли уж FrontController, то фильтр всё-таки, наверное, не то. Фильтр обычно выполняет какие-то изолированные задачи в рамках приложения (авторизация, кодировки, как примеры), а если реализуется такая глобальная диспетчеризация, то это все же сервлет.

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

Это сообщение отредактировал(а) Ulysses4j - 26.1.2008, 22:17


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
XEugene
Дата 26.1.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Ulysses4j @  26.1.2008,  22:12 Найти цитируемый пост)
С редиректом v2v точно написал,
Только я всё-таки позволю себе тут влезть  smile  - 
то, что показал v2v это форвард,  а не редирект. Это не одно и то же. 
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.1562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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