Stack Exchange
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 (я там несколько страниц создавал, потому в разных случаях по-разному отображалось).

Буду благодарен за "просветление" моих мутных попыток оседлать сервлеты. Спасибо за ответы.
По пункту 2:
out.println("<form method=\"post\" action=\"/add\">");

надо исправить либо на
out.println("<form method=\"post\" action=\"add\">");

убрать ведущий слеш в action.
либо добавить contextPath к адресу:
out.println("<form method=\"post\" action=\"" + request.getContextPath() + "/add\">");

то есть, проблема не в томкате, а в пути к сервлету обработчику формы.
По пункту 3:
В web.xml прописывать JSP страницы не надо. 
Кстати, и объявления сервлетов в web.xml не нужны. их можно создать так:
@WebServlet(displayName = "AddAnswer", urlPatterns = {"/add"})
public class AddAnswer extends HttpServlet

так гораздо проще (Избавляет от ненужной xml конфигурации)
Но проблема не в этом. Проблема, почему не обрабатывается JSP страница тут:
<servlet-mapping>
  <servlet-name>IndexServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

то есть, привязав IndexServlet к адресу "/", Вы заменили своим IndexServlet сервлет по умолчанию (DefaultServlet) томката. Поменяйте путь IndexServlet на что-то вроде "/index" и все заработает
