这个技术是什么意思呢?

就是说CDI可以注入一些容器自带的东西。比如强大的HttpServletRequest.

试想一下,如果CDI不能注入系统自带的资源,比如JPA持久化上下文,那么CDI技术有何意义?现在的web项目大都是要操作数据库的。

但是JPA的持久化上下文,它本身是用JNDI进行管理的。

我先写个EJB自动注入HttpServletRequest的例子。至于CDI的例子也一样。

package cdibeans;
 
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
 
@Stateless
public class HelloEjb {
 
	@Inject
	private HttpServletRequest request;
	public void hello(){
		request.setAttribute("greeting", "hello world!");
	}
}

接下来就是servlet的代码

package cdibeans;
 
import java.io.IOException;
 
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/hello.html")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@EJB
	private HelloEjb ejb;
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ejb.hello();
		req.getRequestDispatcher("/hello.jsp").forward(req, resp);;
	}
}
附带jsp 的代码

<html>
	<body>==${greeting}==</body>
</html>

浏览器访问效果。

 

那么除了request,还可以注入什么?

HttpSession

ServletContext

可以使用@Resource注解,采用JNDI方式注入的有:

UserTransaction

Principal

Validator

ValidatorFactory

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