【问题标题】:http request attributes and parameters in jstl, with a servletjstl中的http请求属性和参数,带有一个servlet
【发布时间】:2013-08-23 02:47:09
【问题描述】:

我需要对从 Web 表单进入 servlet1 的数字进行一些验证。该过程需要类似于:

1.) User sends two numbers (t1 and t2) to servlet1 from a web form  
2.) Servlet 1 validates the numbers by checking:  if (t2-t1)>2 , then t2 = t1 + 2
3.) The validated numbers are actually sent directly back to the jsp  
4.) The end user's browser calls a different servlet2 with the output from this servlet1.  
5.) The end user might repeat this process many times, producing many iterations of customized output  

根据我的研究,我认为这意味着:

a.) setting attributes in servlet1 for t1 and t2 which are sent back to the user's browser with the results of the validation, so that  
b.) numbers with a valid difference (<=2) can then be sent into servlet2.  

我的问题与如何管理参数和属性之间的差异有关。我认为数据从 html 输入文本框中的参数开始。我在文本框中有 jstl 代码,以确保有有效数据。但我的 jstl 只适用于参数。在最终用户第一次使用 Web 表单后,我认为所有后续迭代都将使用属性而不是参数。谁能告诉我如何重新编写将管理属性和参数值的代码,以便数据始终是它应该是什么?

到目前为止,我有一个带有 html 表单的 jsp,其中包含以下格式的输入字段:

<input type="text" name="t1" value="${empty param.t1 ? '-1' : param.t1}" size="15" />  
<input type="text" name="t2" value="${empty param.t2 ? '1' : param.t2}" size="15" />  

上面的jsp是一个servlet1指定的请求调度器,它的doPost方法包括如下内容:

String t1 = request.getParameter("t1");  
String t2 = request.getParameter("t2");  
if(((double)t2-(double)t1)>2){  
    t2 = String.valueOf((double)t1 + 2);  
}  
request.setAttribute("t1", t1);  
request.setAttribute("t2", t2);  

如何更改此代码以使用属性维护正确的数据值?

暂时不要介意,我还需要检查输入是否实际上是数字等。

【问题讨论】:

  • 您根本不需要为此使用属性。
  • @EJP 太好了。谢谢你。然后你能告诉我它是如何按照你的想法工作的吗?我读过的东西表明我不能在 servlet 中设置参数,因此如果我想设置 t2 = (t1 + 2),我必须使用属性

标签: java jsp servlets jstl


【解决方案1】:

如果您希望浏览器向Servlet2 发出请求,您可以这样做

String t1 = request.getParameter("t1");  
String t2 = request.getParameter("t2");  
if(((double)t2-(double)t1)>2){  
    t2 = String.valueOf((double)t1 + 2);  
}  

response.sendRedirect(servlet2URL+"?t1="+t1+"&t2="+t2);

如果Servlet1 可以直接调用Servlet2。 为此,Servlet2 需要使用 getAttribute 而不是 getParameter,因为它们可能是不同的值。

String t1 = request.getParameter("t1");  
String t2 = request.getParameter("t2");  
if(((double)t2-(double)t1)>2){  
    t2 = String.valueOf((double)t1 + 2);  
}  
request.setAttribute("t1", t1);  
request.setAttribute("t2", t2);  
RequestDispatcher requestDispatcher = request.getRequestDispatcher(servlet2URL);
requestDispatcher.forward(request,response);

选项 3 调度 jsp,包括对 servlet 2 的调用

String t1 = request.getParameter("t1");  
String t2 = request.getParameter("t2");  
if(((double)t2-(double)t1)>2){  
    t2 = String.valueOf((double)t1 + 2);  
}  
request.setAttribute("t1", t1);  
request.setAttribute("t2", t2);  
getServletContext().getRequestDispatcher("foo.jsp").forward 
       (req, res); 

在 foo.jsp 中

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
t1 = <c:out value="${t1}"/>
t2 = <c:out value="${t1}"/>
<img src="url-pattern-for-servlet2">
...

【讨论】:

  • 感谢您抽出宝贵时间回复。如果我在 servlet2 中进行验证,我将无法告诉用户我已经编辑了他们的参数,因为 servlet2 只返回一个 gif。我不能让 servlet1 直接调用 servlet2,因为 servlet2 只返回一个 gif,我需要从 jsp 中的 标记中调用 gif,以便用户获得完整的 html 页面,而不仅仅是一个独立的图像文件。这会改变你的建议吗? +1 试图提供帮助。
  • @CodeMed 选项 3 有帮助吗?
  • 您的选项 3 给了我足够的帮助,让我自己轻松搞定其余部分。我必须使用 c:choose 来区分应该使用属性值、参数值或默认值的情况。但你的建议让我朝着正确的方向开始。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多