熟悉servlet中init()方法以及session的创建和获取的请进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熟悉servlet中init()方法以及session的创建和获取的请进相关的知识,希望对你有一定的参考价值。

我想在init()方法获取往session中调用.setAttribute(“arg0”, arg1)方法,也就是说往session中放东西,然后在任何的servlet中都能.getAttribute(“arg0”)获取到这值,请问如何实现。

如果你要在servlet的init方法中传递值给session,然后在cookie有效范围内使用session中保存的值,可以采用的方法是:首先把attribute放入到servletcontext中,然后在servlet的service或者doXXX方法中再把这些attribute放入到session中。在init方法中不能直接访问session。
步骤如下:
1、在init方法中调用servletconfig的getServletContext()方法,获得ServletContext对象。
2、调用ServletContext对象的setattribute方法放入值
3、在service或者doXXX方法中调用servlet的getServletContext方法,获得ServletContext对象
4、从ServletContext对象中查询需要的值,然后值放入到session中

这个场景通常是用于把web.xml文件中配置的参数放入到seesion中。
参考技术A request.setAttribute("key",request.getParameter("value"));//你要放的值value然后:request.getAttribute("key");

Servlet.init() 和 Filter.init() 调用顺序

【中文标题】Servlet.init() 和 Filter.init() 调用顺序【英文标题】:Servlet.init() and Filter.init() call sequence 【发布时间】:2011-02-23 18:46:02 【问题描述】:

在 java web 应用程序中调用 Servlet.init() 和 Filter.init() 方法的顺序是什么?哪个是第一个被调用的?是否所有的 Servlet.init() 方法都比任何 Filter.doFilter 方法都被调用过?

【问题讨论】:

【参考方案1】:

过滤器总是在 webapp 启动期间按照它们在web.xml 中定义的顺序进行初始化。

默认情况下,servlet 仅在其 url 模式的第一个 HTTP 请求期间初始化。但是您也可以使用 <load-on-startup> 条目将它们配置为在 webapp 启动期间进行初始化,您可以在其中指定它们的优先级。然后它们将按优先顺序加载。 例如

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>mypackage.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

如果有多个 servlet 具有相同的优先级顺序,则这些 servlet 的加载顺序是未指定的并且可能是任意的。然而,Servlet 以任何方式在过滤器初始化之后被初始化,但在过滤器调用之前

【讨论】:

如果我在 web.xml 中设置了 load-on-startup,我能确定这个 servlet 的 init() 在任何过滤器的 doFilter 之前被调用吗? 是的,我在其中进行了编辑。但这与 load-on-startup 无关。 @kukudas:不客气。这个相关的答案也可能会有所帮助:***.com/questions/3106452/… @BalusC:正如 Jan Gutvirth 指出的那样,过滤器初始化的顺序不依赖于 web.xml 中定义的顺序 - 在 Apache Tomcat 6.0.37 上测试 与@Kroky 相同的评论——请参阅下面的重要答案:***.com/a/16237835/385667【参考方案2】:
    对于所有过滤器:Filter.init() 对于&lt;load-on-startup&gt;web.xml 的所有servlet:Servlet.init() 对于请求的所有适用过滤器:Filter.doFilter() 如果适用的 servlet 尚未初始化:Servlet.init() 对于适用的 servlet:Servlet.service()

【讨论】:

这与 BalusC 的回答相矛盾,这将使您的 (4) 在 (3) 之前发生。 (2) 适用于在 web.xml 中具有启动时加载的 servlet。 (4) 用于在第一次请求 servlet 时初始化的 servlet。【参考方案3】:

附带说明 - 我在 tomcat (7.0.30) 上体验到 Filter.init() 方法以随机顺序运行(迭代 HashMap)。

【讨论】:

这应该是一条评论。 是的,我知道,但我无法发表评论,因为我没有足够的声誉。但我觉得值得一提的是,在这方面接受的答案似乎是错误的(即调用Filter.init()方法的顺序通常是未定义的)【参考方案4】:

小心。我已经目睹了 Filter.init() 和 Filter.doFilter() 在同一个实例上的并发调用。我仍然感到震惊,无法恢复。它的名字叫码头。

【讨论】:

以上是关于熟悉servlet中init()方法以及session的创建和获取的请进的主要内容,如果未能解决你的问题,请参考以下文章

Servlet生命周期

HTTP Servlet的生命周期

Servlet的生命周期

说一说Servlet 的生命周期

说一说Servlet的生命周期

Servlet.init() 和 Filter.init() 调用顺序