如何在第一个JSP Servlet中调用第二个JSP Servlet?

Dal*_*ale 2 redirect jsp servlets

假设我提交了一个简单页面(该页面没有参数,没有表单等,并且无法向该页面添加任何内容),最后我进入了第一个servlet。现在,我确定是时候在第二个servlet中进行处理了。第二个servlet需要填充一堆参数和表单字段,因此首先我需要在第一个servlet中进行设置,然后弄清楚如何将这些东西添加到第二个servlet中。当我尝试向参数映射中添加某些内容时,它出错了,“不允许对锁定的参数映射进行任何修改”(这是JSP的工作方式)。我当时在想也许我应该实例化另一个请求对象,但是我不确定该怎么做(并确保自己远离热水)。如果在第一个servlet中,我曾经能够用所有“正确的东西”构造一个请求对象,那么我 d需要使用该请求运行第二个servlet,并让我进入第二个servlet将我重定向到的任何页面。我认为那只是一个response.sendRedirect();

如何获得第一个servlet中定义的其他参数和内容,以便在执行sendRedirect时,第二个servlet具有所需的一切?

Bal*_*usC 5

调用其他servlet的常规方法是使用RequestDispatcher#include()

request.getRequestDispatcher("/secondServletURL").include(request, response);
Run Code Online (Sandbox Code Playgroud)

如果您想添加额外的请求参数,希望在重定向页面的URL(可标记!)中添加它们,那么在重定向之前,您必须自己根据这些参数填充查询字符串。

response.sendRedirect(request.getContextPath() + "/secondServletURL?" + queryString);
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式创建查询字符串:

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);
Run Code Online (Sandbox Code Playgroud)

这里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("&amp;");
            }

            queryString
                .append(URLEncoder.encode(param.getKey(), "UTF-8"))
                .append("=")
                .append(URLEncoder.encode(value, "UTF-8"));
        }
    }

    return queryString.toString();
}
Run Code Online (Sandbox Code Playgroud)

但是,由于该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);
Run Code Online (Sandbox Code Playgroud)

和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);
Run Code Online (Sandbox Code Playgroud)

SomeBusinessService通常是一个EJB。