Jak inicializovat Servlet při uvedení do provozu s parametry?

hlasů
19

My můžeme psát argumentem konstruktor v Servletu? Pokud ano, jak můžete volat?

Položena 14/08/2009 v 05:45
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
5

Konstruktéři jsou objekty spravované aplikačním serverem.

Pro inicializaci, viz init () metoda.

Aktualizace:

Mohu použít konstruktor v mém servletu?

A: servlet je normální Java třídy, takže když nejsou k dispozici žádné vlastních konstruktérů, je implicitní výchozí konstruktor bez argumentů. Servlet kontejnery obvykle použít metodu Class.newInstance () k načtení servlety, takže musíte být opatrní, aby přidat výslovné výchozí konstruktor Přidáte-li non-výchozí konstruktor.

zdroj: http://www.codestyle.org/java/servlets/FAQ.shtml

Odpovězeno 14/08/2009 v 05:47
zdroj uživatelem

hlasů
26

My můžeme psát argumentem konstruktor v Servletu?

Ano, můžete, ale je to zbytečné, protože kontejner servletu jej nelze odvolávat.

Správný způsob, jak to udělat, je použít init()metodu:

@Override
public void init() throws ServletException {
    String foo = getInitParameter("foo");
    String bar = getServletContext().getInitParameter("bar");
    // ...
}

V tomto příkladu, getInitParameter("foo")vrátí hodnotu z <init-param>konkrétního <servlet>záznamu v web.xml, a getServletContext().getInitParameter("bar")vrátí hodnotu nezávisle <context-param>na web.xml.

Odpovězeno 14/08/2009 v 05:48
zdroj uživatelem

hlasů
5

Nemůžete. Servlet instance reflexně kontejnerem. Pokud servlet spec dovolili argumenty v konstruktoru, měli byste mít nějakou komplikovanou popisovač nasazení jako:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>MyServlet</servlet-class>
    <servlet-argument id="1" type="string">Test<servlet-argument>
    <servlet-argument id="2" type="int">10</servlet-argument>
    <load-on-startup>1</load-on-startup>
</servlet>

Myslím, že nikdo nechce, že.

Odpovězeno 14/08/2009 v 05:54
zdroj uživatelem

hlasů
21

Problém může být stav obecněji:

„Podle servlets (2.3) specifikace jsou servlety jsou vytvořena pomocí servlet motoru s odvoláním na no-Arg konstruktor. Jak mohu inicializovat servlet správně za předpokladu, že správná inicializace závisí na centrálním / globální / unikátní / konfigurace aplikace?“

Ve skutečnosti, můžete použít serlvets s konstruktérem a / nebo inicializovat jim jak se vám líbí. Nicméně, to vyžaduje trochu instalatérství.

Za předpokladu, že jste servlet s konstruktor s argumenty:

package org.gawi.example.servlets;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class SampleServlet extends HttpServlet
{
    private final String mMessage;

    public SampleServlet(String message)
    {
        mMessage = message;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/plain");
        response.getWriter().write(mMessage);
    }
}

První věc, kterou potřebujete, je jedinečný servlet whithin vaši žádost, říkejme ji InitializationServlet, vytvořit všechny požadované instance. Tyto případy se pak musí být vyvezen v servlet souvislosti bude získat další servletem (vysvětleno později). InitializationServlet může vypadat například takto:

package org.gawi.example.servlets;

import javax.servlet.*;
import javax.servlet.http.*;

public class InitializationServlet extends HttpServlet
{
    public void init() throws ServletException
    {
        SampleServlet servletA = new SampleServlet("this is servlet A");
        SampleServlet servletB = new SampleServlet("this is servlet B");
        SampleServlet servletC = new SampleServlet("this is servlet C");

        getServletContext().setAttribute("servletA", servletA);
        getServletContext().setAttribute("servletB", servletB);
        getServletContext().setAttribute("servletC", servletC);
    }
}

