在@POST之后将响应从REST发送到JSP

时间:2015-11-14 20:09:55

标签: java rest jsp

我有一个JSP页面(客户端)

<form action="http://localhost:8080/REST-WS/rest/token" method="POST">
<label for="email">Email</label>
<input name="email" />
<br/>
<label for="password">Password</label>
<input name="password" />
<br/>
<input type="submit" value="Submit" />
</form>

它指向REST Web服务(服务器端)中的函数

@POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Code verify(@FormParam("email") String email,
@FormParam("password") String password,
@Context HttpServletResponse servletResponse) throws IOException {
    Code code = generateRandomCode(email,password);
    return token;
}

问题是我想回复包含来自服务器端的随机生成代码的客户端。

首先,它将被重定向到另一个JSP页面,然后客户端可以从服务器接收随机生成的代码。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

问题是您无法在重定向中发送任意Java对象。但可以将数据添加到查询参数中。例如

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response post(@FormParam("name") String name,
                     @FormParam("email") String email) {

    String message = "Hello " + name + ". Your email is " + email;
    URI uri = UriBuilder.fromPath("/index.jsp")
            .queryParam("message", message)
            .build();
    return Response.seeOther(uri).build();
}

在这里,您将从jsp页面的位置构建URI,并在URI的末尾添加查询参数。所以重定向将转到

http://localhost:8080/index.jsp?message=<the message>

index.jsp页面,您可以使用request.getParameter("message")获取参数。例如

<h1><%= request.getParameter("message") %></h1>

使用JSP和Jersey的另一个选择是实现MVC,Jersey提供支持。您可以查看this answer,但示例使用Maven(以获取所有必需的jar)。如果您有兴趣并且不知道如何使用Maven,请告诉我,我会看看是否可以帮助您获得所需的所有罐子。

更新

Ajax示例。

最简单的Javascript库入门(如果您没有经验)是jQuery。我不会真正对代码做出太多解释,这有点超出了范围。我会通过一些教程(W3Schools有一些很好的入门指南),并且有SO的答案可以回答你的问题。

这是一个完整的html页面。只需将var url = "/api/submit";更改为您发送请求的任何端点。

<!DOCTYPE html>
<html>
    <head>
        <title>Ajax Example</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
        <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
        <script>
            $(document).ready(function(){
                var url = "/api/submit";

                $("#submitBtn").click(function(e) {
                    e.preventDefault();

                    var formData = $("#nameForm").serialize();
                    $.ajax({
                        url: url,
                        data: formData,
                        dataType: "json",
                        type: "POST",
                        success: function(data) {
                            var message = data.message;
                            var date = data.date;

                            var h1 = $("<h1>").text(message);
                            var h3 = $("<h3>").text(date);

                            $("#content").empty()
                                    .append(h1).append(h3);
                        },
                        error: function(jqxhr, status, errorMsg) {
                            alert(status + ": " + errorMsg);
                        }
                    });
                });
            });
        </script>
    </head>
    <body>
        <div id="content">
            <form id="nameForm">
                First Name: <input type="text" name="fname"/><br/>
                Last Name : <input type="text" name="lname"/><br/>
                <button id="submitBtn">Submit</button>
            </form>
        </div>
    </body>
</html>

这是测试资源类

@Path("submit")
public class FormResource {

    public static class Model {
        public String message;
        public String date;
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Model post(@FormParam("fname") String fname,
                      @FormParam("lname") String lname) {

        String message = "Hello " + fname + " " + lname;
        Model model = new Model();
        model.message = message;
        model.date = new Date().toString();
        return model;
    }
}

您需要确保拥有一个JSON提供程序来处理JSON Pojo序列化,否则它将无法工作(Model将无法进行JSON升级)。