【问题标题】:@WebServlet with init parameters from xml@WebServlet 带有来自 xml 的初始化参数
【发布时间】:2013-10-02 03:02:12
【问题描述】:

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

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

【问题讨论】:

  • 您是在询问 在网络应用程序启动后对 web.xml 所做的更改是否对 servlet 可见?
  • John O:不,再读一遍q。

标签: java servlets web.xml init-parameters


【解决方案1】:

注解的意义在于让你更灵活地接受参数(即使你的参数是常量值)。

如果您需要参数的常量值,您可以在某处定义这些值,然后构造一个 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】:

    一个有趣的用例,事实证明你可以(我的配置:JBoss 7.1.1):

    小服务程序:

    @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里面(注意name是一样的,没有指定&lt;servlet-class&gt;):

    <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 的模块化”。

    【讨论】:

    • 我很困惑 - @WebServlet 不应该取代对 web.xml 的需求吗?我不确定这个用例实际上有多有效
    【解决方案3】:

    是的,你可以。

    在你的常量文件中

    public static String SOME_STRING= "stringVal";
    

    然后在servlet中导入

    import static something.Constants.SOME_STRING;
    
    @WebInitParam(name=SOME_STRING ,.....)
    

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

    【讨论】:

    • 可以动态加载 SOME_STRING 吗? IE。不是最终的?
    • 我粘贴了我的。您可以通过删除 final 修饰符来分配它们。我所做的是我有一个配置 xml,我在部署时使用了一个 servlet 它通过在启动时指定负载来运行。在里面所有领域都在增加。
    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2020-02-09
    • 2015-02-25
    • 2012-05-22
    • 2015-01-20
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多