我有以下资源(仅显示相关方法):
@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() +"'>");
我得到了我想要的东西:组的GET方法叫做
@GET
@Produces(MediaType.TEXT_HTML)
public String listGroups(){...}
我得到该组中每个成员的重复(组类有一个成员的arraylist,显示)
唯一的问题是,我不知何故仍在myresource网址
当我查看浏览器的地址栏时,会显示:
http://localhost:8080/myapp/myresource/3(如果我们点击ID == 3的群组)
我希望它像http://localhost:8080/myapp/group/3
我怎样才能做到这一点?
答案 0 :(得分:1)
您的方法MyResource#getGroupByID
实际上是一个子资源定位器。
Subresource Locator是Resource类中使用@Path
注释的方法,没有@GET
或@POST
等资源方法指示符。如果请求URL的路径采用&#34; myresource/{groupid}
&#34;的模式,则将匹配并调用根资源和子资源定位器,并返回GroupResource
的实例处理HTTP请求。这就是您在发送网址为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}
发送到GroupResource#listGroups
方法的HTTP请求。