Динамическое отображение URL-адресов для разных сервлетов в tomcat [duplicate]

ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.

function* myGenerator() {
    const callback = yield;
    let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
    console.log("response is:", response);

    // examples of other things you can do
    yield setTimeout(callback, 1000);
    console.log("it delayed for 1000ms");
    while (response.statusText === "error") {
        [response] = yield* anotherGenerator();
    }
}

Для запуска вышеуказанного кода вы делаете это:

const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function

Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.

Обратный вызов ...args завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :

const [err, data] = yield fs.readFile(filePath, "utf-8", callback);

25
задан BalusC 21 January 2015 в 14:00
поделиться

6 ответов

В API-интерфейсе Servlet API не поддерживается шаблон подстановки шаблона URL * в середине отображения. Это разрешает только подстановочный символ * в конце отображения, например /prefix/* или в начале отображения, например *.suffix.

При стандартном разрешенном синтаксисе шаблона URL ваш лучший выбор для отображения его на /xyz/* и извлечения информации о пути с помощью HttpServletRequest#getPathInfo() .

Итак, с учетом <url-pattern>/xyz/*</url-pattern>, вот пример базового запуска, как извлечь информацию о пути, ошибки null и указатель массива из пределов проверки опущены:

String pathInfo = request.getPathInfo(); // /{value}/test
String[] pathParts = pathInfo.split("/");
String part1 = pathParts[1]; // {value}
String part2 = pathParts[2]; // test
// ...

Если вы хотите более тонкого контроля, как это возможно, с помощью Apache HTTPD mod_rewrite, тогда вы можете посмотреть на фильтр перезаписи URL-адреса Tuckey .

42
ответ дан BalusC 28 August 2018 в 15:58
поделиться

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

@Path("/xyz/{value}/test")
public class User { 

    public String doSomething(@PathParam("value") final String value) { ... }

}

Или:

@Path("/xyz/{value}")
public class User { 

    @Path("test")
    public String doTest(@PathParam("value") final String value) { ... }

}

(Связано с: https://stackoverflow.com/a/8303767/843093 .)

7
ответ дан Community 28 August 2018 в 15:58
поделиться

Он поддерживает отображение этого URL-адреса; но не предлагает никакой проверки.

В вашем веб-xml вы могли бы это сделать ....

/xyz/*

Но это не гарантирует, что конечный test присутствует и что это последний элемент. Если вы ищете что-то более сложное, вы должны попробовать urlrewritefilter.

http://code.google.com/p/urlrewritefilter/

3
ответ дан Dave 28 August 2018 в 15:58
поделиться

Как указано выше, базовые сервлеты не поддерживают шаблоны, как вы указали в своем вопросе. Spring MVC поддерживает шаблоны. Здесь является ссылкой на соответствующий раздел в справочном документе Spring .

0
ответ дан DwB 28 August 2018 в 15:58
поделиться

Вы не должны делать это в web.xml, а можете указать каждый запрос на свой фильтр (Patternfilter) и можете проверить URL

package com.inventwheel.filter;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class PatternFilter
 */
@WebFilter("/*")
public class PatternFilter implements Filter {

    /**
     * Default constructor. 
     */
    public PatternFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            String servletPath = ((HttpServletRequest)request).getServletPath();
            String requestURI = ((HttpServletRequest)request).getRequestURI();
            Pattern pattern = Pattern.compile(".*"+servletPath+"/(.*)");
            Matcher matcher = pattern.matcher(requestURI);
            if (matcher.matches())
            {
            String param = matcher.group(1);
            // do stuff with param here..
            }

        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}
0
ответ дан Sanjay Kumar 28 August 2018 в 15:58
поделиться

Вы можете использовать эту библиотеку: http://zerh.github.io/ServletIO/ , чтобы вы могли конвертировать ваши сервлеты в контроллеры MVC и использовать красивые URL-адреса

-2
ответ дан zerh 28 August 2018 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: