@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
для всех ваших потребностей.