Java 使用servlet的正确方法是什么?

Java 使用servlet的正确方法是什么?,java,jsp,forms,servlets,ejb-3.0,Java,Jsp,Forms,Servlets,Ejb 3.0,我在学习EJB3 我有一个会话bean,它提供创建/更新客户帐户的服务 此会话bean提供以下服务: public void addCustomer(Customer c); public void updateCustomer(Customer c); 理想情况下,我希望有一个servlet:CustomerServlet,它将调用上面列出的会话bean 问题是我有两个jsp:UpdateAccount.jsp和CreateAccount.jsp。这两个JSP都有一个带有方法POST和操作“

我在学习EJB3

我有一个会话bean,它提供创建/更新客户帐户的服务

此会话bean提供以下服务:

public void addCustomer(Customer c);
public void updateCustomer(Customer c);
理想情况下,我希望有一个servlet:CustomerServlet,它将调用上面列出的会话bean

问题是我有两个jsp:UpdateAccount.jsp和CreateAccount.jsp。这两个JSP都有一个带有方法POST和操作“CustomerServlet”的表单

如何在客户servlet中区分应该执行哪些操作:createAccount还是updateAccount

我想另一种选择是为每个操作使用一个单独的servlet


谢谢你

JSPServlet,只是以不同的源代码形式,没有理由将发布到不同的Servlet,你可以将发布到同一个JSP。

我不确定这方面的最佳实践,但我有一些建议可能奏效:

  • 如果使用提交按钮提交表单,则可以根据参数值区分请求。因此,如果您的按钮具有值
    Update
    Create
    ,并被命名为
    account submit
    ,那么通过检查
    request.getParameter('account-submit')
    获得的值,您将能够知道单击哪个按钮生成此请求。如果以不同的方式命名,还可以检查两个参数中的哪个参数不为null,这样就可以知道正在处理哪个表单提交

    请注意,如果表单中只有一个文本字段,并且用户点击
    Enter
    而不是单击按钮,那么servlet中将显示
    null
    !看

  • 检查
    Referer
    标题-我不建议这样做,因为你并不总是知道部署的应用程序的上下文,这个值可能并不总是存在,而且很容易被欺骗

  • 为servlet添加另一个映射,以便在和上都可以访问它。然后,您可以检查
    ServletPath
    request.getServletPath()
    )以查看请求的目的是什么“servlet”。我可能会选择这个,因为它对我来说似乎是最健壮的,但是你可能还想添加另外两个检查来确保。在
    web.xml
    中,您需要

  • CreateUpdateServlet my.package.CustomerServlet CreateUpdateServlet /创造 CreateUpdateServlet /更新
    您不需要servlet。JSP(或Facelets)可以通过EL直接与bean对话。

    谢谢你的回答。问题是两个不同的JSP如何发布到同一个servlet?棒棒糖-我不同意你关于发布到JSP的建议-JSP是用于表示的,不应该(通常)使用他们有任何商业逻辑。很高兴在这里见到你!谢谢你的回复。您没有提到我关于为每个操作使用不同servlet的想法。例如,创建帐户表单将发布到CreateAccountServlet,更新帐户表单将发布到UpdateAccountServlet。这是一个糟糕的决定吗?@BalusC-你也是!我一直在这里看到你的答案,但我只是有一些空闲时间(回到学校:),所以我已经在这几天了。不知道我能坚持多久@维克普-你当然可以这么做。我将根据两个操作之间可以共享多少代码/逻辑来决定。如果数量很多,那么将它们都放在一个servlet中,通过简单的检查它们的不同之处,可能更易于维护。但是,如果您发现它最终导致代码不可读或不可管理,那么最好将它们完全拆分,并可能使用辅助类/方法实现公共功能。我不熟悉EJB,但我认为您的业务逻辑已经驻留在bean中,因此只有一个serlvet可能是一种更干净的方法。 <servlet> <servlet-name>CreateUpdateServlet</servlet-name> <servlet-class>my.package.CustomerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CreateUpdateServlet</servlet-name> <url-pattern>/create</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CreateUpdateServlet</servlet-name> <url-pattern>/update</url-pattern> </servlet-mapping>