【问题标题】:How to pass arguments to .jsp file when using javax.servlet.RequestDispatcher.include()?使用 javax.servlet.RequestDispatcher.include() 时如何将参数传递给 .jsp 文件?
【发布时间】:2012-04-25 13:55:34
【问题描述】:

我正在使用模型/视图/控制器样式来构建 Web 应用程序,方法是将传入的 HttpRequest 路由到用 Java 编写的控制器 Servlet,然后当 Servlet 完成时,让它使用 .jsp 文件渲染回视图。 (这非常符合 Rails 风格。)

这样做需要在 Controller Servlet 的末尾有这样一行:

getServletContext().getRequestDispatcher("/Bar.jsp").include(req, res);

主要问题是我想将参数传递给 Bar.jsp,就好像它是我正在调用的函数一样。如果这不可能,我最终会在 Bar.jsp 的顶部放置大量 Java,以找出 Bar.jsp 需要呈现自己的所有内容,这相当难看。

其他 web 框架提供了一种方法来做到这一点,所以似乎必须有一种方法来使用 Servlet 来做到这一点。特别是我正在使用 Java Google App Engine。

【问题讨论】:

  • 不能将JSP页面作为函数调用,因为初始化和实例化的方式是由Servlet Container完成的。您可以做的是包含从 JSP 生成的响应,而不是作为方法。除了在 JSP 中创建少数成员引用之外,如果您调用了 JSP,我看不到任何挑战。
  • 您的回复对我来说没有任何意义。我希望 .jsp 文件能够以某种方式访问​​ Servlet 创建的一些 Java 对象。
  • 您可以按照 Alonso Dominguez 的建议使用 POJO,创建公共 bean 对象并作为参数传递。
  • 只是好奇,大多数框架都使用前向视图。你真的有一些包含你的包含的视图内容吗?

标签: java google-app-engine servlets


【解决方案1】:

正如其中一个 cmets 所说,您不能将参数传递给不同的 JSP(在同一个请求中),就好像它是一个函数一样。

您能做的最好的事情是创建一个(或多个)Java bean,将参数及其属性封装起来。然后,在调用 JSP 之前将这些 bean 添加为请求属性。在 JSP 中,您可以使用 EL 表达式(如 ${myBean.myParameter})来引用这些 bean 保存的值,而无需在 JSP 中添加额外的 java 代码。这就是常见的 Java MVC 框架是如何做到的。

请注意,如果只需要访问触发该请求/响应处理的参数,您可以使用 ${param.myParam} 之类的表达式访问它们。

编辑

很抱歉之前没有添加任何链接。 EL 表达式是...包含在符号 ${} 之间的表达式(或 #{} - 但要区分大小写,因为它们是不同类型的 EL 表达式)。 El 表达式允许 JSP 开发人员访问存储在请求、会话或应用程序上下文中的数据(其他框架可能会在该基本集合中添加更多上下文),而无需 Java 代码。在编写 JSP 时,我们必须避免使用<% ... %>,而只使用旨在将输出呈现到视图而不是繁重的数据处理的代码。请点击best practices 的链接以获取有关它的更多背景信息。

主要有一大群 EL 表达式,我无法在 SO 帖子中解释所有内容,但我建议您关注 this link

向请求或任何其他范围添加变量或对象(java bean)相当简单。要将 bean 添加到您所做的请求中:request.setAttribute("myBeanName", myBean);。与其他上下文类似的东西。 Java EE tutorial 会比我解释得更好,之后你应该能够理解 JavaEE 的特性。

【讨论】:

  • 能否请您链接到一些文档?如何“将这些 bean 添加为请求属性”?什么是 EL 表达式,我可以在 .jsp 中的 (Java) 中还是仅在 之外(例如在 HTML 中)引用它?
【解决方案2】:

你可以使用

request.setAttribute("attributeName",attributeValue);

在其他jsp文件中你可以像这样使用methodgetAttribute()

request.getAttributeNames();
request.getAttribute("attributeName");

【讨论】:

    【解决方案3】:

    这个页面说的很好,也解决了参数和属性的区别:http://www.xyzws.com/Servletfaq/what-is-the-difference-between-the-request-attribute-and-request-parameter/1

    请求属性(更正确地称为“请求范围的变量”) 是明确放置在请求上的任何类型的对象 对象通过调用 setAttribute() 方法。它们被检索到 通过 getAttribute() 方法和在 JSP 页面中使用的 Java 代码 表达式语言参考。始终使用 request.getAttribute() 来 获取添加到服务器端请求范围的对象,即使用 request.setAttribute().

    属性是对象,可以放在请求、会话或 上下文对象。因为它们可以是任何对象,而不仅仅是一个字符串, 它们更加灵活。您还可以以编程方式设置属性 并稍后检索它们。这在 MVC 模式中非常有用。为了 例如,您想在一个 jsp/servlet 中从数据库中获取值,并且 在另一个jsp中显示它们。现在你有填充数据的结果集 准备好 servlet 然后你使用 setAttribute 方法并发送这个 结果集到另一个jsp,可以通过使用提取它 getAttribute 方法。

    一旦 servlet 收到请求,它可以添加额外的属性,然后 将请求转发到另一个 servlet 进行处理。属性 允许 servlet 相互通信。

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      相关资源
      最近更新 更多