如何通过发送POST查询按URL打开新页面?

时间:2012-02-29 04:53:49

标签: java http post

我需要从一个JSP打开另一个JSP,并将POST参数发送到此JSP。我需要得到与response.sendRedirect(url);相同的结果,但是使用这种方式我不能使用POST请求。另请注意,我不能使用requestDispatcher因为这个JSP在另一个上下文中。我想我需要使用这样的东西:

    URL url = new URL("http://www.somesite.com");
    URLConnection conn = url.openConnection();
    ....
    writer.write(data);

但我不确定我是否会打开新页面。

编辑:@jaxb,是的,我试过了。但是当我使用它时,我只在现有页面中获得新页面(即我将page1更改为page2,但是没有通过向其发送POST数据而打开新页面。)

4 个答案:

答案 0 :(得分:7)

我认为您可以使用以下代码:

public static String postRequest(String targetURL, String postParams) {
    URL url;
    HttpURLConnection connection = null;
    try {
        // Create connection
        url = new URL(targetURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded");

        connection.setRequestProperty("Content-Length", ""
                + Integer.toString(postParams.getBytes().length));
        connection.setRequestProperty("Content-Language", "en-US");

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        // Send request
        DataOutputStream wr = new DataOutputStream(connection
                .getOutputStream());
        wr.writeBytes(postParams);
        wr.flush();
        wr.close();

        // Get Response
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();
        while ((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
        }
        rd.close();
        return response.toString();

    } catch (Exception e) {

        e.printStackTrace();
        return null;

    } finally {

        if (connection != null) {
            connection.disconnect();
        }
    }
}

答案 1 :(得分:2)

我觉得唯一的解决方案是使用会话。在一个jsp中将POST参数设置为会话,发送'重定向'到期望的jsp并让它从会话中获取参数。

session.setAttribute("parameter","value");

//In the second jsp.
session.getAttribute("parameter");

答案 2 :(得分:2)

我猜你需要的是一种构建有效的HTTP Post Request的方法。当我遇到类似问题时,我发现在http://www.devx.com/Java/Article/17679/1954共享的httpclient库非常有用且易于使用。它公开了设置发布请求的简单方法,然后调用post方法来执行实际发布。文章中一切都很好解释,我建议你试一试。

在本文的最后,作者(Vlad Patryshev)说:

  

回答永恒的问题   现在您知道HTML表单(GET或POST)如何作为HTTP请求传递给服务器,以及如何在Java程序中重现此行为,而不会使用协议详细信息对其进行重载。你可以说这个解决方案回答了永恒的问题:如何从另一个servlet或JSP调用servlet或JSP?

我认为这与您可能正在寻找的非常相似。

答案 3 :(得分:0)

您可以让客户端使用javascript重定向来提交表单:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><%-- file: redirectToPage2.jsp  -  redirects to Page2.jsp sending all parameters with POST method --%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Redirecting... Please Wait.</title>
<script type="text/javascript">
var submitform=function(){document.getElementById('form1').submit();};
</script>
</head>
<body onload="setTimeout(submitform,200);">
<form name="form1" id="form1" action="Page2.jsp" method="post">
<%
Map<String,String> params = request.getParameterMap();
Set<String> keys = params.keySet();
for(String key:keys)
{
    String val = params.get(key);
    %><input type="hidden" name="<%=key %>" value="<%=val %>"/><%
}
%>
</form>
</body>
</html>