在Servlet中读取表单数据。使用POST方法发布数据,并通过?q=test1调用Servlet。

8

嘿,我正在尝试在使用POST方法发送的servlet中读取表单数据。该servlet的名称为OnlineExam?q=saveQuestion。现在该servlet正常工作:

public class OnlineExam extends HttpServlet {
protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
if(request.getParameter("q").equals("saveQuestion")){
                /*
                 * Save the question provided with the form as well as save the uploaded file if any.
                 */
                saveQuestion(request);
            }
}

protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      doGet(request, response);
        saveQuestion(request);
    }
public String saveQuestion(HttpServletRequest request){         
        System.out.println(request.getParameter("question"));

        return "";

    }       
}

HTML表单:

<form action="OnlineExam?q=saveQuestion" method="post">
        <fieldset>
        <legend>Question</legend>
        <textarea class="questionArea" id="question" name="question">Enter Question.</textarea>
        <br class="clearFormatting"/>               
        <input class="optionsInput" value="optionA" name="optionA" onfocus = "clearValues('optionA')" onblur = "setValues('optionA')"/>
        <br class="clearFormatting"/>

        <input class="optionsInput" value="optionB" name="optionB" onfocus = "clearValues('optionB')" onblur = "setValues('optionB')"/>
        <br class="clearFormatting"/>

        <input class="optionsInput" value="optionC" name="optionC" onfocus = "clearValues('optionC')" onblur = "setValues('optionC')"/>
        <br class="clearFormatting"/>

        <input class="optionsInput" value="optionD" name="optionD" onfocus = "clearValues('optionD')" onblur = "setValues('optionD')"/>
        <br/>
        <input class="optionsInput" value="answer" name="answer" onfocus="clearValues('answer')" onblur="setValues('answer')"/>     
        <input type="submit" value="Save" />
        <input type="reset" value="Cancel" />
        <button style="display: none" onclick="return deleteQuestion()" >Delete</button>
        </fieldset>
        </form>

有人能说明一下servlet是如何被调用的吗?我的意思是控制流程是什么,也就是这个servlet是如何工作的。

我该怎样在servlet中读取param1参数呢?

注:我不想使用get方法提交表单。


大家好,我需要一种读取q=savequestion的GET数据和表单POST数据的方法。那么如何同时读取并解析它们呢? - vinit
7个回答

6
你需要在doPost方法中获取q的值,而不是在doGet方法中获取。因为你使用了method="post",所以在servlet中调用的是doPost方法而不是doGet方法。将doGet方法中的代码删除,然后将其插入到doPost方法中。你的doPost方法应该像下面的代码一样。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    if(request.getParameter("q").equals("saveQuestion")){
        saveQuestion(request);
    }
}

HttpServletRequest.getAttribute("optionA")无法获取表单输入的downvote。 - Philip Rego

4

这个问题解决了吗?

我也遇到了同样的问题。 我尝试了

Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
    System.out.println((String)paramNames.nextElement());
}

现在显示0个元素,表单数据没有被servlet读取。

我在其他线程中找到了答案。 enctype=multipart/form-data 是造成这种情况的原因。从表单中删除它后,就能够读取数据了。


3

如果您向Servlet POST数据,则会调用doPost

doPost()内部,您可以访问请求参数,例如:

request.getParameter("param1");

从doPost中移除doGET的调用,它没有用处。 - jmj
从doPost中提到,只需将doGet的调用从doPost中删除。 - jmj
嘿,我已经从doPost中删除了doGet调用,但仍然显示为null。 - vinit
嘿,Jigar,我刚刚对问题进行了更改,请您审核一下。感谢您的友善 :) - vinit
嘿,我已经在问题中添加了实际的源代码,请查看编辑后的问题。 - vinit
只需删除参数 q=saveQuestion 并使用隐藏输入传递它。 - jmj

0
doPost() {
  processRequest(request, response);
  //to do
}

移除或注释掉 processRequest(request, response),然后再试一次。现在你不应该得到 null 值了。


@jvperrin,英语不是我的母语。所以你的负评让我非常失望。 - Milan-SJ
我没有给你点踩,我只是编辑了你的帖子以使其更易读。 - jvperrin

0
当您在表单上单击“提交”按钮时,将调用servlet的doPost方法 - 这是由您在HTML页面的“form”上放置的方法决定的。 doPost方法中仍然可以使用URL参数(q = saveQuestion)来访问您的代码。 您似乎认为URL参数将由doGet方法处理,而表单参数将由doPost方法处理。 实际情况并非如此。

1
但是为什么我无法获取表单的字段呢?即使调用了doPost servlet。 - vinit
你确定你的doPost方法被调用了吗?你尝试过使用Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { System.out.println((String)paramNames.nextElement()); } 来查看哪些参数到达了servlet吗? - DaveH
这并没有回答问题。 - Philip Rego

0

我知道这是一个旧的帖子,但当我搜索时找不到答案,所以我发布了我的解决方案,为那些在他们的servlet的dopost函数中从表单参数获取null值的人提供帮助。

当我使用request.getParameters("param1");函数时,我遇到了类似的问题。经过数小时的尝试,我意识到我使用的param1是我请求的input标签的ID。这是错误的。我必须使用input标签的NAME属性来获取输入框的正确值。这就是全部。我只需要添加一个名称并使用此名称获取参数即可解决问题。

希望这能帮助到某个人。


谢谢你的解决方案,我是Java世界的新手,我已经将它更改为名称,但仍然得到了空值:( - Niraj Trivedi
我正在使用这个名称。仍然为空。 - Philip Rego

-1

Vinit,请尝试以下代码 request.getParameter("param1");


嘿,实际上我正在尝试你写的相同内容。那只是打字错误。请查看已编辑的问题。谢谢回复。 - vinit
你可以尝试移除?q=saveQuestion(仅是建议未尝试过)。不要在表单操作中添加附加项,而是将参数“q”作为表单中的隐藏字段。 - Gnanz
不行,实际上servlet还会根据get参数执行其他一些工作。 - vinit
@PhilipRego,请再仔细阅读我的回答——应该是getParameter而不是getAttribute。请撤销您的负评,看起来您还对其他几个答案进行了负评,请检查一下。 - Gnanz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接