【求助】JSP表单提交时几种情况的差别

頑笑 2009-03-19 12:19:15
写了一个简单的JSP,测试页面提交,代码如下:

<html>
<head>
<base href="<%=basePath%>">

<title>My JSP '2.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>
<%
request.setAttribute("attributeText", "attributeText");
%>
<body>
<%=request %>
<form action="CheckRequest?urlText=urlText" method="post">
<input type="text" name="formText" value="formText">
<input type="submit" value="提交">
</form>
</body>
</html>

然后在对应的servlet里面打印request中的值,代码如下:

System.out.println(request);
System.out.println(request.getParameter("urlText"));
System.out.println(request.getParameter("formText"));
System.out.println(request.getAttribute("attributeText"));

结果是:
org.apache.catalina.connector.RequestFacade@114382d
urlText
formText
null
这里的request和jsp页面中的request明显是同一个,可是为什么request.getAttribute("attributeText")的值是null呢?这是问题一。

还有第二个问题:如果将form的提交方式改为get方式,那么servlet中打印结果又是:
org.apache.catalina.connector.RequestFacade@114382d
null
formText
null
这又是为什么呢?

希望能有高手解答,我真的很想知道一些原理方面的东西,先谢谢了。
...全文
325 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZiSheng 2009-03-21
  • 打赏
  • 举报
回复

我的猜测,也许Tomcate是为了节省时间,不再创建request对象,而是将该对象内部的内容改变而已。
ZiSheng 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Cupid1984 的回复:]
大家这么热心,先谢谢了,不过还是请再仔细看看我8楼的测试结果啊,结果是true。
[/Quote]
我试试,二者是不可能是同一个对象的。
suncheng_hong 2009-03-21
  • 打赏
  • 举报
回复
http协议是无连接的。页面加载以后就会与服务器断开连接,同时request失效。再次提交时,又会生成新的request
fulianglove 2009-03-20
  • 打赏
  • 举报
回复
从JSP--------->HTML页面----------->再次提交到服务器
fulianglove 2009-03-20
  • 打赏
  • 举报
回复
请理解request的作用,request一次请求中可以保存一些值在此过程中传递。
JSP页面上使用
<%
request.setAttribute("attributeText", "attributeText");
%>
时还是动态页面,这个时候你仍然在JSP页面上使用request.setAttribute("");是可以取到值的。(这就是page的作用)
但是JSP是会被解析成HTML静态页面,HTML页面生成后此request(包括其包含的数据)就失效了,再次提交后自然在request里取不到
suncheng_hong 2009-03-20
  • 打赏
  • 举报
回复
一:
jsp中由form提交给servlet,是在同一个request,没错,但是只能取到form表单的内容,request.setAttribute("attributeText", "attributeText"); 这个request
和servlet中的request不是一个。
二:
System.out.println(request.getParameter("urlText")); 结果为null 吗? 注意你的url urlText有没有传过来?
System.out.println(request.getAttribute("attributeText")); 为null 与第一个原因一样
liang__ 2009-03-20
  • 打赏
  • 举报
回复
第一个问题我觉得是request的作用域的问题。两个request应该不是同一个。

当提交表单的时候就是建立了一个新的请求,有各自的request.
第二个就是post方式提交和get方式提交的差别。
realcbb 2009-03-20
  • 打赏
  • 举报
回复
第一个问题肯定不是同一个request,RequestFacade是同一个实例,但不是request就是同一个。楼主可以去看看tomcat中RequestFacade的源码,我没猜错的话它应该是把request作为变量。
第二个问题post和get两种方式提交的差别,没什么好讲的。
oklinsong 2009-03-20
  • 打赏
  • 举报
回复
在请求jsp页面时,把jsp翻译成servlet,生成html发送到客户端,这个request就过期了,点击submit按钮时,回再次生成一个
request,里面包含你表单里的属性。

頑笑 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Cupid1984 的回复:]
引用 7 楼 huguang 的回复:
另外你说的放在session中,是怎么比较的,还请贴出代码

你说的我知道, 我也只是说明我的测试结果(虽然自己也不相信).
代码如下:
1.jsp中:
<%
session.setAttribute("inSession", request);
%>

servlet中:
System.out.println(request == request.getSession().getAttribute("inSession"));

