如何在Structs Action

时间:2015-08-28 08:36:07

标签: java servlets struts2

我是使用Struts 2 Framework的新手。

我需要在Struts Action Class中使用DataSource Object。 我的平台是Tomcat 8(Servlet 3.1),我在context.xml中设置了资源。

我可以使用@Resource注释在servlet中注入Container托管的DataSource对象。

我试过这样的方式。 我创建一个ServletContextListener并在此侦听器中注入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中尝试了正确的方法吗?

1 个答案:

答案 0 :(得分:2)

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

<强> 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注入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。在Model Producer中注入DataSource

@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 Class中注入模型

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

public String welcome() {

    list = empModel.getAll();

    return "welcome";
}