質問までの経緯
まず、前提として、Java の JAX-RS(Jersey), Jettyサーバ を使って Web サーバを作りたいと考えています。
しかし、たくさんの記事や本を調べても下記のようなうまく動かない部分があり、質問させていただきました。
やりたいこと
- Jersey を使ってをURLの一部を可変に出来るURLマッピングを行いたい。
- JSONを返すAPIとHTMLの静的ページ(JSP, JSFは使わない)をレスポンスする機能の両方
- できればweb.xmlを使わずに、
@Path
や@Webservlet
アノテーションのように各クラス内でURLマッピングをしたい。
これでできるのでは?と考えたこと
- Jerseyですべてのリクエストを受け取り、
@Webservlet
で作ったサーブレットに処理を移譲し、HTMLファイルにリダイレクトする
=> @Webservlet
が反応しなかった・HTMLのファイルが見つからなかった
@Webservlet
と@Path
を共存させてWebservletはHTMLファイルのレスポンス、JerseyではAPI機能の提供を行う。
=> @Path
は反応するが、@Webservlet
が反応しなかった
- Jersey でHTMLファイルのレスポンスを行う
=> HTMLファイルが見つからない・Jersey でHTMLファイルにアクセスする方法がわからない
最後に
できればSpringやPlayなどのフレームワークなどを使わずに実装したいと考えているので、可能な方法がありましたらご教授よろしくお願いします。
初めてJavaEE を触っているため、出来るかできないのかすらも分からないので、このやり方では可能でないという場合も教えていただけると幸いです。
よろしくお願いします。
現状のソースコード
build.gradle
java
1apply plugin: 'java' 2apply plugin: 'war' 3apply plugin: 'jetty' 4 5jettyRun { 6 contextPath = "" 7 httpPort = 8080 //使用ポート番号 8 reload = "automatic" 9 scanIntervalSeconds = 1 10} 11 12repositories { 13 mavenCentral() 14} 15 16dependencies { 17 // JAX-RS 18 providedCompile group:'javax.ws.rs', name:'javax.ws.rs-api', version:'2.0.1' 19 // Jersey Server 20 compile group: 'org.glassfish.jersey.core', name:'jersey-server', version:'2.22.2' 21 // For use Jersey and Servlet 22 compile group:'org.glassfish.jersey.containers', name:'jersey-container-servlet', version:'2.22.2' 23 // Jetty Server (Main Server) 24 compile group: 'org.eclipse.jetty', name: 'jetty-webapp', version: '9.3.13.M0' 25 compile group: 'org.eclipse.jetty', name: 'jetty-annotations', version: '9.3.13.M0' 26}
web.xml
java
1<web-app> 2 <servlet> 3 <servlet-name>Jersey App Name</servlet-name> 4 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 5 <init-param> 6 <param-name>javax.ws.rs.Application</param-name> 7 <param-value>jp.ahaha.ApplicationSetting</param-value> 8 </init-param> 9 <load-on-startup>1</load-on-startup> 10 </servlet> 11 <servlet-mapping> 12 <servlet-name>Jersey App Name</servlet-name> 13 <url-pattern>/api/*</url-pattern> 14 </servlet-mapping> 15 16 <servlet> 17 <servlet-name>Servlet Name</servlet-name> 18 <servlet-class>jp.ahaha.ServletSetting</servlet-class> 19 </servlet> 20 <servlet-mapping> 21 <servlet-name>Servlet Name</servlet-name> 22 <url-pattern>/*</url-pattern> 23 </servlet-mapping> 24 <welcome-file-list> 25 <welcome-file>index.html</welcome-file> 26 </welcome-file-list> 27</web-app>
ApplicationSetting.java
java
1package jp.ahaha 2 3import org.glassfish.jersey.server.ResourceConfig; 4 5import javax.ws.rs.ApplicationPath; 6 7@ApplicationPath("api") 8public class ApplicationSetting extends ResourceConfig { 9 // api パッケージ以下にすべてのAPIのリソースを置くため、そこにアクセスするように指定している 10 private static final String API_PACKAGE_PREFIX = ".api"; 11 12 public ApplicationSetting() { 13 packages(this.getClass().getPackage().getName() + API_PACKAGE_PREFIX); 14 } 15}
ServletSetting.java
java
1package jp.ahaha; 2 3import org.glassfish.jersey.server.ResourceConfig; 4 5import javax.ws.rs.ApplicationPath; 6 7@ApplicationPath("/") 8public class ServletSetting extends ResourceConfig { 9 // controller パッケージ以下にすべてのservletのリソースを置くため、そこにアクセスするように指定している 10 private static final String SERVLET_PACKAGE_PREFIX = ".controller"; 11 12 public ServletSetting() { 13 packages(this.getClass().getPackage().getName() + SERVLET_PACKAGE_PREFIX); 14 } 15}
SampleApiController.java
java
1package jp.ahaha.api; 2 3import javax.ws.rs.GET; 4import javax.ws.rs.Path; 5import javax.ws.rs.PathParam; 6import javax.ws.rs.Produces; 7import javax.ws.rs.core.MediaType; 8import javax.ws.rs.core.Response; 9import java.net.URI; 10 11@Path("/hogehoge") 12public class SampleApiController { 13 // 動く 14 @GET 15 @Path("sample") 16 @Produces(MediaType.TEXT_HTML) 17 public Response apiDataGet() { 18 String responseData = "<h1>From API Data</h1>"; 19 return Response.ok(responseData).build(); 20 } 21 22 // 動く 23 @GET 24 @Path("{date}") 25 @Produces(MediaType.TEXT_HTML) 26 public Response apiDataGetWithDate(@PathParam("date") String date) { 27 String responseData = "<h1>From API Data</h1>" + date; 28 return Response.ok(responseData).build(); 29 } 30 // 動かない 404 31 @GET 32 @Path("file") 33 public Response apiHTMLFileRes() { 34 URI uri = URI.create("../index.html"); 35 return Response.seeOther(uri).build(); 36 } 37}
SampleController.java
java
1package jp.ahaha.controller; 2 3import org.glassfish.jersey.servlet.ServletContainer; 4 5import javax.servlet.http.HttpServletRequest; 6import javax.servlet.http.HttpServletResponse; 7import java.io.IOException; 8 9// 動かない 404 10@WebServlet("/fugafuga") 11public class SampleController extends ServletContainer { 12 @Override 13 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ 14 String responseData = "<h1>From Servlet Data</h1>"; 15 response.getWriter().print(responseData); 16 } 17}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/20 05:03