我在TestAction类中设置会话对象,当我试图在TestServlet中获取会话对象时,它返回null。请告诉我如何在Seam框架中将会话从动作类传递给servlet。
@Scope(ScopeType.EVENT)
@Name("testAction ")
public class TestAction {
public void setSessionObj(){
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
session.setAttribute("temp", "124563");
}
}
// Servlet从这里开始
public class TestServlet extends HttpServlet {
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
servletContext = servletConfig.getServletContext();
}
protected String doExecute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Session session = request.getSession(false);
String user1 = (String) session .getAttribute("temp");
}
}
以下是调试会话实例的观察
我检查了会话对象实例以防我正在进行操作和servlet,它们都是Session的不同实例。例如,实际操作是StandardSession [41CBDED6EBBBECEBA001A70555F51CA5],我在servlet中获得的是StandardSession [EACBDED6E34BECEB3401A70555F51CA5],我得到不同会话实例的任何原因
答案 0 :(得分:1)
不需要通过servlet中的FacesContext
访问会话属性。只需使用request.getSession()
即可获得会话。只要您的请求实际来自同一会话,就应该在servlet中提供会话属性。
答案 1 :(得分:-2)
我会使用一个代理对象,它通过CDI / Spring注入到JSF Managed Bean和servlet中。
此示例创建一个CDI Bean,它在整个过程中保持活动状态,只存储一个String。 Trough dependecy注入两个组件都可以访问它。
在META-INF资源文件夹
下创建一个空的bean.xml文件@Named
@ApplicationScoped
public class Container{
private String temp;
public Container(){
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getTemp() {
return temp;
}
}
@Scope(ScopeType.EVENT)
@Name("testAction ")
public class TestAction {
@Inject
Container container;
public void setSessionObj(){
container.setTemp("123456");
}
}
// Servlet从这里开始
public class TestServlet extends HttpServlet {
@Inject
Container container;
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
servletContext = servletConfig.getServletContext();
}
protected String doExecute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Session session = request.getSession(false);
String user1 = container.getTemp();
}
}