Вот сообщение в блоге , которое должно помочь с экранированием тиков в строках.
Вот простейший из указанных сообщений:
простым и наиболее распространенным способом является использование одной кавычки с двумя одиночными кавычками в обеих сторонах.
SELECT 'тестовая одиночная кавычка' '' из dual;
Выходной сигнал вышеприведенный оператор будет выглядеть следующим образом:
test single quote '
Просто заявив, что вам нужен дополнительный символ одиночной кавычки для печати одного символа quote>. То есть, если вы поместите два символа одной кавычки, Oracle будет печатать один. Первый> действует как escape-символ.
Это самый простой способ печати одиночных кавычек в Oracle. Но это будет сложно, если вам придется печатать набор кавычек вместо одного. В этой ситуации следующий метод работает отлично. Но для этого требуется еще более типичный труд.
blockquote>
Что ж, вы должны передать его, если вам это нужно. Все остальное, что вы делаете, в основном будет некрасивым.
Вы можете использовать переменную ThreadLocal
- в основном устанавливаете контекст для этого конкретного потока, когда получаете запрос, а затем принеси его позже. Это будет работать до тех пор, пока вам нужно только получить запрос в потоке, который его обрабатывает, и пока вы не выполняете какую-либо фанковую асинхронную обработку запросов. Тем не менее, это хрупкое решение именно по этим причинам.
Однако я бы настоятельно посоветовал вам вместо этого явно указывать свои зависимости. Либо передайте запрос сервлета, либо только те биты, которые вам нужны.
Джон Скит сказал практически все, но одно уточнение к его совету «только те биты, которые вам нужны» - если вам нужно передать параметры вашего запроса, но вам не нужна зависимость от HttpServletRequest
, передать request.getParameterMap ()
.
И немного расширить параметр ThreadLocal
- у вас может быть фильтр
, который обрабатывает все входящие запросы и устанавливает запрос в
public final static ThreadLocal<HttpServletRequest> httpServletRequestTL =
new ThreadLocal<HttpServletRequest>();
Поскольку вы устанавливаете его для каждого запроса (осторожно с сопоставлением фильтров), вам не придется беспокоиться о пуле потоков контейнера сервлета - у вас всегда будет текущий запрос .
PS это логика, лежащая в основе утилиты spring, предложенной скаффманом - я присоединяюсь к нему, рекомендуя стабильный компонент, а не создавать свой собственный.
Если предположить, что вы не можете передать объект запроса вниз по стеку вызовов, тогда необходим какой-то механизм совместного использования, что не идеально, но иногда необходимо.
Spring предоставляет RequestContextFilter именно для этой цели. Он использует ThreadLocal
и позволяет коду получать текущий запрос через RequestContextHolder . Обратите внимание, что этот фильтр не требует, чтобы вы использовали какую-либо другую часть Spring:
Фильтр сервлета 2.3, который предоставляет запрос к текущему потоку через как LocaleContextHolder, так и RequestContextHolder. Быть зарегистрированным как фильтр в web.xml.
Этот фильтр в основном используется с сторонние сервлеты, например JSF FacesServlet. В собственной сети Spring поддержка, DispatcherServlet's обработки вполне достаточно.
Если вы собираетесь использовать ThreadLocal
, то лучше использовать существующее, работающее решение, чем рисковать появлением ошибок, которые код ThreadLocal
является склонны к.
Для этого не существует API сервлета. Однако Tomcat предоставляет для этого вызов API,
HttpServletRequest request = (HttpServletRequest)org.apache.catalina.core.ApplicationFilterChain.getLastServicedRequest();
Это получит последний запрос, переданный сервлету для обслуживания из текущего потока.
Для того, чтобы это работало, Tomcat должен находиться в «Строгом соответствии сервлетам» Режим. Если нет, вам нужно включить его, добавив этот параметр JVM:
org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
Предполагая, что сервлет верхнего уровня действительно является табу по какой-то сумасшедшей бизнес-причине, все еще есть возможность определить ServletFilter
для предварительного просмотра запроса и прочего это в ThreadLocal. Предполагая, что web.xml
также не является священным.
Но я согласен с Джоном Скитом в том, что это было бы очень некрасиво. Я бы запрограммировал это, а затем попытался бы найти другую работу. :)
На самом деле, учитывая тот факт, что фильтр может полностью отобрать контроль у принимающего сервлета, вы можете использовать эту технику, чтобы перенаправить код на свой собственный сервлет, делать все, что вы хотите, а ЗАТЕМ запустить другой, "официальный" сервлет ... или что-нибудь еще в этом роде. Некоторые из этих решений даже позволят вам правильно и надежно работать с данными вашего запроса.