调用其他 servlet 的正常方法是使用 RequestDispatcher#include()。
request.getRequestDispatcher("/secondServletURL").include(request, response);
如果你想添加额外的请求参数并且你想在重定向页面的(书签!)URL中结束它们,那么你必须根据以下内容填充查询字符串在重定向之前自己设置这些参数。
response.sendRedirect(request.getContextPath() + "/secondServletURL?" + queryString);
您可以按如下方式创建查询字符串:
Map<String, String[]> params = new HashMap<String, String[]>(request.getParameterMap());
params.put("name1", new String[] {"value1"});
params.put("name2", new String[] {"value2"});
// ...
String queryString = toQueryString(params);
toQueryString() 如下所示:
public static String toQueryString(Map<String, String[]> params) {
StringBuilder queryString = new StringBuilder();
for (Entry<String, String[]> param : params.entrySet()) {
for (String value : param.getValue()) {
if (queryString.length() > 0) {
queryString.append("&");
}
queryString
.append(URLEncoder.encode(param.getKey(), "UTF-8"))
.append("=")
.append(URLEncoder.encode(value, "UTF-8"));
}
}
return queryString.toString();
}
但是,由于该 servlet 似乎在同一个容器中运行,并且您希望重用第二个 servlet 的逻辑而不将其他参数公开,那么可能更好的方法是重构该紧的业务代码将第二个 servlet 耦合到另一个独立且可重用的类中,您最终只需在两个 servlet 中导入并调用该类。然后,您可以使用可重用的 Javabean 对象将数据传递给该类。
例如,servlet 1:
SomeData data = new SomeData();
data.setSomeProperty1(request.getParameter("someProperty1"));
data.setSomeProperty2("some custom value");
data.setSomeProperty3("some other custom value");
SomeBusinessService service = new SomeBusinessService();
service.doSomeAction(data);
还有 servlet 2:
SomeData data = new SomeData();
data.setSomeProperty1(request.getParameter("someProperty1"));
data.setSomeProperty2(request.getParameter("someProperty2"));
data.setSomeProperty3(request.getParameter("someProperty3"));
SomeBusinessService service = new SomeBusinessService();
service.doSomeAction(data);
SomeBusinessService 通常是一个 EJB。