JSPからServletへの遷移
今回、eclipseで開発をすることになりました。
しかしながら、動的Webプロジェクトという使い慣れないプロジェクトでの作成を
しなくてはならなくなり、混乱しています。
tomcatとWTPのことについては、先の質問で教えて頂き解決したのですが、
もう一つ困ったことがあったので、再度質問させて頂きます。
---------------------------------------
環境
Windows7 Ultimate
eclipse Indigo
tomcat 5.5
---------------------------------------
まずは、JSPを作成し、それを実行し、ブラウザ上に表示することは出来ました。
その後にServletに<form action ="/test" method = "POST">という形で投げるのですが、
それがうまくいかず、404エラーが出てしまいます。
階層としては、JSPはSample(プロジェクト名)/WebContent/NewFile.jspに配置しています。
そして、Servletについては、Sample(プロジェクト名)/src/test/Test.javaに配置しています。
web.xmlについては、Sample(プロジェクト名)/WebContent/WEB-INF/web.xmlにあります。
まず、JSPのソースは以下の様に書かれています。
-----------------------------------------------------
<%@ page contentType="text/html;charset=Windows-31J" language="java"%>
<%@ page pageEncoding="Windows-31J"%>
<html>
<head><title>タイトル</title></head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<%request.setCharacterEncoding("Windows-31J");%>
<body>
<form method="POST" action="/test">
<%--ここに処理を記述 --%>
<input type = "submit" name="submit" value = "送信">
</form>
</body>
</html>
-----------------------------------------------------
Servletについては、以下の様に、型だけ記述しています。
-----------------------------------------------------
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Test
*/
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Test() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
----------------------------------------------------
そして、web.xmlについては、以下の様に記述しています。
----------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>SampleWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
-----------------------------------------------------
その状態で、JSPの中から
<form action ="/test" method = "POST">
<input type ="submit" name = "submit" value="送信">
</form>
とやっても、404が出てしまいます。
Java自体が久々で、根本的に間違っているかもしれませんが、
ご教授お願い致します。
お礼
ご回答ありがとうございます。 質問しておいてなんですが、私も何だか無理(というか、仕様として存在しない)のような気がしてきました。でなければ、「クロスサイトスクリプティング」なんて攻撃も出てこないでしょうし・・ >そもそもそのサイトへの「はじめの第一歩」は、 >クライアントからの要求で動作する ですね。ただ、質問の例でいうと、サーブレットやJSPを呼び出すのに使われた(フォームのある)htmlファイルがあるので、このファイル名を取得して、それが自サイト内にあるかどうかを確認してやればどうにかなるんじゃないかと思いました。 で、APIを見ていたところ、HttpServletRequestのgetRequestURLメソッドが使えそうだと気付きました。同メソッドの説明には「クライアントが要求を作成するために使用した URL を再構築します。」とあるので、そこに自ドメイン名が含まれていなければ処理を中断する、とかいう対処はできそうです("<% out.println(request.getRequestURL().toString()); %>"で確認してみましたが、何とかなりそうです)。 とはいえ、あまりスマートな解決法ではないので、引き続き情報を募集させていただきます。 最後になりましたが、getRemoteAddr()やgetHeader()については知りませんでした。参考にさせていただきます。
補足
一晩経って気付きましたが、getRequestURLではクライアントが呼び出したURLが返ってくるので意味ないですね(どこから呼び出されようが、自ドメインを含むURLが返ってくる・・)。