如何在代码中的任何位置使用变量?

时间:2016-05-20 09:11:08

标签: java java-ee

在Java EE中,如何在代码中的任何位置使用变量而不将其作为参数传递?

类似于公共静态变量的东西......但是静态变量对于所有请求总是相同的......那么"静态变量"变量但是对于单个请求?

有可能吗?

这是一个小例子:

我有:

protected void doGet (...)
{
    Model m = Model.GetById (...);
}

public class Model
{
    private String descrition;
    private Market market;
    private List<SparePart> spareParts;

    public Model GetById ()
    {
        Model m = new Model ();
        // get info from db using the language
        this.market = Market.GetById (...);
        this.spareParts = SparePart.GetByModel (m);
    }
}
public class SparePart
{
    private String description;

    public List<SparePart> GetByModel (Model mo)
    {
        // get info from db using the language
    }
}

public class Market
{
    private String descrition;

    public Market GetById (...)
    {
        // get info from db using the language
    }
}

对数据库进行查询并使用客户端语言检索信息...如何设置语言变量,以便我不必将其传递给使用它的方法?

anguage变量只是一个例子,它可能与其他变量一起发生

3 个答案:

答案 0 :(得分:0)

您可以在ServletRequest对象上设置和获取属性。

request.setAttribute("someName", someObject);

Object someObject = request.getAttribute("someName");

请参阅javadoc here

或者,您可以使用CDI(或其他DI框架)并定义一个或多个@RequestScoped对象,然后在您需要的位置@Inject。{/ p>

答案 1 :(得分:0)

有十几种方法可以在JaveEE应用程序中通过执行流传递数据。假设您需要在一个应用程序边界内传递数据。

  • 当然,您可以使用公共静态最终常量。
  • 您可以使用公共静态变量,但要考虑EE 环境极其多线程。所以使用原子包装器 (AtomicInteger等)。
  • 您可以使用producers
  • 单个请求范围(http(rest) - &gt; interseptor(s) - &gt; bean(s) - &GT;响应)你可以使用ThreadLocal
  • 当然你可以使用有状态或单一的bean你可以使用CDI 事件
  • 如果您使用的是Payara Server(目前只有JCache规范 预览)您可以使用JCache在任何内容之间共享您的数据 应用程序或沿着集群

如果您需要在服务器之间共享数据,则可以在@Remote接口上公开业务方法,或者使用JMX共享/发布/使用。

具体选择应取决于您的App业务逻辑。

答案 2 :(得分:0)

虽然没有传递参数首先不是一个好主意,如果你必须&#39; MUST&#39;找到一个解决方案,如果它符合您的设计,那么使用内部类怎么样?这样您就可以将类变量声明为非静态变量,并且始终可以从内部类中访问它。