Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在seam框架中将会话值从操作传递到servlet_Java_Jsf_Servlets_Seam - Fatal编程技术网

Java 在seam框架中将会话值从操作传递到servlet

Java 在seam框架中将会话值从操作传递到servlet,java,jsf,servlets,seam,Java,Jsf,Servlets,Seam,我在TestAction类中设置会话对象,当我试图在TestServlet中获取会话对象时,它返回null。请告诉我如何在Seam框架中将会话从action类传递到servlet @Scope(ScopeType.EVENT) @Name("testAction ") public class TestAction { public void setSessionObj(){ FacesContext facesContext = FacesContext.get

我在TestAction类中设置会话对象,当我试图在TestServlet中获取会话对象时,它返回null。请告诉我如何在Seam框架中将会话从action类传递到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");
        }
    }
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();
    }
}
下面是调试会话实例的观察结果


我检查了会话对象实例,以防我在操作和servlet中得到什么,它们都是会话的不同实例。例如,正在运行的实例是StandardSession[41CBDED6EBBBECEB001A7055F51CA5],而我在servlet中得到的是StandardSession[eACBDE6E34BECEB3401A7055F51CA5],任何我得到不同会话实例的原因都不应该需要通过servlet中的
FacesContext
访问会话属性。只需使用
request.getSession()
获取会话。只要您的请求实际上来自同一个会话,会话属性就应该在servlet中可用。

我将使用一个代理对象,该对象通过CDI/Spring注入JSF托管Bean和servlet

这个例子创建了一个CDIBean,它在整个过程中保持活动状态,只存储一个字符串。槽依赖注入两个组件都可以访问它

在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 {

        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");
        }
    }
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();
    }
}

request.getSession()怎么样?您调用servlet的具体方式如何?我也尝试过使用request.getSession,它给我空值,当我在action和servlet中检查对象名时,它们都是会话的不同实例。例如,正在运行的实例是StandardSession[41CBDED6EBBBECEB001A7055F51CA5],我在servlet中得到的是StandardSession[eACBDE6E34BECEB3401A7055F51CA5],如果它们具有不同的会话ID,则它们不是同一个会话,因此它们将无法看到其他会话属性,不管你尝试什么。是的,这就是我的问题,为什么他们有不同的会话ID,当请求在同一个会话上发出时,那么他们就不是在同一个会话上发出的。你能提供一个示例吗?坏建议。这将在应用程序的所有访问者/用户之间共享。