In JAX-RS, you can use @Path annotation to bind URI pattern to a Java method. In this example, we will learn how to use the @Path in a JAX-RS RESTful service to direct the user to different methods based on the values passed in the URI.
Folder Structure
- Create a Dynamic Web Project RestfulExample and create a package for our src files “com.javainterviewpoint“
- Place the required jar files under WEB-INF/Lib
jersey-bundle-1.18.jar
asm-3.1.jar - Create the Java classes UserLogin.java and HelloWorld.java under com.javainterviewpoint folder.
- Place the web.xml under the WEB-INF directory
Simple URI Matching
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; @Path("/login") public class UserLogin { @GET public Response normalUser() { return Response.status(200). entity("Normal user has logged in").build(); } @GET @Path("/memeber") public Response memberLogin() { return Response.status(200). entity("Registered user has logged in").build(); } }
When you hit on the URI “http://localhost:8080/RestfulExample/rest/login”, you will be directed to the normalUser() method
Normal user has logged in
But when you hit on URI “http://localhost:8080/RestfulExample/rest/login/member”, you will be directed to the memerLogin() method
Registered user has logged in
Parametrized URI Matching
It works the same ways as the normal URI matching but it is not restricted to /hello alone. The user can put any form of URI after /hello , the method will parse the URI and act accordingly. Here the user has passed “username” which we will parse using the @PathParam{parameter_name} annotation and the value of the parameter will be available to the method through “String name”.
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; @Path("hello") public class HelloWorld { @GET @Path("{username}") public Response welcome(@PathParam("username")String name) { return Response.status(200). entity("Welcome to hello world program "+name).build(); } }
When you hit on the URI “http://localhost:8080/RestfulExample/rest/hello/JavaInterviewPoint” of our REST Service, you will get the below output
Welcome to hello world program JavaInterviewPoint
Regular Expression URI Matching
When you want to bind your method to specific form of URI, then you can use regular expression to achieve it. For example if you want the username to have only the characters and not numbers in it then we can use regular expression to filter it out.
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; @Path("hello") public class HelloWorld { @GET @Path("/username/{username : [a-zA-Z]+}") public Response welcome(@PathParam("username")String name) { return Response.status(200). entity("Welcome to hello world program "+name).build(); } @GET @Path("/id/{id :\\d+}") public Response getId(@PathParam("id")int id) { return Response.status(200). entity("ID Entered : "+id).build(); } }
When you hit on the URI “http://localhost:8080/RestfulExample/rest/hello/username/JavaInterviewPoint” you will get the below output
Welcome to hello world program JavaInterviewPoint
But for “http://localhost:8080/RestfulExample/rest/hello/username/JavaInterviewPoint123”
Page cannot be displayed will be returned
as we have made a regex to support character only Same way when you hit “http://localhost:8080/RestfulExample/rest/hello/id/1234”
you get a output
ID Entered : 1234
But for“http://localhost:8080/RestfulExample/rest/hello/id/1234java”
Page cannot be displayed will be returned
as we have made a regex to support numbers only for getId() method
web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Restful Web Application</display-name> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.javainterviewpoint</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>ping> </web-app>
We register our jersey container “com.sun.jersey.spi.container.servlet.ServletContainer” in the servlet-class of our web.xml and we will mention the source files location as the value to the init param “com.sun.jersey.config.property.packages” so that the container will scan for annotations of the class files within that package.
Leave a Reply