2016-07-04 7 views
0

Ich habe die folgende Ressource (nur relevante Methoden sind dargestellt):RESTful Web Application URLs/URIs

@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; 
} 

} 

und ein groupResource wie folgt aussehen:

@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(); 

} 

} 

Wenn http://localhost:8080/myapp/myresource Aufruf ich ein (non-xml) Überblick über die Gruppen, die ich erstellt habe und mit einer Schaltfläche für jede darunter liegende Gruppe. Jetzt mag ich in einer Gruppe suchen:

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

auf der Formular-Schaltfläche klicken und wir bekommen genau das, was ich will: Die GET Methode der Gruppen
@GET @Produces(MediaType.TEXT_HTML) public String listGroups(){...} genannt wird und ich erhalte eine overwiev von jedes Mitglied in dieser Gruppe (die Gruppe Klasse hat eine Arraylist von Mitgliedern, die angezeigt wird)

das einzige Problem ist, dass ich auf der myresource URL irgendwie noch am

, wenn ich einen Blick in meine Browser-Adresse übernehmen bar, th wird gezeigt:

http://localhost:8080/myapp/myresource/3
und ich möchte es so etwas wie http://localhost:8080/myapp/group/3

wie kann ich dies erreichen (wenn wir auf die Gruppe mit einem id == 3 geklickt haben)?

Antwort

1

Ihre Methode MyResource#getGroupByID ist eigentlich ein Subresource Locator.

A Subresource Locator ist eine Methode in der Klasse mit annotierten Ressourcenbezeich @Path ohne Ressourcen Verfahren wie @GET oder @POST. Wenn ein Pfad der Anforderungs-URL das Muster "myresource/{groupid}" aufweist, werden die Wurzelressource und der Subresource-Locator abgeglichen und aufgerufen und geben eine Instanz von GroupResource zurück, die die HTTP-Anforderung verarbeitet. Aus diesem Grund erhalten Sie eine HTML-Antwort von GroupResource#listGroups, wenn Sie eine Anfrage mit der URL /myresource/3 senden. Beachten Sie, dass GroupResource als Subresource-Klasse nicht mit @Path kommentieren müssen. Weitere Informationen finden Sie unter Subresources and Runtime Resource Resolution. Wenn Sie möchten, dass /group/3 die HTML-Antwort zurückgibt, benötigen Sie keinen Subresource Locator. Stattdessen benötigen Sie eine Root-Ressource von GroupResource, die mit @Path("group") und einer Subresource-Methode mit @Path("/{groupid}") versehen ist. Sie können so etwas wie unten probieren:

1. Verschieben Sie alle Ihre Logik von MyResource#getGroupByID zum GroupResource#listGroups und listGroups wie folgt aktualisieren:

@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. aktualisieren MyResource#start bieten HTML mit Formularaktion von group statt von myresource:

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

Dies wird eine HTTP-Anforderung von GET /group/{groupid} di führen Spat an die GroupResource#listGroups Methode.