gpt4 book ai didi

java - 如何在 Struts Action 中获取容器管理的数据源对象

转载 作者:搜寻专家 更新时间:2023-11-01 03:20:20 25 4
gpt4 key购买 nike

我是 Struts 2 Framework 的新手。

我需要在 Struts Action 类中使用 DataSource 对象。我的平台是 Tomcat 8 (Servlet 3.1),我在 context.xml 中设置了 Resource。

我可以使用@Resource 注释在 servlet 中注入(inject)容器管理的数据源对象。

我试过这种方式。我创建一个 ServletContextListener 并在此监听器中注入(inject) DataSource。我在 contextInitialized 方法中将此数据源设置为应用程序范围对象。

@WebListener
public class ResourceListener implements ServletContextListener {

@Resource(name="jdbc/skill_db")
private DataSource ds;

public ResourceListener() { }

@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Start");
sce.getServletContext().setAttribute("Datasource", ds);
sce.getServletContext().setAttribute("dbConfigStream", sce.getServletContext().getResourceAsStream("/WEB-INF/database.properties"));
}

@Override
public void contextDestroyed(ServletContextEvent sce) { }

}

之后,我访问应用程序范围并从 Struts Action 方法获取此数据源。

public String welcome() {

Map<String, Object> application = ActionContext.getContext().getApplication();
DataSource ds = (DataSource) application.get("Datasource");
InputStream conf = (InputStream) application.get("dbConfigStream");

Model<Employee> empModel = new BaseModel<Employee>(Employee.class,
Employee::convert, ds, conf);
list = empModel.getAll();

return "welcome";
}

我的问题是:

  1. 我可以在结构操作对象中获取 DataSource 对象吗?
  2. 这是我在struts中尝试的正确方式吗?

最佳答案

我通过 Struts2-CDI 插件尝试了我的要求通过使用 CDI,我可以注入(inject)我的依赖项。

<强>1。我按如下方式编辑项目的 POM。

    <dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-cdi-plugin</artifactId>
<version>2.3.24</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.2.15.Final</version>
</dependency>

<强>2。当我使用 Tomcat 时,我需要将此代码添加到 context.xml 和 web.xml 以使用 CDI。

2.1 context.xml

<Resource name="BeanManager" auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory" />

2.2 web.xml

  <resource-env-ref>
<resource-env-ref-name>BeanManager</resource-env-ref-name>
<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>

<强>3。生产数据源

直接将 DataSource 对象和 ServletContext 注入(inject)到 ResourceProducer 类中。这样我就不需要监听器类来将 DataSource 设置为应用程序范围,也不需要间接访问 servlet 上下文对象。

使用 CDI 可以摆脱 Struts 的限制。

@ApplicationScoped
public class ResourceProducer {

@Resource(name="jdbc/skill_db")
private DataSource datasource;

@Inject
private ServletContext servletContext;


@Produces
@DbResourse
public DataSource getDatasource() {
return datasource;
}

@Produces
@DbConfiguration
public InputStream getConfiguration() {
return servletContext.getResourceAsStream("/WEB-INF/database.properties");
}

}

<强>4。在模型生产者处注入(inject)数据源

@Inject
@DbResourse
private DataSource ds;
@Inject
@DbConfiguration
private InputStream dbConfig;

@Produces
@DataModel(Employee.class)
public Model<Employee> getEmployeeModel() {
return new BaseModel<Employee>(Employee.class, Employee::convert, ds, dbConfig);
}

<强>5。在 Struts 2 Action 类中注入(inject)模型

@Inject
@DataModel(Employee.class)
private Model<Employee> empModel;

public String welcome() {

list = empModel.getAll();

return "welcome";
}

关于java - 如何在 Struts Action 中获取容器管理的数据源对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32266734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com