gpt4 book ai didi

java - 如何使用Servlet验证JSP并保留输入数据?

转载 作者:行者123 更新时间:2023-12-02 02:24:01 25 4
gpt4 key购买 nike

我需要一些帮助才能将 JSP 和两个 Java Servlet 绑定(bind)在一起。我有以下内容:

在 JSP 上:

  • First two radio buttons with onchange="submit()"
  • a div container, which will only appear if one of the radio buttons is active (containing the next two)
  • some dropdowns, populated according to the choice of the radio button
  • some input fields

两个 Servlet:

  • one for populating the dropdowns
  • second for validating everything else and filling the db/redirecting to another page in case of success, ...

总体运行良好,数据库部分也运行良好。

不同的下拉菜单只允许一些组合(实际上有更多的值和更多的下拉菜单,如下面的代码片段所示)。我的问题是:每当验证失败时,JSP 就会重新加载(这显然没问题),我所做的选择就消失了,我开始在单选按钮选项之间进行选择。

将单选按钮的值从 Servlet 1 传递到 Servlet 2 似乎工作得很好。 (我已经尝试在 Servlet2 的重新加载中使用相同的方法(request.set...),但它不起作用。)验证也工作正常。

<小时/>

问题:我怎样才能实现在验证后单选按钮(和其他输入字段)像以前一样被预先选择?我只想显示错误消息并保留所有输入值。

<小时/>

如果这很重要,这里是代码的某些部分,名称已更改,希望保持一致。如果有人知道如何将其放入点播/剧透容器中,请随意编辑。

输入.jsp

<body>
<span class="messages">${messages.ERROR}</span>
<form action="/project/chooseRadio" method="get">

<h2>Radio</h2>
<input type="radio" name="option" onchange="submit()"
value="option1"
${param.option == 'option1' ? 'checked' : ''}>
<input type="radio"
name="option" onchange="submit()" value="option2"
${param.option== 'option2' ? 'checked' : ''}>
</form>


<form action="/project/input" method="post">
<div
style="display:${(option == 'option1' || option == 'option2') ? 'block' : 'none'}">

<select name="dd1">
<c:forEach items="${dd1}" var="dd1">
<option><c:out value="${dd1}" /></option>
</c:forEach>
</select>
<select name="dd2">
<c:forEach items="${dd2}" var="dd2">
<option><c:out value="${dd2}" /></option>
</c:forEach>


<input type="text" name="inputfield1" required="true" /> <br>
<input type="text" name="inputfield2" required="true" /> <br>
<input type="submit" name="submit"
value="submit" />
</span>
</div>
</form>
</body>

选择Radio-Servlet

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

// option1
int[] dd1_1 = { 1, 2, 3, 4 };
int[] dd2_1 = { 1, 2, 3, 4 };

// option2
int[] dd1_2 = { 9, 8, 7, 6 };
int[] dd2_2 = { 9, 8, 7, 6 };

if (request.getParameter("option") != null) {

switch (request.getParameter("option")) {
case "option 1":
request.setAttribute("option", "option1");
request.setAttribute("dd1", dd1_1);
request.setAttribute("dd2", dd2_1);
break;

case "option2":
request.setAttribute("gratingType", "option2");
request.setAttribute("dd1", dd1_2);
request.setAttribute("dd2", dd2_2);
break;
default:
break;
}
}

request.getRequestDispatcher("/WEB-INF/input.jsp").forward(request, response);
}

输入Servlet

@WebServlet("/input")
public class InputServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

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

request.getRequestDispatcher("/WEB-INF/input.jsp").forward(request, response);
}

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

DTO dto = new DTO();

Map<String, String> messages = new HashMap<String, String>();

switch (request.getParameter("option")) {
case "option1":
dto.setOption("option1");
break;

case "option2":
dto.setOption("option2");
break;
default:
break;
}


dto.setInputfield1(Integer.parseInt(request.getParameter("inputfield1")));
// ... dto.set for other fields ... //
// save dto in database
// validation
if(validCombination(...)){
request.getRequestDispatcher("/WEB-INF/output.jsp").forward(request, response);
}
else {
messages.put("ERROR", String.format("this is not a valid combination."));
request.setAttribute("messages", messages);
request.getRequestDispatcher("/WEB-INF/input.jsp").forward(request, response);
}
}

最佳答案

你确实有三个选择

  1. 在提交表单之前,在 JavaScript 中执行客户端验证,无需服务器端调用
  2. 在提交表单之前,通过服务器端调用 (ajax) 在 JavaScript 中进行客户端验证
  3. 提交表单并刷新页面进行验证

选项 1 和 2 会将值保留在字段中。选项 3 将要求您填充值并显示错误消息。

关于java - 如何使用Servlet验证JSP并保留输入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48060269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com