假设我提交了一个简单的页面(没有参数,没有表单等,我无法在此页面添加任何内容),我最终会在第一个servlet中。现在我确定是时候在第二个servlet中完成这些工作了。第二个servlet需要填充一堆参数和表单字段,所以首先我需要在第一个servlet中设置它们,然后弄清楚如何将这些东西放到第二个servlet中。当我尝试向参数映射中添加一些内容时,它会错误地显示“不允许对锁定的参数映射进行任何修改”(这是JSP应该工作的方式)。我想也许我应该实例化另一个请求对象,但我不知道该怎么做(并让自己脱离热水)。如果在第一个servlet中,我能够用所有“正确的东西”构造一个请求对象,那么我需要用该请求运行第二个servlet,并让它带我到第二个servlet重定向的任何页面我也是。我认为只有一个是response.sendRedirect();
如何获取第一个servlet中定义的其他参数和内容,以便在执行sendRedirect时,第二个servlet具有所需的一切?
答案 0 :(得分:5)
调用其他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。