Tomcat неправильно работает с JSP-страницами
Добрый день.
Разбираюсь с сервлетами и JSP. Сделал простенькое приложение:
- Сервлет IndexServlet отображает форму ввода и отсылает данные на 2-й сервлет
- 2-й сервлет AddAnswer принимает данные и через класс-модель Calculator получает нужный результат.
- Сервлет AddAnswer вызывает addResult.jsp для формирования страницы результата для клиента.
Вот их листинги:
IndexServlet
package com.exp.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class IndexServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head lang=\"en\">");
out.println("<meta charset=\"UTF-8\">");
out.println("<title>Welcome Page!</title>");
out.println("</head>");
out.println("<body>");
out.println("<form method=\"post\" action=\"/add\">");
out.println("i = <input type=\"text\" name=\"i\" /> <br />");
out.println("j = <input type=\"text\" name=\"j\" /> <br />");
out.println("<input type=\"Submit\" name=\"Submit\" />");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
}
AddAnswer
package com.exp.web;
import com.exp.model.Calculator;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class AddAnswer extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Calculator calc = new Calculator();
int res = calc.add(Integer.parseInt(request.getParameter("i")), Integer.parseInt(request.getParameter("j")));
request.setAttribute("result", String.valueOf(res));
RequestDispatcher view = request.getRequestDispatcher("addResult.jsp");
view.forward(request, response);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
Calculator
package com.exp.model;
public class Calculator {
public int add(int i, int j) {
return i + j;
}
}
addResult.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Add result</title>
</head>
<body>
Result = <%= (String)request.getAttribute("result") %>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--metadata-complete="true"-->
<servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.exp.web.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AddAnswer</servlet-name>
<servlet-class>com.exp.web.AddAnswer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddAnswer</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
</web-app>
Я использую Intellij Idea 14, Tomcat 8.0.17.
Мой вопрос вот в чем. Я настроил проект так, что все собирается и выкладывается сразу на сервер, все замечательно запускается. Но работает магически для меня:
- После запуска в браузере открывается страница http://localhost:8081/SimpleServlet/. Появляется нужная форма, и можно ввести значения, отправить их кнопкой.
- После отправки меня перекидывает на страницу http://localhost:8081/add, хотя, как я ожидаю, адрес должен быть http://localhost:8081/SimpleServlet/add. Почему так?
- Если я в проекте в папке web создам просто файлик, например, example.jsp, и, запустив сервлет (после деплоя на сервере файлик появляется, где нужно: в корне директории сервлета рядом с папкой WEB-INF), перейду по адресу http://localhost:8081/SimpleServlet/example.jsp - получу ошибку: The requested resource is not available. - Почему? Файл на месте, сервер должен просто его отобразить и все. Как я понимаю, не надо прописывать его в web.xml. Методом научного (случайного) тыка я обнаружил, что после деплоя на сервер эта страница доступна либо по адресу http://localhost:8081/, либо http://localhost:8081/example.jsp (я там несколько страниц создавал, потому в разных случаях по-разному отображалось).
Буду благодарен за "просветление" моих мутных попыток оседлать сервлеты. Спасибо за ответы.