我想使用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
这样的网址会调用execute()
类中的CreateAction
方法。
同样,像http://localhost:8080/Assignment/Country/Delete
这样的网址会调用execute()
类中的DeleteAction
方法,依此类推。
使用链接时,我们可以轻松地形成我们选择的网址,例如
<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
之类的网址,该网址会调用execute()
类中的EditAction
方法。
使用提交按钮时如何做同样的事情?当按下给定的提交按钮导致execute()
类中的CreateAction
方法时,我们是否可以拥有适当的网址?
按下此提交按钮时,网址应为
http://localhost:8080/Assignment/Country/Create
呈现初始页面视图的默认URL如,
http://localhost:8080/Assignment/Country
我们可以构建这样的URL,同时使POST
请求与基于请求/操作的MVC框架提供的类似(Struts框架为提交按钮提供action
属性)吗?
答案 0 :(得分:1)
您可以在form
元素的action属性中设置URL。任何submit
类型的按钮都会发布到此网址。例如:
<form action="${editURL}" method="post">
<button type="submit">Go</button>
</form>
答案 1 :(得分:1)
您可以在提交按钮上使用JavaScript函数并在表单中设置一些隐藏的参数,并根据您的表单提交更改值,并在Controller中获取隐藏的参数。根据隐藏的参数值,您可以使用多个操作。
希望它会帮助你。