【问题标题】:Preserving the selected value in an HTML select element after refreshing a JSP page刷新 JSP 页面后在 HTML 选择元素中保留所选值
【发布时间】:2013-06-25 08:45:35
【问题描述】:

我有一个带有下拉框的 JSP。我选择一个选项并提交该选项。所以现在我得到了存储在该选定选项的数据库中的信息。现在我通过在 servlet 中设置为自动刷新 JSP(HTML 页面)

//servlet code inside doGet() method
HttpSession session=request.getSession();
String selUrl=request.getParameter("urlsel");    
String opt=session.setAttribute("selectedUrl",selUrl);
String selopt=session.getAttribute("selectedUrl");
response.setHeader("Refresh","10;url="/SiteAvailabilityServlet?ursel="+selectedUrl);
//and forwarding request to result.jsp using RequestDispatcher..

//input.jsp 代码

<select name="urlsel">
<option value="abc">abc</option>
<option value="def">def</option>
</select>

当我第一次选择选项说 abc 并手动提交时,它给了我正确的结果并显示了数据库中的详细信息。 10 秒后,它会使用相同的选项 abc 自动刷新(我不想更改选项),但不显示值。它正在采取

  request.getParameter("urlsel")    as null  after refreshing automatically.

请帮助我。在 result.jsp 我正在使用

 <form method="get" action="/SiteAvaialabilityServlet">

【问题讨论】:

  • &lt;form method="get" action="/SiteAvaialabilityServlet&gt;,如果有的话,从修复这条线开始(谁知道呢,也许这是你进退两难的原因):&lt;form method="get" action="/SiteAvaialabilityServlet"&gt;
  • 我没有得到你。请帮助我在哪里做错了。即使我使用了会话,为什么我在自动刷新网页后得到空值。请帮助我..
  • 我想帮忙 :) !我的第一条评论的意思是:在表单操作中,正如您在问题中发布的那样,您忘记了一点"。首先添加它并在问题上编辑它,这样我们就知道它与问题无关。否则,你有什么例外吗?如果是这样,请发布其名称或堆栈。

标签: java jsp servlets http-request-parameters


【解决方案1】:

我认为如果您替换此行,您的代码应该可以正常工作:

response.setHeader("Refresh","10;url="/SiteAvailabilityServlet?ursel="+selectedUrl);

有了这个:

response.setHeader("Refresh","10;url=/SiteAvailabilityServlet?urlsel="+ selopt);

改变的是:

  • " 已从标头中的 URL 中删除,我不明白为什么它应该在那里;
  • 是urlsel 不是ursel ;
  • 为什么是selectedUrl?它是会话属性的名称,您想要的是会话属性的值。既然你有那个 (selopt),你可能只想使用它。

您的 HTML 可能希望得到更好的处理,就这一行而言," 缺失:

<form method="get" action="/SiteAvaialabilityServlet> 

所以用这个替换它:

<form method="get" action="/SiteAvaialabilityServlet">

希望所有这些拼写错误都没有出现在您的原始代码中。

P.S:请更正您问题中的代码,以帮助大家帮助您:)。

祝你好运。

【讨论】:

  • 是的。我明白了。非常感谢。我使用 selopt 而不是 selectedUrl。现在可以使用了。谢谢
  • 哦,没什么!下次发生这种情况时,您只需相信您的逻辑并搜索拼写错误或软错误(您是否混合了一些变量等)。祝你好运:)
  • 但是在刷新页面后,如果我点击框架中的另一个按钮并返回页面没有刷新。请帮助我。为什么我回来后它没有刷新另一个框架。
  • 不确定,但可能是因为,从另一个框架,您没有向执行刷新的 servlet 抛出 GET 请求。换句话说,没有调用带有刷新行的 doGet 。我不是很清楚你的用例的细节,你说的框架在哪里?
【解决方案2】:

作为已接受答案的补充,这里有一个 JSP(类似于 your previous question)来展示 如何在刷新页面后使用 HTML select 元素保留选择的值。

注意:The usage of scriptlets is discouraged。在下面的示例中,为了简单起见,使用小脚本来模拟 OP 在他的 example 中尝试做的事情。

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
    String selectValue = request.getParameter("course");
    if (selectValue != null) {
        session.setAttribute("savedCourse", request.getParameter("course"));
    }
%>
<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="refresh" content="3; url=${pageContext.request.requestURL}?savedCourse=${sessionScope.savedCourse}">
</head>
<body>
    <h1>Test Page</h1>
    <form action="" method="post">
        <p>Choose some course</p>
        <select name="course">
            <option value="English" name="eng" <c:if test="${sessionScope.savedCourse == 'English'}">selected="selected"</c:if>>English</option>
            <option value="Math" name="mat" <c:if test="${sessionScope.savedCourse == 'Math'}">selected="selected"</c:if>>Math</option>
            <option value="Computer Science" name="sci" <c:if test="${sessionScope.savedCourse == 'Computer Science'}">selected="selected"</c:if>>Computer Science</option>
        </select>
        <p><input type="submit" value="Pass data" /></p>
    </form>
    <hr />
    <h2>Testing submitted and saved parameter</h2>
    <p>Passed "course" parameter (will display nothing after auto REFRESH) = <span style="color: #FF0000">${param.course}</span></p>
    <p>Stored "savedCourse" attribute = <span style="color: #FF0000">${sessionScope.savedCourse}</span></p>
</body>
</html>

有关其他信息,请查看此答案:https://stackoverflow.com/a/17280533/814702


关于您的代码的一些注意事项:

  • 设置 session 属性和下一行有什么意义 从 session 获取这个属性,当它已经可用时(在 selurl 变量)?

  • HttpSession#setAttribute(String name, Object value) 方法不返回 任何东西 (void),因此您不能像在代码中那样将 void 分配给 String 类型的变量 opt。此代码不会编译并给您一个错误:incompatible types。

  • request.getParameter("urlsel")返回null的原因是 因为它是一个刷新,因此是一个 NEW 请求,而 请求 在新请求之间重置属性。在这里阅读:Servlet Redirection to same page with error message。

【讨论】:

  • +1 永远如此出色的努力!这应该是公认的答案。
  • @Gloserio 足以成为已接受答案的补充。谢谢你的好话)
  • 好的。你的答案的注释确实很有趣,我想在我的答案中提到第一个,但我认为我应该专注于给出一个简洁的答案;很高兴,你做得更好。
  • @Gloserio 谢谢。 OP只需要更清楚地撰写他的问题,尤其是标题,否则它不能反映他的问题的核心。但我相信他会明白的。
  • 我觉得他有点困惑。但是,是的,也许一些后期编辑是最受欢迎的。这可能会误导人们认为这里的问题是关于 request 或 servlet 或 refresh 我们真的是少得多。
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多