Vidíte, že jen init()byla poskytnuta metoda. Tento servlet je neobsluhuje žádný požadavek HTTP. Jeho jediným cílem je uložit servletu v ServletContext. Všimněte si, že byste mohli mít také použít tento servlet načíst konfiguraci aplikace. Takže to může fungovat jako webová aplikace vstupní bod, stejně jako main(String[] args)způsobu programu. To vám mohou připomínat ContextLoaderServlet z SpringSource.

Poslední kus je na DelegateServlet která bude účinně instance pomocí servlet kontejneru, bude pouze tento servlet předal veškeré relevantní způsob volání na zabalené servletu například:

package org.gawi.example.servlets;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class DelegateHttpServlet extends HttpServlet
{
    private static final String SERVLET_CONTEXT_KEY_INIT_PARAMETER = "servletContextKey";

    private HttpServlet mServlet;

    public void init(ServletConfig servletConfig) throws ServletException
    {
        super.init(servletConfig);
        locateServlet(servletConfig);
        mServlet.init(servletConfig);
    }

    private void locateServlet(ServletConfig servletConfig) throws ServletException
    {
        String servletContextAttributeName = servletConfig.getInitParameter(SERVLET_CONTEXT_KEY_INIT_PARAMETER);
        if (servletContextAttributeName == null)
        {
            throw new ServletException("Unable to find init parameter '" + SERVLET_CONTEXT_KEY_INIT_PARAMETER + "'");
        }

        Object object = servletConfig.getServletContext().getAttribute(servletContextAttributeName);

        if (object == null)
        {
            throw new ServletException("Unable to find " + servletContextAttributeName + " in servlet context.");
        }

        if (!(object instanceof HttpServlet))
        {
            throw new ServletException("Object is not an instance of"
                                       + HttpServlet.class.getName()
                                       + ".  Class is "
                                       + object.getClass().getName()
                                       + ".");
        }

        mServlet = (HttpServlet) object;
    }

    public void destroy()
    {
        mServlet.destroy();
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
    {
        mServlet.service(req, res);
    }

}

Během jeho inicializace, bude DelegateServlet look-up cílový servlet v servlet souvislosti s použitím servletContextKeyservletu počáteční argument.

Web.xml pro takové aplikace může vypadat takhle:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <display-name>Example</display-name>
  <description>Example web showing handling of servlets w/ constructors.</description>


  <servlet>
    <servlet-name>Initialization</servlet-name>
    <servlet-class>org.gawi.example.servlets.InitializationServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>A</servlet-name>
    <servlet-class>org.gawi.example.servlets.DelegateHttpServlet</servlet-class>

    <init-param>
      <param-name>servletContextKey</param-name>
      <param-value>servletA</param-value>
    </init-param>

    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>B</servlet-name>
    <servlet-class>org.gawi.example.servlets.DelegateHttpServlet</servlet-class>

    <init-param>
      <param-name>servletContextKey</param-name>
      <param-value>servletB</param-value>
    </init-param>

    <load-on-startup>3</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>C</servlet-name>
    <servlet-class>org.gawi.example.servlets.DelegateHttpServlet</servlet-class>

    <init-param>
      <param-name>servletContextKey</param-name>
      <param-value>servletC</param-value>
    </init-param>

    <load-on-startup>4</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>A</servlet-name>
    <url-pattern>/servlet/a</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>B</servlet-name>
    <url-pattern>/servlet/b</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>C</servlet-name>
    <url-pattern>/servlet/c</url-pattern>
  </servlet-mapping>

  <session-config>
    <session-timeout>5</session-timeout>
  </session-config>
</web-app>

Ujistěte se, že nejprve načíst InitializationServlet pomocí nízkou <load-on-startup>hodnotu.

Výhodou tohoto přístupu je, že HttpServletobjekty mohou být zpracovány jako jakýkoli jiný pravidelný Java objektu nebo fazole. Z toho důvodu, že poskytuje lepší kontrolu nad inicializace: ne složitější věci dělat v init()metodě, ani špinavá servlet manipulace init-arg.

Odpovězeno 17/04/2010 v 20:00
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more