Java 使用字符串查询参数重定向基于servlet的服务失败

Java 使用字符串查询参数重定向基于servlet的服务失败,java,servlets,Java,Servlets,情境:在下面的代码中,我试图学习如何使用表单参数,特别是通过传播字符串查询参数重定向Java servlet 问题:我似乎无法理解为什么使用所需的字符串查询参数将用户从表单(即index.html)重新定向到正确的页面时会遇到问题 以下是我在发布此消息之前采取的步骤: 我确保@WebServlet注释的URL模式是正确的 i、 e.在我的情况下/CityManagerWebStarter/mainmenuresponder.do 我确保在查看URL时我的内容根是正确的,即。 /CityMana

情境:在下面的代码中,我试图学习如何使用表单参数,特别是通过传播字符串查询参数重定向Java servlet

问题:我似乎无法理解为什么使用所需的字符串查询参数将用户从表单(即index.html)重新定向到正确的页面时会遇到问题

以下是我在发布此消息之前采取的步骤:

  • 我确保@WebServlet注释的URL模式是正确的 i、 e.在我的情况下/CityManagerWebStarter/mainmenuresponder.do

  • 我确保在查看URL时我的内容根是正确的,即。 /CityManager WebStarter和我可以在启动 下面是它的网址 按预期显示index.html页面

下面是我的servlet代码,下面是我的index.html代码,ListCities.html是我试图重新引导用户访问的页面的一个示例:

servlet代码:

package company.citymanagerweb.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MainMenuResponder
 */
@WebServlet("/CityManagerWebStarter/mainmenuresponder.do")
public class MainMenuResponder extends HttpServlet {
    private static final long serialVersionUID = 1L;

