以下のコードは本からのものなので、間違いではありませんが、以下のエラーを解決する方法がわかりません。メソッドdoGet()を削除すると、同じエラーが発生します。
"HTTPステータス405-HTTPメソッドGETはこのURLではサポートされていません"
import Java.io.BufferedInputStream;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PDFServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
response.setContentType("application/pdf");
ServletOutputStream out=response.getOutputStream();
File pdf=null;
BufferedInputStream buf=null;
try{
pdf=new File("C:\\Users\\lk\\Desktop\\Desktop\\ example.pdf");
response.setContentLength((int)pdf.length());
FileInputStream input=new FileInputStream(pdf);
buf=new BufferedInputStream(input);
int readBytes=0;
while((readBytes=buf.read())!=-1) out.write(readBytes);
}catch(IOException e){
System.out.println("file not found!");
}finally{
if(out!=null) out.close();
if(buf!=null) buf.close();
}
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
-<web-app xsi:.........." version="2.5">
-<servlet>
<description>This is the description of my Java EE component</description>
<display-name>This is the display name of my Java EE component</display-name>
<servlet-name>PDFServlet</servlet-name>
<servlet-class>PDFServlet</servlet-class>
</servlet>
-<servlet-mapping>
<servlet-name>PDFServlet</servlet-name>
<url-pattern>/PDFServlet</url-pattern>
</servlet-mapping>
-<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
-<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
サーブレットコードは正しいようです。提供するweb.xml
エントリとサーブレット呼び出しURL。
このエラーの原因となる主な理由は2つあります。
1)有効なdoGet()メソッドがありません。アドレスバーにサーブレットのパスを直接入力すると、TomcatなどのWebコンテナがdoGet()メソッドを呼び出そうとします。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException{
....
}
2)HTMLフォームからHTTP POSTリクエストを作成しましたが、それを処理するdoPost()メソッドがありません。 doGet()は「Post」リクエストを処理できません。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException{
....
}
詳細については、@ BalusCの回答をお読みください。 : サーブレットでのdoGetとdoPost
私はちょうど今これと同じ問題を抱えていました。 「HTTPステータス405-HTTPメソッドGETはこのURLではサポートされていません」。私の解決策は次のとおりです。
public abstract class Servlet extends HttpServlet {
protected HttpServletRequest req;
protected HttpServletResponse resp;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.req = req;
this.resp = resp;
this.requestManager();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.req = req;
this.resp = resp;
this.requestManager();
}
protected abstract void requestManager() throws IOException;
}
スーパーと呼んでいた「doGet」が原因で、コンストラクターに問題が発生しました。