我有以下资源(仅显示相关方法):

@Path("myresource")
public class MyResource {

GroupContainer groups= new GroupContainer(); //holds groups in an arrayList

@GET
@Produces(MediaType.TEXT_HTML)
public String start() {


    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");
    htmlBuilder.append("<body>");
    htmlBuilder.append("<h1>Hello</h1>");


    htmlBuilder.append("<p>Following: groups</p> <br>");
    for(Group g: groups.getGroups()){
        htmlBuilder.append("<p>" + (g.getID() + " | " + g.getName()) + "</p>");

        htmlBuilder.append("<form method='GET' action='myresource/" + g.getID() +"'>");
        htmlBuilder.append("<input type='submit' value='view this group'/>");
        htmlBuilder.append("</form>");

        htmlBuilder.append("<form method='DELETE' action='group'>");
        htmlBuilder.append("<input type='submit' value='delete this group'/>");
        htmlBuilder.append("</form>");
    }

    htmlBuilder.append("<a href='http://localhost:8080/myapp/myresource/asXML'>show overwiev as XML</a>");


    htmlBuilder.append("</body>");

    return htmlBuilder.toString();

}


@Path("/{groupid}")
public GroupResource getGroupByID(@PathParam("groupid") long groupid){

    Group g=null;
    for(int i=0;i!=groups.getGroups().size();++i){
        if(groups.getGroups().get(i).getID()==groupid){
            g= groups.getGroups().get(i);
            break;
        }
    }

    GroupResource grRes= null;
    if(g!=null){
        grRes= new GroupResource(g);
    }

    System.out.println(g.getID());

    return grRes;
}

}


和一个groupResource看起来像这样:

@Path("group")
public class GroupResource {


public Group group;

public GroupResource(Group group){
    this.group= group;
}

@GET
@Produces(MediaType.TEXT_HTML)
public String listGroups(){


    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");
    htmlBuilder.append("<body>");
    htmlBuilder.append("<h1>Displaying Group</h1>");

    for(Person g: group.getMembers()){
        htmlBuilder.append("<p>" + (g.getID() + " | " + g.getName()) + "</p>");
        htmlBuilder.append("<p>" + g.getDescription() + "</p>");

        htmlBuilder.append("<form method='GET' action='group/asXML'>");
        htmlBuilder.append("<input type='submit' value='view this Member'/>");
        htmlBuilder.append("</form>");

        htmlBuilder.append("<form method='DELETE' action='group'>");
        htmlBuilder.append("<input type='submit' value='delete this member'/>");
        htmlBuilder.append("</form>");

        htmlBuilder.append("<form method='UPDATE' action='group'>");
        htmlBuilder.append("<input type='submit' value='delete this member'/>");
        htmlBuilder.append("</form>");
    }


            /*htmlBuilder.append("<p>Following: groups</p> <br>");
            for(Group g: groups){
                htmlBuilder.append("<p>" + (g.getID() + " | " + g.getName()) + "</p>");
            }*/

    htmlBuilder.append("</form>");
    htmlBuilder.append("</body>");

    return htmlBuilder.toString();

}

}


调用http://localhost:8080/myapp/myresource时,我得到了我创建的组的(非xml)覆盖,下面每个组都有一个按钮。
现在,我要看一组:

我点击表单按钮htmlBuilder.append("<form method='GET' action='myresource/" + g.getID() +"'>");

得到的正是我想要的:group的GET方法被称为
@GET@Produces(MediaType.TEXT_HTML)public String listGroups(){...},我对该组中的每个成员都有一个概括(该组类具有一个成员数组列表,将显示该列表)

唯一的问题是,我仍然以某种方式仍在myresource URL上

当我查看浏览器的地址栏时,显示如下:

http://localhost:8080/myapp/myresource/3(如果我们单击ID == 3的组)
我希望它像http://localhost:8080/myapp/group/3

我该如何实现?

最佳答案

您的方法MyResource#getGroupByID实际上是一个子资源定位器。

子资源定位符是资源类中用@Path注释的方法,没有诸如@GET@POST之类的资源方法标识符。如果请求URL的路径采用“ myresource/{groupid}”模式,则将匹配并调用根资源和Subresource定位符,并返回将处理HTTP请求的GroupResource实例。这就是为什么当您发送URL为GroupResource#listGroups的请求时,会从/myresource/3获得HTML响应的原因。请注意,GroupResource作为子资源类不需要用@Path进行注释。有关更多详细信息,请参见Subresources and Runtime Resource Resolution

如果要/group/3返回HTML响应,则不需要子资源定位符。相反,您需要使用GroupResource注释的@Path("group")根资源和内部使用@Path("/{groupid}")的子资源方法。您可以尝试以下操作:

1。
将所有逻辑从MyResource#getGroupByID移到GroupResource#listGroups并更新listGroups,如下所示:

@GET
@Path("/{groupid}")
@Produces(MediaType.TEXT_HTML)
public String listGroups(@PathParam("groupid") long groupid) {
    // logic from MyResource#getGroupByID

    StringBuilder htmlBuilder = new StringBuilder();
    htmlBuilder.append("<html>");

    ...
}


2。
更新MyResource#start以为HTML提供group而不是myresource的表单动作:

htmlBuilder.append("<form method='GET' action='group/" + g.getID() +"'>");


这将导致将GET /group/{groupid}的HTTP请求分派给GroupResource#listGroups方法。

关于java - RESTful Web应用程序URL/URI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38189933/

10-09 12:28