0

我正在使用模型/视图/控制器样式构建 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 中工作。

4

3 回答 3

1

您可以使用

request.setAttribute("attributeName",attributeValue);

在其他jsp文件中你可以使用getAttribute()这样的方法

request.getAttributeNames();
request.getAttribute("attributeName");
于 2012-04-13T08:04:34.020 回答
1

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

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

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

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

于 2012-04-14T00:18:22.083 回答
0

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

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

请注意,如果只需要访问触发该请求/响应处理的参数,您可以使用诸如${param.myParam}.

编辑

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

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

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

于 2012-04-13T07:42:10.547 回答