请你再帮忙看看啊.
[/Quote]
大家这么热心,先谢谢了,不过还是请再仔细看看我8楼的测试结果啊,结果是true。
我真的很想知道原因,或者推荐我应该看哪些资料。
lovezx1028 2009-03-20
  • 打赏
  • 举报
回复
request在这里相当一个作用域,没有起到实质的作用,本身没有从request中取到值,一般情况下,都是用getAttribute("attributeText");  并且都是有范围属性规定的。。
llsuixin 2009-03-19
  • 打赏
  • 举报
回复
问题1:
如果你是用struts的话 struts-config.xml里<forwar/>的dredirect设置为"false"
问题2:
get一般是通过在地址栏输入url访问的。
post则是通过页面的跳转。你这里应该用post。用get的话好像传递不了urlText的值。
huguang 2009-03-19
  • 打赏
  • 举报
回复
这里的request和jsp页面中的request明显是同一个
这句话错了,这里是两个request

第一个是请求那个jsp的时候的request
第二是请求servlet的时候,服务器端会生成新的request


第二个问题get提交的时候,会把表单的参数放在url中提交,所以你原来写在url中的,同样算是get的参数,被替换了,不知道这么说算不算严谨
关于这个问题,建议你有时间看一下http中关于浏览器发送请求的问题
台城柳月 2009-03-19
  • 打赏
  • 举报
回复
问题1:
request.setAttribute("attributeText", "attributeText");

request.getAttribute("attributeText")
是两次请求,是不可能存在于同一个request作用域中的
songbeirui 2009-03-19
  • 打赏
  • 举报
回复
<%
request.setAttribute("attributeText", "attributeText");
%>
如果你在这个页面上停留了十分钟,然后你在跳转到servlet,你认为他还是在一个请求中吗??
所以说是不同的请求!
hwyellow 2009-03-19
  • 打赏
  • 举报
回复
当你在post请求中加入参数是,此请求其实就已经算是一个get请求了,但由于是post请求,所以在request中可以取得,
当换做get请求时,参数应该不会与表单数据放在一起,而是独自提交到服务器,所以取不到了,这个是我的猜测!
request肯定不是同一个的!因为当服务器启动后,当有用户请求页面是,就会编译所有的jsp文件,你的页面中request已经由服务器解析完了,服务器将
请求页面以文本流的形式返回给客户端进行显示,这个你可以看看在服务器的work目录下的缓存文件就会知道了,当用户再次提交表单时,服务器会创建一个request对象,
将表单信息存储在request中进行传输,所以当然在servlet中可以取!

我的见解,希望可以帮到你,不对也不要骂我啊!再等高人!
頑笑 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huguang 的回复:]
另外你说的放在session中,是怎么比较的,还请贴出代码
[/Quote]
你说的我知道, 我也只是说明我的测试结果(虽然自己也不相信).
代码如下:
1.jsp中:
<%
session.setAttribute("inSession", request);
%>

servlet中:
System.out.println(request == request.getSession().getAttribute("inSession"));

请你再帮忙看看啊.
huguang 2009-03-19
  • 打赏
  • 举报
回复
另外你说的放在session中,是怎么比较的,还请贴出代码
huguang 2009-03-19
  • 打赏
  • 举报
回复
但是为什么1.jsp打印出的request( <%=request %>)和servlet打印出的request是一样的呢?

这个打出来的应该是request的toString()决定的,看样子是hashCode
可是哪条理论说,打出来的一样,就是一个request的?
还请指明!!

而且据我所知,hashCode是和equals方法的实现有直接关系的
頑笑 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huguang 的回复:]
这里的request和jsp页面中的request明显是同一个
这句话错了,这里是两个request

第一个是请求那个jsp的时候的request
第二是请求servlet的时候,服务器端会生成新的request



第二个问题get提交的时候,会把表单的参数放在url中提交,所以你原来写在url中的,同样算是get的参数,被替换了,不知道这么说算不算严谨
关于这个问题,建议你有时间看一下http中关于浏览器发送请求的问题
[/Quote]
请注意我标红的部分,我刚开始也是这样想的,但是为什么1.jsp打印出的request(<%=request %>)和servlet打印出的request是一样的呢?
而且我曾在1.jsp中将request藏在session中(session.setAttribute("requestInSession", request);),然后在servlet中用==比较,也是true,这又是为什么呢?
加载更多回复(1)

81,105

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