Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622

Как получить запрошенный URL или URI?

16.05.2017, 10:44. Показов 5113. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Метод получения URI находится в классе SiteSettings
Java
1
2
3
4
5
6
7
8
...
    public String getUri( HttpServletRequest req )
    {
        String uriPage = req.getRequestURI();
        
        return uriPage;
    }    
 ...
Вызывается этот метод в другом классе MainClass в одном из его методов
Java
1
2
3
4
5
6
7
8
9
10
...
public static SiteSettings siteSettings = new SiteSettings();
...
 
    public static String templ() throws FileNotFoundException, IOException, URISyntaxException {
        
        HttpServletRequest request = null;
 
        String uriPg = siteSettings.getUri(request);
...
При запуске возникает исключение сервера
java.lang.NullPointerException

Не врубаюсь в чем проблема. В неправильной инициализации HttpServletRequest request = null;?
Подскажите пожалуйста как правильно получить URL URI и прочие атрибуты от сервера.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2017, 10:44
Ответы с готовыми решениями:

Как правильно создать файл из Uri или Uri.getPath() для отправки на сервер?
Есть Uri, полученный после выбора файлов в галерее. Uri вроде правильный:...

Запрошенный URL не может быть получен
при попытке загрузить большинство сайтов выдает ошибку. в чем может быть проблема? скрин прилагается

Как с библиотекой xNet или без нее получить URL адрес страницы?
Сделал авторизацию вконтакте, хочу искусственно получить токен через приложение, суть в том, что после нажатия кнопки разрешить (на...

21
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 10:59
Цитата Сообщение от VlGuvin Посмотреть сообщение
Java
1
2
HttpServletRequest request = null;
String uriPg = siteSettings.getUri(request);
вы серьезно? а что вы ожидаете интересно?
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
16.05.2017, 11:24  [ТС]
Да null он везде ноль.

Если не сложно покажите как это правильно делается.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 12:15
делается это вот так - http://stackoverflow.com/quest... mplete-url

только вам видимо это не поможет. Судя по приведенному коду и попытке взять юри от нула, советую покурить тему о сервлетах.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
16.05.2017, 13:56  [ТС]
Спасибо за полезную ссылку. Но ни в одном из примеров нет пояснения как инициализируется HttpServletRequest request
Пример
Java
1
2
3
4
5
6
7
8
9
10
public static String getFullURL(HttpServletRequest request) {
    StringBuffer requestURL = request.getRequestURL();
    String queryString = request.getQueryString();
 
    if (queryString == null) {
        return requestURL.toString();
    } else {
        return requestURL.append('?').append(queryString).toString();
    }
}
Сам метод понятен. Но в него передается параметр HttpServletRequest request.
Самая непонятная проблема - где его взять или объявив, как правильно инициализировать?
Google не помог. Если можно, поясните пожалуйста коротко как все-же, получить URI в Java/
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 14:03
юрл чего надо получить? )
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.05.2017, 14:09
Цитата Сообщение от neske Посмотреть сообщение
советую покурить тему о сервлетах.
тут скорее даже надо покурить java core и "почему возникает NPE или почему нельзя ничего вызывать у null"
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
16.05.2017, 14:46  [ТС]
Не понятно где и каким образом получить request
Сделал так: В странице которая запрашивается вызвал
Java
1
<% out.println(mainClass.getHttpSr(request)); %>
в классе имеется метод
Java
1
2
3
4
5
6
7
8
   
...
static HttpServletRequest request = null;
...
 public static HttpServletRequest getHttpSr(HttpServletRequest rc) {
        request  = rc;
        return rc;
    }
Из него получаю собственно request, который уже далеко не ноль.
Далее полагаю можно добывать Uri, Url и т. п.
Насколько это правильно, сомневаюсь...
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 15:00
хоспади, нет, так код писать нельзя, вы сформулируйте то, что вам нужно. Любой реквест от кого-то приходит, более того, есть место, в котором он обрабатывается и к нему есть прямой доступ.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
16.05.2017, 15:27  [ТС]
Вот тут точно не понятно. Почему нельзя? А как тогда получить request. Понятное дело, что при таком подходе нужно будет
прописывать
Java
1
<% out.println(mainClass.getHttpSr(request)); %>
в каждой jsp странице. У меня нет баз. Только страницы.
Ладно. Это мои кренделя.
Допустим при вызове каждой отдельной страницы вызывается всегда один и тот-же класс шаблонизатор, которому нужет только html файл шаблона и URI по которому в шаблон вставляются нужные тексты в нужные места. URI какраз и нужен, чтобы определить какой текст вставлять. Это своего рода ключ.
Не знаю как в Java но в PHP это работает на ура. Никаких баз. Все на файлах.
Если не сложно, расскажите кратко, как делается подобное в Java?
Как в классе шаблонизаторе, который вызывается при запросе каждой отдельной страницы сайта получать HttpServletRequest request, который даст возможнось получить все, что можно получить с помощью PHP, типа
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
list ($data,$dtime,$nowtime,$ip,$refer,$agent,$user,$uri,$accept,$language,$encoding,$connect)=array(
    date ("Y"),
    date('r'),
    date("d.m.Y H:i:s"),
    (!empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR']: 'None'),
    (!empty($_SERVER['HTTP_REFERER']) ? strtolower($_SERVER['HTTP_REFERER']): 'None'),
    (!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT']: 'None'),
    (!empty($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER']: 'None'),
    (!empty($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI']: 'None'),
    (!empty($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT']: 'None'),
    (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE']: 'None'),
    (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING']: 'None'),
    (!empty($_SERVER['HTTP_CONNECTION']) ? $_SERVER['HTTP_CONNECTION']: 'None')
);
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 15:47
вы описываете серверную логику. Распарсить юри, еще какие-то параметры вам нужные, с этим отлично справится сервлет.
И далее рендерите уже конечный хтмл с помощью полученных параметров и jsp шаблона.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
16.05.2017, 16:52  [ТС]
Спасибо. Смысл понятен.
Но как это выглядит в коде... Как от сервлета получить нужные параметры.
Общий смысл понятен. Но пошагово как это делается..
Если можно в нескольких словах.

Добавлено через 37 минут
Спасибо за подсказки. Врубился. Нужен класс сервлета типа
Java
1
2
3
4
5
6
7
8
9
10
public class HelloWorldServlet extends HttpServlet {
 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
 
        PrintWriter pw = resp.getWriter();
        pw.println("<H1>Hello, world! или Привет мир</H1>");
 
    }
}
В xml указать путь к нему. Далее вроде представляю...
Тогда еще вопрос. Зачем в этом случае jsp страницы? Можно обойтись и без них?
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 17:44
можно, но зачем обходиться без них? как минимум, вы получаете удобство. Кидайте на jsp свои параметры и он вам отрендерит ваш хтмл.
А так делать совсем плохо -
Цитата Сообщение от VlGuvin Посмотреть сообщение
pw.println("<H1>Hello, world! или Привет мир</H1>");
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
16.05.2017, 20:03  [ТС]
Пытаюсь запустить простейший сервлет в NetBeans.
1. Создал проект в котором автоматом создался файл index.jsp
2. Создал сервлет где поставил галку создавать настройки в xml файле
3. Запускаю приложение (GlassFish) - все запускается нормально.
4. Удаляю файл index.jsp - сервер пишет The requested resource () is not available.
По идее должен запуститься сервлет и написать в браузере Hello World
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package students.web;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 *
 * @author Vlad
 */
public class HelloWorldServlet extends HttpServlet {
 
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet HelloWorldServlet</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet HelloWorldServlet at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
    }
 
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
В чем тут хитрость?

Добавлено через 38 минут
A.. вместо страницы в xml прописывается сам сервлет.
Работает.
Остался вопрос по структуре.
1. По любому запросу от клиента (в простейшем случае) должен запускаться сервлет.
2. Сервлет дает возможность работать с request - получать URL URI и т. п.
3. request можно использовать в классе шаблонизаторе, который формирует страницы и их содержимое.

1. Как выводить страницы в браузер? Прямо из сервлета используя
Java
1
PrintWriter out = response.getWriter();
или есть другой путь?
2. Как заставить работать класс шаблонизатор? Создать объект внутри класса сервлета?
3. Если будут необходимы другие классы в приложении как их запускать в работу? Тоже создавать объекты внутри класса сервлета?
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.05.2017, 20:18
Цитата Сообщение от VlGuvin Посмотреть сообщение
1. Как выводить страницы в браузер? Прямо из сервлета используя
говорил же, используйте jsp
Цитата Сообщение от VlGuvin Посмотреть сообщение
2. Как заставить работать класс шаблонизатор? Создать объект внутри класса сервлета?
вы не знаете, как создать объект класса?
Цитата Сообщение от VlGuvin Посмотреть сообщение
. Если будут необходимы другие классы в приложении как их запускать в работу? Тоже создавать объекты внутри класса сервлета?
совет, поизучайте основы джавы)
1
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
17.05.2017, 11:06  [ТС]
Спасибо. В общем понятно.
Нет. С Java все впорядке. Kак создается объект и прочее - нет проблем. Писал для десктопа.
Пока не совсем понял про вывод в браузер. Если использовать jsp то каким образом. Подключать сервлет в jsp файле?
Если можно, поясните пожалуйста этот момент.

Добавлено через 12 часов 50 минут
Может, я и ошибаюсь, но работать непосредственно из сервлета тяжеловато. Для вывода страниц в браузер придется использовать метод doGet(), а в нем println(..). Не будет-ли проблем в этом случае с использованием в этом методе переменных и методов из других классов приложения?
Если не сложно можно коротко как правильно это делается. Запрашивать от клиента сам класс сервлета или jsp страницу. Если страницу то как подключать класс сервлета?

Добавлено через 1 час 35 минут
Да. Разобрался.
Подключить jsp можно так
Java
1
2
        RequestDispatcher dispatcher = request.getRequestDispatcher("pages/index.jsp");
        dispatcher.forward(request, response);
По ходу возникла странная проблема с созданием объектов других классов в классе сервлета
Java
1
2
3
public class ServletClass extends HttpServlet {
    
    MainClass mainClass = new MainClass();
Это сразу вызывает затык сервера с ответами типа
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type Exception report
 
message
 
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
 
exception
 
javax.servlet.ServletException: PWC1392: Error instantiating servlet class servlet.ServletClass
root cause
 
com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class: class servlet.ServletClass
root cause
 
java.lang.reflect.InvocationTargetException
root cause
 
java.lang.StackOverflowError
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1.2.2 logs.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.05.2017, 11:28
гуглом научись пользоваться
http://www.journaldev.com/2114... p-tutorial
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
17.05.2017, 11:59  [ТС]
Разобрался. Работает. Но опять один момент.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ServletClass extends HttpServlet {
 
    MainClass mainClass = new MainClass();
    String varHtml = "";
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        String varTextA = "Hello World!";
        request.setAttribute("textA", varTextA);
        String varTextB = "It JSP.";
        request.setAttribute("textB", varTextB);
        try {
            varHtml = mainClass.templ(request);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ServletClass.class.getName()).log(Level.SEVERE, null, ex);
        } catch (URISyntaxException ex) {
            Logger.getLogger(ServletClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        request.setAttribute("textHtml", varHtml);
...
Надеюсь параметр request попадет в метод templ(request); Тут немного неуверен...
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
17.05.2017, 12:07
Цитата Сообщение от VlGuvin Посмотреть сообщение
Надеюсь параметр request попадет в метод templ(request);
а как может быть иначе?)
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
17.05.2017, 14:38  [ТС]
С сервлетом в общих чертах понятно.
Остался еще один важный момент - переходы по страницам.
Если в настройках xml указать в качестве welcom file клас сервлета то вызываться он будет только при запросе собственно домена. При переходе на другую страницу класс сервлета уже не сработает, а за ним не будет работать и шаблонизатор и пр.
Как в этом случае поступать или как это правильно делается, так чтобы класс сервлета вызывался при каждом разном запросе?
Может я пропустил что-то в настройках xml?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2017, 14:38
Помогаю со студенческими работами здесь

Как из asp получить полный URL и часть URL от вопросительного знака?
Господа подскажите как из asp получить полный URL и часть URL от вопросительного знака. На Javascript это сделать очень просто - ...

Как получить URI на который переходит webBrowser?
Я авторизуюсь на сайте методом заполнения формы и клика в автоматическом режиме, как мне получить запрос который передает webBrowser при...

Как получить часть url return url
как получить часть url return url Привет всем! Вопрос от человека далекого от javaScript. у меня есть URL типа http://aaa.ru/?066 ...

Динамический URI или как прослушать 4680 адресов по HTTP
Доброго дня всем читающим эти строки! Небольшое предисловие: два месяца как начал изучение платформы .NET и С#. До этого около года...

Получить путь к каталогу из uri
Приветствую, string patch =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru