<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>a</servlet-name>
<jsp-file>/svt</jsp-file>
</servlet>
<servlet>
<servlet-name>b</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>c</servlet-name>
<jsp-file>/main.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>d</servlet-name>
<servlet-class>cal.Table</servlet-class>
</servlet>
<servlet>
<servlet-name>e</servlet-name>
<servlet-class>cal.Table0</servlet-class>
</servlet>
<servlet>
<servlet-name>f</servlet-name>
<servlet-class>cal.Table1</servlet-class>
</servlet>
<servlet>
<servlet-name>g</servlet-name>
<servlet-class>cal.Table2</servlet-class>
</servlet>
<servlet>
<servlet-name>h</servlet-name>
<servlet-class>cal.Table3</servlet-class>
</servlet>
<servlet>
<servlet-name>i</servlet-name>
<servlet-class>cal.Table4</servlet-class>
</servlet>
<servlet>
<servlet-name>j</servlet-name>
<servlet-class>cal.Table5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>c</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/security/protected/login.jsp</form-login-page>
<form-error-page>/security/protected/error.jsp</form-error-page>
</form-login-config>
</login-config>
</web-app>
Переход на другую JSP-ку в JBuilder
2) Поделитесь ссылкой на пример web.xml, для приложения с jsp+servlet-ами.
3) Tcp-монитор никак не реагирует на запросы/ответы. Вроде надо только порт поменять, чтоб через него все лилось, но не хочет гад.
Расскажи здесь подробней о точках перехода(значения тегов <a href="?"> или <form action="?">) на главной странице .А также названия других JSP-ек и их расположение. Часто ошибка бывает там. Для настойки сервлетов нужно также их название,их пакет и твой web.xml .
Код:
1) Где еще используются <servlet-name>, кроме мэпинга?
2) Нужно ли в дескрипторе упоминать все сервлеты которые у меня есть или только связанные со стартовым jsp?
У меня на первом jsp(который связан jspBeen-ом авторизации на отображение конкретной странички с таблицой из БД ) идет дополнительно проверка на авторизацию в домене и переход на jsp с главным списком. На jsp со списком находятся ссылки, при нажатии на какую-то вызывается опять предыдущая с параметром(имя jsp на который идет переход), происходит проверка на переход. И он происходит если все ok. НО...во внешнем Томе все работает!!! Скорее это настройки самого Тома, либо JB(2005). Но что именно на это влияет не знаю. В Томе под JB всё по-умолчанию. Может server.xml? web.xml одинаковые.
т е есть main.jsp, на котором идет проверка на авторизацию в домене, и в нем ссылка на index.jsp:
...
<A href="<%=response.encodeURL("/svt/main.jsp?table=users")%>" style="cursor:hand; text-decoration:underline">
<A href="<%=response.encodeURL("/svt/main.jsp?table=rowperms")%>" style="cursor:hand; text-decoration:underline">
<A href="<%=response.encodeURL("/svt/main.jsp?table=subdivs")%>" style="cursor:hand; text-decoration:underline">
...
и т д
...
Bean, связанный main.jsp проверяет доступ текущего пользователя на данную ссылку(ресурс) и производит переход или выдает обламывает => (я уже сам начинаю что-то понимать :) ) не дается доступ не к какому ресурсу, либо не передается имя ресурса. OK, буду копать в вопросе доступа. Но почему же работает на внешнем TomCat-е?!!!! А во внешнем браузере по JB-тома пишет "The page cannot be found"!
Нашел разницу в отображении:
в TomCat 5.0(который нормально выдает) - http://127.0.0.1:8080/svt/main.jsp;jsessionid=9805433F98C022B10A06F3F595127877?table=traffic
в TomCat 5.5.9(JBuilder) - http://localhost:8086/svt/main.jsp?table=traffic
Заранее огроменное спасибо!
Код:
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>c</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>c</servlet-name>
<url-pattern>/svt</url-pattern>
</servlet-mapping>
2 <servlet-name> используется для меппинга
3 Твой участок web.xml по авторизации
Код:
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/security/protected/login.jsp</form-login-page>
<form-error-page>/security/protected/error.jsp</form-error-page>
</form-login-config>
</login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/security/protected/login.jsp</form-login-page>
<form-error-page>/security/protected/error.jsp</form-error-page>
</form-login-config>
</login-config>
он неполный(не указано что защищать).
4 по поводу "checkbox Enable Web Run/Debug/Optimize" опиши кокретней где это.
5 И Главное чтобы быстрей всё доделать пришли лучше полностью war файл твоей работы - без него непонятен механизм. Только убери оттуда ,если они там есть, библиотеки(jar файды) дров баз данных, чтобы не качать лищние мб.
Я использую SharedSessionBean для сохранения параметров сессии, который всем доступен. Я когда-то исключил 2 файла с такой вставкой во все jsp-ки, и поэтому параметры сессии не были доступны...
Код:
_abstractJSPBean.setSharedSessionBean(_sharedSessionBean);%>
<%_abstractJSPBean.setRequest(request);%>
<%_abstractJSPBean.setResponse(response);%>
<%_abstractJSPBean.setSession(session);%>
<%_abstractJSPBean.setServlet(this);%>
<%_abstractJSPBean.setConnection();%>
<%_abstractJSPBean.process();
%>
<% if (! _abstractJSPBean.getSkipPageOutput()) { %>
...
<%@ page errorPage="" %>
<%_abstractJSPBean.footerProcess();%>
<%_abstractJSPBean.closeConnection();%>
<%//System.out.println("closed" + "-" + _abstractJSPBean.getJSPCode());%>
<%}
}catch(Exception ex){}%>
<%_abstractJSPBean.setRequest(request);%>
<%_abstractJSPBean.setResponse(response);%>
<%_abstractJSPBean.setSession(session);%>
<%_abstractJSPBean.setServlet(this);%>
<%_abstractJSPBean.setConnection();%>
<%_abstractJSPBean.process();
%>
<% if (! _abstractJSPBean.getSkipPageOutput()) { %>
...
<%@ page errorPage="" %>
<%_abstractJSPBean.footerProcess();%>
<%_abstractJSPBean.closeConnection();%>
<%//System.out.println("closed" + "-" + _abstractJSPBean.getJSPCode());%>
<%}
}catch(Exception ex){}%>
В JBuilder-е вылетает ошибка:
'catch' without 'try'
'try' without 'catch' or 'finally'
'}' expected
'try' without 'catch' or 'finally'
illegal start of type
<identifier> expected
'class' or 'interface' expected
, но код нормальный и он проглатывается TomCat-ом 5.0, потому в нем все и работает.
Насчет web.xml:
1) аутентификацию Тома я вообще не стал использовать, так что просто забыл все убрать
2) Маппить, да и вообще упоминать, надо все сервлеты, или только тот что связан с моим стартовым jsp?
3) "checkbox Enable Web Run/Debug/Optimize" - Пакет с файлами модуля\(jsp/servlet)->правой кнопкой\Properties\Web Run
Маппить нужно -для того чтобы это можно было вызвать по URL.
Для чего нужен сервлетт который нельзя вызвать?
Есть вообще-то старый способ - InvokerServlet для вызова сервлета по его полному имяни, но это другая тема. Чтоб толком разобраться в этом и не только в этом посмотри спецификации JSP и Servlett на http://www.jcp.org и также J2EE туториалы и доки к ним на http://www.sun.com
2 checkbox Enable Web Run/Debug/Optimize
Это для запуска под профилировщиком(конроль выделения памяти,скорости и тд ), если у тебя установлен BorlandOptimizeSuite...
3 Присланного тобой куска кода недостаточно чтоб понять проблему!
Но в нём действительно как пишет JBuilder нарушена конструкция
try-сatch.
Приведи полный код JSP и своего Беана.
!Но основная проблемма все та же - не хочет работать c идентификаторами сессии. Например:
<A href="<%=response.encodeURL("/svt/main.jsp?table=users")%>" style="cursor:hand; text-decoration:underline">П</STRONG>ользователи</A>
в TomCat 5.0(который нормально выдает) -
http://127.0.0.1:8080/svt/main.jsp;jsessionid=C35963C0CB892A66504A70046E643D87?table=traffic
в TomCat 5.5.9(JBuilder) - http://localhost:8080/svt/main.jsp?table=traffic
Код один и тот же!
Причем, session.getId() под JB-м TomCat-ом все нормально возвращает.
!!!Скорее всего надо что-то добавить в заголовок jsp.
вот мой заголовок:
Код:
<%@ page import = "java.util.*" %>
<jsp:useBean id="_mainJSPBean" class="cal.MainJSPBean" scope="session"/>
<%cal.AbstractJSPBean _abstractJSPBean = _mainJSPBean; %>
<jsp:setProperty name="_mainJSPBean" property="*"/>
<%response.setHeader("Cache-Control", "no-cache");%>
<%response.setHeader("Pragma", "no-cache");%>
<%@ include file="includeheader.jsp" %>
...
<jsp:useBean id="_mainJSPBean" class="cal.MainJSPBean" scope="session"/>
<%cal.AbstractJSPBean _abstractJSPBean = _mainJSPBean; %>
<jsp:setProperty name="_mainJSPBean" property="*"/>
<%response.setHeader("Cache-Control", "no-cache");%>
<%response.setHeader("Pragma", "no-cache");%>
<%@ include file="includeheader.jsp" %>
...
Может быть <%@ page session="true"%>?
Сразу вопрос - только при отключенных cookie можно работать
с rewrite a raw URL, или использование как-то включается на страничке?
Если нужно отключать куки, то как это сделать в JB-броузере, где вообще находятся его настройки(конечно можно и на внешнем смотреть, но все-таки).
По поводу <%@ page session="true"%>:
Это декларативный способ инициализации сессии, т.е. можно так или програмно.А инициализироать её надо обязательно т.к. твой механизм по Твоим словам строится на данных в ней сразу.Две или более сессии в одном контексте запроса создать неполучится!Если Ты второй раз попытаешся создать сессию в контексте одного запроса- Тебе вернут ранее созданную!
По поводу механизма таскания сессии:
Сначала ид сессии прописывается в URL.Далее на следующем запросе если куки включены то врезается туда.Если не включены то так в URL и остаётся.Это всё и делает encodeURL("")!Прикрепляй её ко всем точкам перехода, а то можеш потерять сессию.Если принудительно в приложении(серверном а не брозер) отклучиш куки в то сессия соответственно только в URL и будет.
По билдеру:
Луше в нём тестировать тем-же КОТОМ под которым и будет приложение трудится.Для этого сконфигурируй в нём новый сервер - твоего внешнего КОТА и в проекте выбери именно этот сервер.
конфигуррировать так
1. Enterpris->ConfigureServer->Copy(внутренний КОТ) а дальше в этой копии подредактировать пути на твой рабочий внешний КОТ
2. На проекте правую мышиную->Properties->Server->Свой сервер
Билдеровский Броузер - это самый минимум возможностей браузеров.
Настроек его в Билдере я не знаю.
ПО ПОВОДУ АРХИТЕКТУРЫ:(не обязательно но рекомендую)
Считается дурным тоном в JSP использовать java код(по возможности самый минимум). Контроллеры и биз-логику рекомендуется использовать в сервлетах или в JSP тегах(писать тэги).Такой подход действительно помогает читаемости и расширяемости твоего зверя.
к примеру:
1. login.html->authServlet->NotAccess.html->login.html
2. login.html->authServlet->ViewTable.jsp->.....
Удачи;)
P.S.
Твой код ещё толком непосмотрел.
Кстати сейчас смотрю момент с коментарием "если доступа нет завершающий </A> не выводится" наверно Всётаки вообще тогда <A> открывать и не надо было?
Проект действительно интересный!
Наверно всётаки такие вещи лучше по мейлу обсудить а не глобально...
Пришли мне личное сообщение со своим мейлом.
коментарии лучше не смотри - они бредовые и верить им нельзя :p Это остались не высказанные(не реализованные мысли). Так что низачто не верь им :)
Меня проблемма одна замучала...
Вот такое вот выдает:
org.apache.jasper.JasperException: Unable to compile class for JSP
An error occurred at line: 40 in the jsp file: /includeheader.jsp
Generated servlet error:
The method getJSPCode() from the type AbstractJSPBean is not visible
и т д
Т е полиморфизм понимать не хочет(на первый взгляд). Не пойму как решить проблемму. AbstractJSPBean-переменной назначается ссылка на
класс одного из наследников и уже в нем вызывается метод
getJSPCode(). Почему он пытается вызвать abstract private getJSPCode() из самого AbstractJSPBean не могу понять!!! Это все тормозит.
И еще... Раньше все работало под TomCat 3.x, а я запускаю на 5.x. Может здесь кроется какая-то закавырка. Если ты знаком с особенностями портирования с 3 на 5, поделись опытом.