2016-08-30 78 views
1

大家都好,我有以下的球衣2个宁静的URL

模型类

@XmlRootElement(name = "book") 
@XmlType(propOrder = { "id", "name", "author", "price" }) 
public class Book { 

private String id; 
private String name; 
private String price; 
private String author; 

public Book() { 

} 

public Book(String id, String name, String price, String author) { 
    super(); 
    this.id = id; 
    this.name = name; 
    this.price = price; 
    this.author = author; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getPrice() { 
    return price; 
} 

public void setPrice(String price) { 
    this.price = price; 
} 

public String getAuthor() { 
    return author; 
} 

public void setAuthor(String author) { 
    this.author = author; 
} 

} 

我DAOImpl

public class BooksImpl{ 
static Connection conn = null; 
static Statement stmt; 
ResultSet rs; 

public List<Book> getAllBooks() throws SQLException, ClassNotFoundException, FileNotFoundException { 
    getConnection(); 
    List<Book> arrBook = new ArrayList<Book>(); 
    rs = stmt.executeQuery(GET_ALL_BOOKS); 
    while (rs.next()) { 
     arrBook.add(new Book(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4))); 
    } 
    rs.close(); 
    stmt.close(); 
    conn.close(); 
    return arrBook; 
} 

服务

@Path("/library") 
@Produces({ MediaType.APPLICATION_JSON + ";charset=UTF-8",MediaType.APPLICATION_XML + ";charset=utf-8" }) 
@Consumes({ MediaType.APPLICATION_JSON + ";charset=UTF-8",MediaType.APPLICATION_XML + ";charset=utf-8" }) 
public class BookServiceImpl implements BookService { 

private BooksImpl booksImpl = new BooksImpl(); 

@GET 
public Response getBooks(@QueryParam("format") String format) throws SQLException, ClassNotFoundException, FileNotFoundException { 
    return Response.status(Status.OK).entity(new GenericEntity<List<Book>>(booksImpl.getAllBooks()) { 
    }).header(HttpHeaders.CONTENT_TYPE, "XML".equalsIgnoreCase(format) 
      ? MediaType.APPLICATION_XML + ";charset=UTF-8" : MediaType.APPLICATION_JSON + ";charset=UTF-8") 
      .status(Status.OK).build(); 

} 

所以样品RESTful服务最后我重新开始任务说在一个邮差像::

http://localhost:8080/BooksJAXRS/library 

这很好,我可以通过从DB获取所有书籍的反应。

我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<display-name>BooksJAXRS</display-name> 
<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
</welcome-file-list> 

<servlet> 
    <servlet-name>jersey-servlet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.library.books</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>jersey-servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

</web-app> 

我requriment是不同的HTTP方法,我们有例如不同的URL终点的路径

GET : http://localhost:8080/BooksJAXRS/library 
POST : http://localhost:8080/BooksJAXRS/library 
DELETE : http://localhost:8080/BooksJAXRS/library/1 
PUT : http://localhost:8080/BooksJAXRS/library/1 

所以我做一个道具文件

GET=http://localhost:8080/BooksJAXRS/library 
POST=http://localhost:8080/BooksJAXRS/library 
DELETE= http://localhost:8080/BooksJAXRS/library/1 
PUT= http://localhost:8080/BooksJAXRS/library/1 

现在我想捕捉那个宁静的网址,并通过它传递道具文件并相应地路由它依赖NG的方法和URL

谢谢 马克

+0

'但是我想要读那个url路径...当客户端点击url时,从我的属性文件中读取...获取所有书籍。 - [UriInfo和UriBuilder](https://jersey.java.net/documentation/latest/uris-and-links.html )? –

+0

@RomanVottner更新.. – mark

回答

0

您可以创建在呼叫同一私有方法这样2种不同的方法2个映射:

@Path("/") 
... 
public class BookServiceImpl implements BookService { 

    @Path("/") 
    @GET 
    public Response getBooksByRoot(@QueryParam("format") String format) { 
     return getBooks(format); 
    } 

    @Path("/library") 
    @GET 
    public Response getBooksByLibrary(@QueryParam("format") String format) { 
     return getBooks(format); 
    } 

    private Response getBooks(String format) { 
     ... 
    } 

    @Path("/library") 
    @POST 
    public Response createBook(@QueryParam("name") String name) { 
     ... 
    } 

响应更新:

看来你想要一个动态映射,所以你需要使用一个带有正则表达式的Path

@Path("/") 
... 
public class BookServiceImpl implements BookService { 

    @Path("/{parameter:.*}") 
    @GET 
    public Response getBooks(@PathParam("parameter") String parameter) { 
     if (properties.getProperty("GET").endsWith(parameter) { 
      // code to get the books here 
     } else { 
      return Response.status(Response.Status.NOT_FOUND).build(); 
     } 
    } 

警告:中的代码片段只是为了显示这个想法,这并不意味着是完美的。例如,根据您的环境,使用endsWith进行测试可能不够。

+0

谢谢。通过这样做的方式URL会通过属性文件加载? – mark

+0

我不确定我是否理解“通过属性文件加载”的含义,请您澄清一下吗? –

+0

我很抱歉,我会这样做。当任何客户端点击我的url“http:// localhost:8080/BooksJAXRS/library”时,它应该直接离开我的属性文件,并根据url端点从该属性文件取得,即GET请求/库应该返回所有我的书籍,POST请求/库应创建一本新书等 – mark

0

使用标准Web描述符(url-pattern/*)和带注释的终结点(@Path/library)时,动态(在运行时)路由在这点上没有太多可以完成的事情。如果你想要或需要一些动态路由,其中​​一个选项,把“应用”到像新的上下文:

<servlet-mapping> 
    <servlet-name>jersey-servlet</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
</servlet-mapping> 

,并添加一些标准Servlet转发到你想要的终点:

<servlet> 
    <servlet-name>route</servlet-name> 
    <servlet-class>my.package.Route</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>route</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

my.package.Route将会受到/ app/*请求以外的任何攻击,您可以执行您的路由以在任何地方转发请求。

+0

它说java.lang.ClassNotFoundException:my.pack.route – mark

+0

当然,编写servlet类是为你准备的。 – PeterMmm