Что я делаю довольно часто, так это настраиваю два сервлета для этой ситуации:
MyServlet
MyAJAXServlet
MyServlet обрабатывает обычные HTTP-запросы и (обычно) в конечном итоге использует RequestDispatcher для пересылки запроса в JSP.
Пример:
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = -5630346476575695999L;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGetAndPost(req, res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGetAndPost(req, res);
}
private final void doGetAndPost(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
/*
* Handle the response here, manipulate the 'MODEL'
*/
/*
* Forward to the 'VIEW' (No Baba Wawa jokes please)
*/
RequestDispatcher rdis = req.getRequestDispatcher("Path/To/My/JSP");
rdis.forward(req, res);
}
}
Где сервлет AJAX проверяет список параметров запроса на наличие «команды»:
public class MyAJAXServlet extends HttpServlet {
private static final long serialVersionUID = -5630346476575695915L;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGetAndPost(req, res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGetAndPost(req, res);
}
private final void doGetAndPost(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
String cmd = req.getParameter("cmd");
if (cmd == null || cmd.length() < 1) {
/* Custom fail mode here, perhaps toss back failure HTML */
return;
}
/* Easily implement command pattern here, but for simplicity, we will use an if tree */
if (cmd.equalsIgnoreCase("getSomeData")) {
String out = "<tr><td>ExampleCell in ExampleRow</td></tr>";
res.getWriter().append(out);
return;
} else if (cmd.equalsIgnoreCase("someOtherCommand")) {
/* Do something else */
}
}
}
Если вы отформатируете свой JSP, чтобы разрешить массовую замену html-элементов следующим образом:
<table id="pleaseReplaceMyContentsTABLE">
<tr><td> </td></tr>
</table>
Тогда становится очень легко динамически изменять содержимое веб-страниц (для этого примера я использую JQuery):
var url = "http://mydomain.whatever/myapp/MyAJAXServletMappedURL?cmd=getSomeData";
$.post(url, function(data) {
//Message data a bit & display
$("#pleaseReplaceMyContentsTABLE").html(data);
});
Некоторые ограничения при отправке обратно отформатированного HTML-кода из сервлета AJAX:
- Если вы отправляете от умеренного до большого объема данных, ваш веб-сервер легко перегружается, когда количество клиентов начинает расти. Ака, это не будет хорошо масштабироваться.
- Java-код, который форматирует HTML для отправки клиенту, может быть уродливым и трудным для чтения. Быстро.