Java 在JSP页面中使用request.setAttribute

Java 在JSP页面中使用request.setAttribute,java,jakarta-ee,setattribute,request-object,Java,Jakarta Ee,Setattribute,Request Object,是否可以在JSP页面上使用request.setAttribute,然后在HTML提交上在Servlet中获得相同的请求属性?否。不幸的是,请求对象只有在页面完成加载后才可用-一旦加载完成,您将丢失其中的所有值,除非它们存储在某个位置 如果要通过请求持久化属性,则需要: 在表单中有隐藏的输入,例如。这将作为请求参数在servlet中可用 将它放在会话中(请参见request.getSession()——在JSP中,它可以简单地作为session) 我建议使用该会话,因为它更易于管理。如果错误,请

是否可以在JSP页面上使用
request.setAttribute
,然后在HTML提交上在
Servlet
中获得相同的请求属性?

否。不幸的是,请求对象只有在页面完成加载后才可用-一旦加载完成,您将丢失其中的所有值,除非它们存储在某个位置

如果要通过请求持久化属性,则需要:

  • 在表单中有隐藏的输入,例如
    。这将作为请求参数在servlet中可用
  • 将它放在会话中(请参见
    request.getSession()
    ——在JSP中,它可以简单地作为
    session

  • 我建议使用该会话,因为它更易于管理。

    如果错误,请更正我…我认为请求在连续页面之间确实存在

    假设您从第1页-->第2页-->第3页开始遍历

    您使用第1页中的setAttribute在请求对象中设置了一些值,您在第2页中使用getAttribute检索该值,然后如果您尝试在同一请求对象中再次设置某个值以在第3页检索该值,则它将无法为您提供空值“创建JSP的请求和提交JSP时生成的请求是完全不同的请求,放置在第一个请求上的任何属性在第二个请求上都不可用”

    我的意思是第2页中类似的内容失败了:

    在第1页的情况下,同样的事情也起作用,如:


    因此,我认为我需要继续Phill建议的两个选项中的任何一个。

    Phil Sacre的回答是正确的,但是会话不应该只用于地狱般的目的。您应该只将其用于真正需要在会话生命周期内存在的值,例如用户登录。人们过度使用会话是很常见的会话并遇到更多问题,尤其是在处理集合时,或者当用户返回到他们以前访问过的页面时,却发现他们的值仍然与上次访问的值相同。智能程序尽可能减少变量的范围,而坏程序使用会话的次数太多。

    我认为phil是正确的请求选项是正确的在页面加载之前可用。因此,如果我们想将值发送到另一个页面,我们希望在隐藏标记中或会话中设置,如果您只需要另一个页面上的值,而不需要超过该值,则隐藏标记是最佳选项,如果您当时在多个页面上需要该值,会话是比隐藏标记更好的选项。

    试一试

    request.getSession().setAttribute("SUBFAMILY", subFam);
    request.getSession().getAttribute("SUBFAMILY");
    

    如果希望请求持续存在,请尝试以下操作:

    示例:在JSP或servlet页面上

    request.getSession().setAttribute("SUBFAMILY", subFam);
    
    在任何接收页面上,使用以下行检索会话和数据:

    SubFamily subFam = (SubFamily)request.getSession().getAttribute("SUBFAMILY");
    

    不过,您可以使用pageContext属性执行此操作:

    在JSP中:

    <form action="Enter.do">
        <button type="SUBMIT" id="btnSubmit" name="btnSubmit">SUBMIT</button>
    </form>
    <% String s="opportunity";
    pageContext.setAttribute("opp", s, PageContext.APPLICATION_SCOPE); %>
    

    除了应用程序作用域之外,还有其他作用域,如会话作用域。应用程序作用域用于ServletContext属性。

    也许这并不不幸。JSP脚本是一种不好的做法。使用会话时要小心,它更容易管理,但有时会“昂贵”“就可扩展性而言。好吧,这样说吧——会话可能比你自己编写的任何东西都要好:)如果你在一个像样的应用程序服务器上,它可以执行复制等操作,并且你有存储选项(不仅仅是内存)。如果我们发送的东西很有价值,隐藏的标签不会引发安全问题吗。
    String s=(String) request.getServletContext().getAttribute("opp");