使用JAX-RS UriBuilder渲染新的.jsp页面

时间:2015-08-22 01:56:03

标签: java rest jsp jersey jax-rs

我只是尝试发送一个新的.jsp页面,由客户端使用URIBuilder进行呈现。所以我有一个main.js发送一个POST给服务器调用logIn()。现在我只想让它将一个新的.jsp文件发送到要呈现的客户端。到目前为止没有任何事情发生,我尝试过使用不同的文件路径 - 在我刚刚使用" Feed.jsp"作为文件路径。

我觉得还有更多内容,我没有接受。

这是我的main.js文件。它通过logIn()方法成功向服务器发送POST。我的index.jsp文件成功使用了这个main.js。

var rootURL = "http://localhost:8080/messenger/webapi";

$(function() {

$('#btnRegister').click(function() {
    var username = $('#username').val();
    registerProfile();
});

$('#btnSignIn').click(function() {
    logIn();
});

function logIn() {
    var profileJSON = formToJSON();
    $.ajax({
        type: 'POST',
        contentType: 'application/json',
        url: rootURL + "/profiles/logIn",
        dataType: "json",
        data: profileJSON,
        success: (function(data){
            alert("Success!");
        })
    });
}
function registerProfile() {
    var profileJSON = formToJSON();
    $.ajax({
        type : 'POST',
        contentType: 'application/json',
        url: rootURL + "/profiles",
        dataType: "json",
        data: profileJSON,
        success: (function() {
            alert("Resgistered");
        })
    }); 
}   
function formToJSON() {
    return JSON.stringify({
        "profileName": $('#username').val(), 
        "password" : $('#password').val(),
        });
}
});

这是我的ProfileResource.java中调用的LogIn()方法。它成功地可以调用帖子,但出于某种原因,当我包含UriBuilder时,它什么都不做。

@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@POST
@Path("/logIn")
public Response logIn( @Context ServletContext context) {
        UriBuilder uriBuilder = UriBuilder.fromUri(URI.create(context.getContextPath())); 
        uriBuilder.path("Deployed Resources/webapp/Feed.jsp");
        URI uri = uriBuilder.build();
        return Response.seeOther(uri).build();
}
}

所以基本上我的index.jsp会呈现给客户端。我的" btnResgister"按钮完成它所需要的,我的" btnSignIn"虽然我知道它可以访问" profiles / login"但它并没有做任何事情。资源很好。

更新 我使用用户peeskillets UriUtils类:

实现了我的登录方法
@POST
@Path("/logIn")
public Response logIn( @Context ServletContext context, @Context UriInfo uriInfo) {
    URI contextPath = UriUtils.getFullServletContextPath(context, uriInfo);
    UriBuilder uriBuilder = UriBuilder.fromUri(contextPath);
    uriBuilder.path("Feed.jsp");
    return Response.seeOther(uriBuilder.build()).build();
}

POST仍未完成。我想知道这是否与ServletContext或UriInfo参数有关......这些参数是我POST时自动发送还是我必须使用.js从客户端发送更多信息?

这里也是我的文件结构:

enter image description here

1 个答案:

答案 0 :(得分:1)

this answer道歉。似乎ServletContext.getContextPath()只返回相对路径而不是完整的uri。在这种情况下,当Jersey找到相对URI时,它将从应用程序的基URI构造一个完整的URI。因此,您将始终获得包含Jersey根路径的路径(它永远不会导致jsp页面。)

我不知道如何从Jersey获取完整的上下文路径(完整URI),除了做一些字符串操作。你可以使用

public class UriUtils {

    public static URI getFullServletContextPath(ServletContext context, 
                                                UriInfo uriInfo) {

        URI requestUri = uriInfo.getRequestUri();

        String contextPath = context.getContextPath();

        if (contextPath.trim().length() == 0) {
            String fullContextPath = requestUri.getScheme() 
                    + "://" + requestUri.getRawAuthority();
            return URI.create(fullContextPath);
        } else {
            int contextPathSize = contextPath.length();
            String requestString = requestUri.toASCIIString();
            String fullContextPath = requestString.substring(
                    0, requestString.indexOf(contextPath) + contextPathSize);
            return URI.create(fullContextPath);
        }
    }
}

然后使用path与jsp页面的路径UriBuilder相对于servlet上下文路径。例如,如果您的jsp页面位于上下文路径的根目录(即webapp文件夹的根目录,或者在大多数情况下位于index.jsp的相同位置),则可以执行

@POST
public Response post(@Context ServletContext servletContext, 
                     @Context UriInfo uriInfo) {

    URI contextPath = UriUtils.getFullServletContextPath(servletContext, uriInfo);

    UriBuilder uriBuilder = UriBuilder.fromUri(contextPath);
    uriBuilder.path("feed.jsp");
    return Response.seeOther(uriBuilder.build()).build();
}

我将对第一个链接帖子进行更正: - )