@WebServlet с параметрами init из xml

Я проверяю новые аннотации для веб- сервлетов, но что я не понимаю, как вы можете передать начальные параметры (init-param) из легко модифицируемого местоположения. Да я нашел аннотацию @WebInitParam, но это означает, что вы должны записать значение в код, который, я думаю, упускает смысл для легкого изменения в web.xml.

Так что здесь происходит? Не использовать @WebServlet в таком случае?

2 ответа

Решение

Интересный вариант использования, и оказывается, что вы можете (моя конфигурация: JBoss 7.1.1):

Servlet:

@WebServlet(name="fooServlet", urlPatterns="/foo")
public class FooServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String flip = getInitParameter("flip");
        resp.getWriter().println("<html>" +
            "<head><title>" + getServletName() + "</title></head>" +
            "<body>From " + getServletName() + ": " + flip + "</body>" +
            "</html>"
        );
    }
}

внутри web.xml (обратите внимание, что имя такое же, и нет <servlet-class> уточняется):

<servlet>
    <servlet-name>fooServlet</servlet-name>
    <init-param>
        <param-name>flip</param-name>
        <param-value>flop</param-value>
    </init-param>
</servlet>

Значение flip = getInitParameter("flip") установлен в flopкак указано в web.xml!


Кстати, мне было интересно, это особенность JBoss или стандартная. Это стандарт, см. Спецификацию Servlet 3.0, глава 8.2.1 "Модульность web.xml".

Цель аннотаций - действительно позволить вам принимать параметры более гибко (даже если ваши параметры будут постоянными значениями).

Если вам нужны постоянные значения для ваших параметров, вы можете определить их где-нибудь, а затем создать URL-адрес, включающий ваши значения в строку запроса. Затем вы можете использовать этот URL, чтобы сделать HTTP-запрос к вашей службе. Например, вы можете создать URL, который выглядит следующим образом:

[hostname]/my-service/api?myParameter1=myValue1&myParameter2=myValue2

Затем вы можете использовать этот URL, чтобы сделать GET запрос к вашему сервису, который бы выглядел так:

@WebServlet(
        name = "MyServletName",
        description = "MyDescription",
        urlPatterns = {"/my-service/api"},
        initParams={
            @WebInitParam(name="myParameter1", value="Not provided"),
            @WebInitParam(name="myParameter2", value="Not provided")
        }
    )
public class MyServlet extends HttpServlet {


    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException 
    {

      String parameter1 = request.getParameter("myParameter1");   
      String parameter2 = request.getParameter("myParameter1");

...

@WebInitParam используется только для определения значений параметров по умолчанию, если значения для этих параметров не указаны. Таким образом, если у вас есть константы, которые вы используете для создания URL-адреса, который затем используете для создания HTTP-запроса, вы можете достичь того, что ищете.

Да, ты можешь.

В вашем файле констант

public static String SOME_STRING= "stringVal";

А затем импортировать его в сервлет

import static something.Constants.SOME_STRING;

@WebInitParam(name=SOME_STRING ,.....)

Теперь вы меняете только Constants для всех ваших потребностей.

Другие вопросы по тегам