我有以下资源(仅显示相关方法):
@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/