来自xml的带有init参数的@WebServlet

时间:2013-09-26 08:35:58

标签: java servlets web.xml init-parameters

我正在检查web servlets 的新注释,但我不明白如何从容易修改的位置传递初始参数(init-param)。是的,我找到了注释@WebInitParam,但这意味着你必须在代码中写入值,我猜想错过了在web.xml中轻松更改的重点。

所以这里有什么交易?在这种情况下不要使用@WebServlet吗?

3 个答案:

答案 0 :(得分:5)

一个有趣的用例,事实证明你可以(我的配置: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 specification,第8.2.1章“web.xml的模块化”。

答案 1 :(得分:0)

注释的目的实际上是让您更灵活地接受参数(即使您的参数将是常数值)。

如果您需要参数的常量值,则可以在某个地方定义它们,然后构造一个在查询字符串中包含值的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请求,则可以实现所需的内容。

答案 2 :(得分:-2)

是的,你可以。

在你的常量文件

public static String SOME_STRING= "stringVal";

然后在servlet中导入

import static something.Constants.SOME_STRING;

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

现在您只需更改Constants即可满足您的所有需求。