【发布时间】: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 有用/有帮助。更不可能存在。