首页 > 解决方案 > 除了主页,我的 servlet 不起作用

问题描述

每当我单击第一页上的“添加新书”或“列出所有书籍”按钮时,我都会收到来自 tomcat 服务器的错误提示

"类型状态报告

留言/新

描述 源服务器没有找到目标资源的当前表示或不愿意透露存在的表示。”

我的 servletcontroller.java

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ControllerServlet.java
 * This servlet acts as a page controller for the application, handling all
 * requests from the user.
 * @author www.codejava.net
 */
public class ControllerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private DBUtils dbUtils;

    public void init() {
        String jdbcURL = getServletContext().getInitParameter("jdbcURL");
        String jdbcUsername = getServletContext().getInitParameter("jdbcUsername");
        String jdbcPassword = getServletContext().getInitParameter("jdbcPassword");

        dbUtils = new DBUtils(jdbcURL, jdbcUsername, jdbcPassword);

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getServletPath();

        try {
            switch (action) {
            case "/new":
                showNewForm(request, response);
                break;
            case "/insert":
                insertProjectManager(request, response);
                break;
            case "/delete":
                deleteProjectManager(request, response);
                break;
            case "/edit":
                showEditForm(request, response);
                break;
            case "/update":
                updateProjectManager(request, response);
                break;
            case "/list":
                listProjectManager(request, response);
                break;
            default:
                listProjectManager(request, response);
                break;
            }
        } catch (SQLException ex) {
            throw new ServletException(ex);
        }
    }

    private void listProjectManager(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException, ServletException {
        List<ProjectManager> managerList = dbUtils.queryManager();
        request.setAttribute("managerList", managerList);
        RequestDispatcher dispatcher = request.getRequestDispatcher("ManagerListing.jsp");
        dispatcher.forward(request, response);
    }

    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher("ManagerForm.jsp");
        dispatcher.forward(request, response);
    }

    private void showEditForm(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        ProjectManager manager = dbUtils.findProjectManager(id);
        RequestDispatcher dispatcher = request.getRequestDispatcher("ManagerForm.jsp");
        request.setAttribute("manager", manager);
        dispatcher.forward(request, response);

    }

    private void insertProjectManager(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        String name = request.getParameter("name");
        String pass = request.getParameter("pass");
        int projectID = Integer.parseInt(request.getParameter("projectID"));

        ProjectManager manager = new ProjectManager(name, pass, projectID);
        dbUtils.insertProjectManager(manager);
        response.sendRedirect("list");
    }

    private void updateProjectManager(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        String name = request.getParameter("name");
        String pass = request.getParameter("pass");
        int projectID = Integer.parseInt(request.getParameter("projectID"));

        ProjectManager manager = new ProjectManager(id, name, pass, projectID);
        dbUtils.updateProjectManager(manager);
        response.sendRedirect("list");
    }

    private void deleteProjectManager(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));

        dbUtils.deleteProjectManager(id);
        response.sendRedirect("list");

    }
}

managerform.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>Books Store Application</title>
</head>
<body>
    <center>
        <h1>Manager Management</h1>
        <h2>
            <a href="/new">Add New Book</a>
            &nbsp;&nbsp;&nbsp;
            <a href="/list">List All Books</a>

        </h2>
    </center>
    <div align="center">
        <c:if test="${manager != null}">
            <form action="update" method="post">
        </c:if>
        <c:if test="${manager == null}">
            <form action="insert" method="post">
        </c:if>
        <table border="1" cellpadding="5">
            <caption>
                <h2>
                    <c:if test="${manager != null}">
                        Edit manager
                    </c:if>
                    <c:if test="${manager == null}">
                        Add New manager
                    </c:if>
                </h2>
            </caption>
                <c:if test="${manager != null}">
                    <input type="hidden" name="id" value="<c:out value='${manager.id}' />" />
                </c:if>           
            <tr>
                <th>Title: </th>
                <td>
                    <input type="text" name="title" size="45"
                            value="<c:out value='${manager.name}' />"
                        />
                </td>
            </tr>
            <tr>
                <th>Author: </th>
                <td>
                    <input type="text" name="author" size="45"
                            value="<c:out value='${manager.password}' />"
                    />
                </td>
            </tr>
            <tr>
                <th>Price: </th>
                <td>
                    <input type="text" name="price" size="5"
                            value="<c:out value='${manager.projectID}' />"
                    />
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="Save" />
                </td>
            </tr>
        </table>
        </form>
    </div>   
</body>
</html>

managerlisting.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>Books Store Application</title>
</head>
<body>
    <center>
        <h1>Books Management</h1>
        <h2>
            <a href="/new">Add New Book</a>
            &nbsp;&nbsp;&nbsp;
            <a href="/list">List All Books</a>

        </h2>
    </center>
    <div align="center">
        <table border="1" cellpadding="5">
            <caption><h2>List of Project Managers</h2></caption>
            <tr>
                <th>ID</th>
                <th>NAME</th>
                <th>PASSWORD</th>
                <th>PROJECTID</th>
                <th>Actions</th>
            </tr>
            <c:forEach var="manager" items="${managerList}">
                <tr>
                    <td><c:out value="${manager.id}" /></td>
                    <td><c:out value="${manager.name}" /></td>
                    <td><c:out value="${manager.password}" /></td>
                    <td><c:out value="${manager.projectID}" /></td>
                    <td>
                        <a href="/edit?id=<c:out value='${manager.id}' />">Edit</a>
                        &nbsp;&nbsp;&nbsp;&nbsp;
                        <a href="/delete?id=<c:out value='${manager.id}' />">Delete</a>                     
                    </td>
                </tr>
            </c:forEach>
        </table>
    </div>   
</body>
</html>

和我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>Books Management Web Application</display-name>

    <context-param>
        <param-name>jdbcURL</param-name>
        <param-value>jdbc:mysql://localhost:3306/demo</param-value>
    </context-param>

    <context-param>
        <param-name>jdbcUsername</param-name>
        <param-value>root</param-value>
    </context-param>

    <context-param>
        <param-name>jdbcPassword</param-name>
        <param-value>mySQL12.!</param-value>
    </context-param>

    <servlet>
        <servlet-name>ControllerServlet</servlet-name>
        <servlet-class>ControllerServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ControllerServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/Error.jsp</location>
    </error-page>
</web-app>

标签: jspservlets

解决方案


假设您正在从 URI 运行 managerform.jsp,

http://localhost:8080/yourcontextroot/managerform.jsp的链接

href="/新"

将转到不在您的上下文中的http://localhost:8080/new 。正确的链接是http://localhost:8080/yourcontextroot/new

href="new" 这将解析到http://localhost:8080/yourcontextroot/new的链接

还有其他几件事我想提出改进建议。

  1. 不要为 Servlet 使用默认包
  2. 不要将 /* 映射用于 servlet 映射(servlet 映射 url 模式中 / 和 /* 之间的区别

推荐阅读