【问题标题】:Invoking different methods via Servlets depending upon a URL根据 URL 通过 Servlet 调用不同的方法
【发布时间】:2014-02-09 20:58:14
【问题描述】:

我想使用 Servlet/JSP 调用基于 URL 映射的方法。

Servlet 映射到/xxx/* 之类的模式。我创建了一个只有一种方法的接口,如下所示。

public interface Action
{
   public void execute(HttpServletRequest request, HttpServletResponse response) throws IllegalAccessException, InvocationTargetException, SQLException, ServletException, IOException;
}

java.util.Map 使用此接口的不同实现进行初始化,以根据我们在其init() 方法中讨论的 Servlet 中的 URL 执行不同的操作,如下所示。

@WebServlet(name = "Country", urlPatterns = {"/Country/*"})
public final class Country extends HttpServlet
{
    private Map<String, Action>map;

    @Override
    public void init(ServletConfig config) throws ServletException
    {
        super.init(config);
        map=new HashMap<String, Action>();

        map.put("Create", new CreateAction());
        map.put("Read", new ReadAction());
        map.put("Delete", new DeleteAction());
        map.put("Edit", new EditAction());
    }
}

execute() 方法是从doGet()doPost() 方法精确调用的,如下所示。

map.get(request.getPathInfo().substring(1)).execute(request, response);

例如,http://localhost:8080/Assignment/Country/Create 之类的 URL 将调用 CreateAction 类中的 execute() 方法。

类似地,http://localhost:8080/Assignment/Country/Delete 之类的 URL 将调用 DeleteAction 类中的 execute() 方法等等。


在使用链接时,我们可以轻松地形成我们选择的 URL,例如,

<c:url var="editURL" value="/Country/Edit">
    <c:param name="countryId" value="${row.countryId}"/>
    <c:param name="currentPage" value="${currentPage}"/>
    <c:param name="countryName" value="${row.countryName}"/>
    <c:param name="countryCode" value="${row.countryCode}"/>
</c:url>

<a href="${editURL}" class="action2"/>

这会产生一个类似http://localhost:8080/Assignment/Country/Edit 的URL,它将调用EditAction 类中的execute() 方法。

如何在使用提交按钮时做同样的事情?当按下给定的提交按钮并导致CreateAction 类中的execute() 方法时,我们能否有一个适当的URL?

当按下这个提交按钮时,URL 应该是

http://localhost:8080/Assignment/Country/Create

呈现初始页面视图的默认 URL 是这样的,

http://localhost:8080/Assignment/Country

我们能否在发出POST 请求时构造这样的URL,类似于基于请求/动作的MVC 框架提供的那些(Struts 框架为提交按钮提供action 属性)?

【问题讨论】:

  • 发现这个answer 有用/有帮助。更不可能存在。

标签: jsp url servlets


【解决方案1】:

您可以在form 元素的action 属性中设置URL。 submit 类型的任何按钮都将发布到此 URL。示例:

<form action="${editURL}" method="post">
    <button type="submit">Go</button>
</form>

【讨论】:

  • 但是表单上的提交按钮不止一个,而且每个按钮的操作都不同。那么我们如何处理表单上的所有按钮呢? (我们如何使用表单的 action 属性使用不同的 URL 发出不同的请求?)
  • 不能有多个表格吗?否则,您可能必须使用 javascript 来动态设置 URL。
  • 如果您有其他更好的选择,请不要忘记更新答案。
【解决方案2】:

您可以在提交按钮上使用 JavaScript 函数并在表单中设置一些隐藏参数,并根据您的表单提交更改值并在控制器中获取隐藏参数。根据它们隐藏的参数值,你可以使用多个操作。

希望对你有帮助。

【讨论】:

  • 如果您有其他更好的选择,请不要忘记更新答案。
猜你喜欢
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多