【问题标题】:JSP Interview, how to pass data from Servlet to JSP?JSP面试,如何将数据从Servlet传递到JSP?
【发布时间】:2016-06-11 13:33:04
【问题描述】:

我在书面面试中无法回答这两个问题,大家可以帮帮我吗?

问题1)假设你希望一个Servlet向一个JSP页面发送持久化数据,这样不同的用户得到不同的数据,下面哪个句子是正确的?

--a) 可以使用指令:request.getSession().setAttribute(E,F); JSP 页面将使用带有 scope="page" 和 id="E" 的操作 jsp:useBean 读取信息。

--b) 可以使用指令:request.getSession().setAttribute(E,F); JSP 页面将使用带有 scope="session" 和 id="E" 的操作 jsp:useBean 读取信息。

我认为 b) 可能是正确的答案,但我不确定我是否完全理解“持久数据”的含义..

问题 2) 如果 servlet 将 bean 发送到 JSP 页面,则在 JSP 页面内对 bean 所做的可能更改对于将来访问该 bean 的其他 JSP 页面或 servlet 将始终可见。对还是错?

我猜这是错误的,但我无法得到很好的解释..

提前谢谢大家!

【问题讨论】:

    标签: jsp servlets javabeans


    【解决方案1】:

    问题1:以上都不是。没有理由将 bean 存储在会话属性中。它应该存储在请求属性中。并且视图根本不应该使用 jsp:useBean 。这就是 17 年前的做法。应改为使用 JSP EL。但是当然,尝试在页面范围内查找 bean 是行不通的,因为它已存储在会话范围内。

    问题 2:首先,JSP 不应该修改它从 servlet 接收到的 bean。 JSP 是一个视图,应该显示它从控制器接收到的模型。不是要修改它。即使它确实修改了 bean,也完全取决于 bean 的作用域。如果 bean 已由 servlet 创建、存储在请求属性中并传递给 JSP,那么它对任何其他组件都是不可见的,并且一旦处理了请求就可以进行 GC。如果 servlet 将单例传递给多个页面,那么所有页面都将获得相同的单例对象,因此更改对所有 JSP 都是可见的(假设正确使用了同步)。

    坦率地说,这些问题更多地是关于雇主的,而不是关于你的答案:雇主似乎并不了解他在做什么,并且使用它的工具,就好像自 1999 年以来没有任何改变一样。

    【讨论】:

      【解决方案2】:

      对于问题 1: 指令:request.getSession().setAttribute(E,F); 这是会话范围,属性是在会话中设置的,所以正确答案是 B 我认为持久化数据意味着这个数据是持久的,只要会话

      【讨论】: