質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Jersey

JerseyはRESTful な Web サービスの実装を支援するフレームワークのひとつ。Restlet や RestEasyにくらべ、直感的な方法で開発が可能。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

1回答

7242閲覧

JAX-RS(Jersey) を使って Web サーバを作りたい。

ahaha0807_alg

総合スコア10

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Jersey

JerseyはRESTful な Web サービスの実装を支援するフレームワークのひとつ。Restlet や RestEasyにくらべ、直感的な方法で開発が可能。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2016/10/20 03:18

編集2016/10/20 03:21

質問までの経緯

まず、前提として、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

サーブレットは HttpServlet を継承してください。

java

1@WebServlet("/fugafuga") 2public class SampleController extends HttpServlet { 3 @Override 4 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ 5 String responseData = "<h1>From Servlet Data</h1>"; 6 response.getWriter().print(responseData); 7 } 8}

投稿2016/10/20 04:00

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ahaha0807_alg

2016/10/20 05:03

回答ありがとうございます。 ひとまず、それでweb.xmlにサーブレットを登録している場合は、実行できました。 しかし、web.xmlから記述を削除すると404が帰ってくるのですが、Jersey と Servlet を同時に利用するときはweb.xmlを利用しなければならないのでしょうか…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問