【问题标题】:jsp:useBean call a specific method in a classjsp:useBean 调用类中的特定方法
【发布时间】:2014-01-21 12:53:25
【问题描述】:

如何使用该标签调用类中的特定方法?

<jsp:useBean id="user" scope="??" class="com.example.User" type="com.example.User" />

【问题讨论】:

  • 使用那个标签?你没有。您将 bean 放在 Java 代码的范围内并使用 JSP EL。
  • Java:request.setAttribute("foo", new User()),JSP:${foo.someMethod()} 给予或接受。有关执行此操作的多种方法,请参阅“在 JSP 中调用 bean 方法”的无数答案中的任何一个。不知道在单个控制器中拥有多个方法/JSP 与它有什么关系。

标签: java jsp jstl el


【解决方案1】:

假设您的 bean 用户有一个名为 getName() 的方法

<jsp:useBean id="user" scope="request" class="com.example.User" />
// ...
<h1>Hello <jsp:getProperty name="user" property="name" /></h1>

范围可以是 request 以外的其他内容:取决于您想要什么(会话、页面等)


编辑:您的第二个问题是关于在您的 jsp 中调用业务方法

事实上,您不应该在您的 JSP 中调用业务方法。您的 JSP 页面应该只显示静态(html 等)和动态(例如 bean)内容。如果您遵循 MVC 模式,则业务工作将委托给 servlet。您的 JSP 只是简单的视图(读取 bean 的属性)并且被禁止(在 WEB-INF 目录中)。

对于您的 JSP 页面,请执行以下操作:

  1. html 表单的操作是您的 servlet 控制器(方法 POST)
  2. 添加隐藏输入以帮助 servlet 识别要做什么:<input type="hidden" name="action" value="update" /><input type="hidden" name="action" value="register" />

您还可以显示动态内容(bean)。为此,您应该考虑使用 JSTL。
示例(servlet 在请求范围内发送一个 Movie bean 的 ArrayList):

<c:forEach items="${requestScope.results}" var="movie">
   // ${movie.title}
   // etc
</c:forEach>

对于您的 servlet 控制器,请执行以下操作:

doPost 方法中(因为我们在 html 表单中使用 POST 方法),您可以根据收到的操作调度业务逻辑:request.getParameter("action")

如果action是update,那么我们执行更新业务逻辑。
如果action是register,那么我们执行注册业务逻辑。
等等……

现在,我们可以在请求范围内存储一些数据以与 jsp 页面进行通信:

ArrayList<Movie> results = new ArrayList<Movie>();
results.add(new Movie(...));
// etc...
request.setAttribute("results", results);

最后,发送数据并显示jsp:

request.getRequestDispatcher("/WEB-INF/update.jsp").forward(request, response);

web.xml 示例(将 servlet 映射为欢迎文件 index.jsp)

<servlet>
    <servlet-name>Search</servlet-name>
    <servlet-class>Servlets.Search</servlet-class>
</servlet>
<servlet>
    <servlet-name>Register</servlet-name>
    <servlet-class>Servlets.Register</servlet-class>
</servlet>
<servlet>
    <servlet-name>Update</servlet-name>
    <servlet-class>Servlets.Update</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Search</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Register</servlet-name>
    <url-pattern>/Register.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Update</servlet-name>
    <url-pattern>/Update.do</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

【讨论】:

  • @ThreaT :您的编辑被拒绝,因为您完全替换了答案的原始内容。如果您认为它对其他用户有用,我建议添加您自己的答案,其中包含您的最终实现。
  • @PeterR.Bloomfield:不,因为我使用的答案与这个答案完全相同,我只是以不同的顺序显示它。如果在决定之前阅读代码,他们会注意到这一点。
  • 我看到了你的编辑。这似乎是我的答案的一个很好的实现,除了在你的 servlet 中:也许你应该考虑在 bean 中而不是在 servlet 本身中使用业务方法。无论如何,您似乎无法编辑我的答案。但实际上,您不必这样做。我给了你一个关于如何做的全局想法。如果我的回答对您有帮助,也许您应该将其标记为已解决
【解决方案2】:
<jsp:useBean id="user" scope="request" class="com.example.User" type="com.example.User" />
<jsp:setProperty name="user" property="*" />
<c:set var="saveStatus" value="${user.save()}" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2012-08-04
    • 2017-02-20
    相关资源
    最近更新 更多