     /**
     * @see HttpServlet#HttpServlet()
     */
    public MainMenuResponder() {
        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 {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String userChoiceSelect = request.getParameter("menuChoice");
        String[] userOptionsCBox = request.getParameterValues("adminoptions");

        StringBuilder params = new StringBuilder();
        String queryStringParams = params.toString();

        if(userOptionsCBox != null) {
            boolean isFirst = true;

            for(int i = 0; i < userOptionsCBox.length; i++) {

                // Build URL with string query parameters i.e. URL + ? + PARAM1 + AMAPERSAND + PARAM2
                // Arguments is value of the value attribute
                if(!isFirst) {
                    params.append("&");
                } else {
                    params.append("?");
                }

                if(userOptionsCBox[i].equalsIgnoreCase("useDB")) {
                    // append() argument is value of the value attribute belonging to the input attribute
                    params.append("useDB=1");
                } else if(userOptionsCBox[i].equalsIgnoreCase("sendEmail")) {
                    params.append("sendEmail=1");                   
                }

                isFirst = false;
            }

            queryStringParams = params.toString();
        }

        if(userChoiceSelect.equals("1")) {
            response.sendRedirect("ListCities.html" + queryStringParams);
        } else if(userChoiceSelect.equals("2")) {
            response.sendRedirect("AddCity.html" + queryStringParams);
        } else if(userChoiceSelect.equals("3")) {
            response.sendRedirect("DeleteCity.html" + queryStringParams);
        } else {
            response.sendRedirect("index.html");
        }

    }

}
package company.citymanagerweb.servlet;
导入java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
/**
*Servlet实现类MainMenuResponder
*/
@WebServlet(“/CityManagerWebStarter/mainmenuresponder.do”)
公共类MainMenuResponder扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
/**
*@参见HttpServlet#HttpServlet()
*/
公共主要赞助方(){
超级();
//TODO自动生成的构造函数存根
}
/**
*@参见HttpServlet#doGet(HttpServletRequest请求,HttpServletResponse响应)
*/
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//TODO自动生成的方法存根
}
/**
*@请参阅HttpServlet#doPost(HttpServletRequest请求,HttpServletResponse响应)
*/
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
response.setContentType(“text/html”);
PrintWriter out=response.getWriter();
字符串userChoiceSelect=request.getParameter(“menuChoice”);
字符串[]userOptionsCBox=request.getParameterValues(“adminoptions”);
StringBuilder参数=新建StringBuilder();
字符串queryStringParams=params.toString();
if(userOptionsCBox!=null){
布尔值isFirst=true;
对于(int i=0;i
index.html:

<html>
    <head>
        <title>Welcome to the City Manager</title>
    </head>
</html>
<body>
    <form id="form1" method="post" 
            action="/CityManagerWeb/mainmenuresponder.do">
        <table style="width:100%">
            <tr>
                <td style="width:100%" align="center">
                    <h1>Welcome to the World City Manager</h1>
                </td>
            </tr>
            <tr>
                <td>
                    <h3>What would you like to do today?</h3>
                </td>
            </tr>
            <tr>
                <td>
                    <select id="menuChoice" name="menuChoice">
                        <option id="1" value="1">
                            List Cities
                        </option>
                        <option id="2" value="2">
                            Add a new city
                        </option>
                        <option id="3" value="3">
                            Delete a city
                        </option>
                    </select>
                </td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox" name="adminoptions" id="optionDatabase" value="useDB" />Use Database<br>
                    <input type="checkbox" name="adminoptions" id="optionEmail" value="sendEmail" />Send Confirmation<br>
                </td>
            </tr>
            <tr>
                <td>
                    <input name="chooser" type="submit" value="Choose" />
                </td>
            </tr>
        </table>
    </form>
</body>

欢迎来到城市经理
欢迎来到世界城市经理
你今天想做什么?
列出城市
添加一个新城市
删除一个城市
使用数据库
发送确认信息
ListCities.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Listing Cities</title>
</head>
<body>
    <table style="width:450px;">
        <tr>
            <td style="width:150px;"><b>COUNTRY</b></td>
            <td style="width:300px;"><b>CITY</b></td>
        </tr>
        <tr>
            <td>Russia</td>
            <td>Moscow</td>
        </tr>
        <tr>
            <td>England</td>
            <td>London</td>
        </tr>
        <tr>
            <td>United States</td>
            <td>Washington, D.C.</td>
        </tr>
    </table>
</body>
</html>

上市城市
国
城市
俄罗斯联邦
莫斯科
英格兰
伦敦
美国
华盛顿特区。
web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>CityManagerWebStarter</display-name>
  <servlet>
    <servlet-name>citymanagerwebstarter</servlet-name>
    <servlet-class>company.citymanagerweb.servlets</servlet-class>
  </servlet>  
  <servlet-mapping>
    <servlet-name>citymanagerwebstarter</servlet-name>
    <url-pattern>/citymanagerwebstarter/mainmenuresponder.do</url-pattern>
  </servlet-mapping>  
  <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>
</web-app>

城市管理员网络启动程序
城市管理员网络启动程序
company.citymanagerweb.servlets
城市管理员网络启动程序
/CityManager WebStarter/mainmenuresponder.do
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp

感谢您的建议/帮助。

如果
citymanagerwebstarter
是内容根目录。它不应该是
web.xml
@WebServlet
注释中url部分的一部分。

我现在看到的一个相当常见的问题是,人们使用最新的IDE工具,使用Servlet 3.0规范生成web项目,即生成的文件使用新的
@WebServlet
@WebFilter<servlet>
    <servlet-name>citymanagerwebstarter</servlet-name>
    <servlet-class>company.citymanagerweb.servlets</servlet-class>
</servlet>  
<servlet-mapping>
    <servlet-name>citymanagerwebstarter</servlet-name>
    <url-pattern>/citymanagerwebstarter/mainmenuresponder.do</url-pattern>
</servlet-mapping>
@WebServlet("/mainmenuresponder.do")
public class MainMenuResponder extends HttpServlet {
<form id="form1" method="post" action="mainmenuresponder.do">