Webアプリケーションでファイルへのパスを指定するにはどうすればよいですか?WEB-INFの下に「templates」という名前のフォルダがあります。GlassFishv3ではパスは次のようになるはずだと言われています。
./WebContent/WEB-INF/templates
しかし、このようにして、ファイルが見つからないという例外が発生します。それを機能させるために何を変更する必要がありますか?
Webアプリケーションでファイルへのパスを指定するにはどうすればよいですか?WEB-INFの下に「templates」という名前のフォルダがあります。GlassFishv3ではパスは次のようになるはずだと言われています。
./WebContent/WEB-INF/templates
しかし、このようにして、ファイルが見つからないという例外が発生します。それを機能させるために何を変更する必要がありますか?
私があなたを正しく理解していれば、現在の作業ディレクトリに依存して、デプロイしたリソースを見つけることはできません。リソースがクラスパスリソースに対して物理的に配置されている場合(jar内など)、そのリソースがどこにあるかを尋ねて、そこからナビゲートできます。
サーブレットがサーブレットの外部のファイルへの絶対パスを取得するにはどうすればよいですか?これはhttp://www.exampledepot.com/egs/java.lang/ClassOrigin.htmlからのものです:
Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation(); // file:/c:/almanac14/examples/
Eclipseで動的Webアプリプロジェクトを作成すると、warファイルのルートに入るコンテンツがWebContentフォルダーからパッケージ化されます。
Webアプリの実行時にWEB-INF/templatesディレクトリのファイルにアクセスしたいようです。
現在、絶対パスを使用してそこからファイルにアクセスしていると思います。一度デプロイすると、これはおそらくアプリでは機能しないことをすでに理解しています。
ServletContext.getResourceAsStream(String)を使用してファイルのコンテンツにアクセスする必要があります。
次のスニペットは、myfile.txtファイルを含むWebアプリの一部であるサーブレットからWEB-INF / templatez/myfile.txtという名前のファイルを検索します。他のWebアプリやユーザーは、httpGETリクエストを介してファイルにアクセスできなくなります。
package a;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name="FileFinder", urlPatterns={"/FileFinder"})
public class FileFinder extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
//* TODO output your page here
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet FileFinder</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet FileFinder at " + request.getContextPath () + "</h1>");
InputStream is = null;
try {
is = request.getServletContext().getResourceAsStream("/WEB-INF/templatez/myfile.txt");
out.println((null == is ? "did not " : "did ") + "find the file myfile.txt");
} finally {
if (null != is) is.close();
}
out.println("</body>");
out.println("</html>");
//*/
} finally {
out.close();
}
}
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}
}
わかりました、私はこれを理解しました。解決策がこれほど単純だったとは信じられません。テンプレートフォルダをWebContentフォルダに移動しました。JSPページとHTMLページが同じ場所にあり、DDのパスを/templatesに変更しました。これで、どのサーバーのどのWebコンテナでも機能すると確信しています。
サーブレット3.0のリソースJAR機能は役に立ちますか:http://blogs.oracle.com/alexismp/entry/web_inf_lib_jar_meta?