日期:2014-05-20  浏览次数:20970 次

<form>中的action到底是属于转发还是重定向?
举个简单的例子:
假设登陆页面(input.jsp)如下

<%@ page language="java" contentType="text/html;charset=GBK"%>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form name="form1" method="post" action="control.jsp">
用户名:<input type="text" name="userName">
密码:<input type="password" name="pwd">
<input type="submit" value="登陆">
</form>
</body>
</html>

处理页面(control.jsp)如下

<%@ page language="java" contentType="text/html;charset=GBK"%>
<html>
<head>
<title>登陆处理页面</title>
</head>
<body>
<%
request.setCharacterEncoding("GBK");
String name=request.getParameter("userName");
String pwd=request.getParameter("pwd");
if(name.equals("sa")&&pwd.equals("sa")){
//response.sendRedirect("welcome.jsp");
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}
%>
</body>
</html>

action属性表示的是提交页面的地址这里是control.jsp,如果理解为重定向的话,那么就不能获取到request,control.jsp中的代码就没有意义了,但是测试后确实打开了welcome.jsp页面。但是如果理解为转发的话,为什么我浏览器地址栏最后显示的是control.jsp,而不是一开始的input.jsp呢?这里请注意,我说的是input.jsp和control.jsp两个页面之间的关系,不是control.jsp和welcome.jsp之间的关系,control.jsp和welcome.jsp之间经过测试,如果是重定向地址栏的确是welcome.jsp如果是转发的话地址栏就是control.jsp,希望哪位高手能够解释清楚~

------解决方案--------------------
input.jsp和control.jsp这两个页面的关系根本和你所说的转发与重定向无关,那完全是两个请求,而且这两个请求之间没有直接的关系(因为http协议是无状态的)。

第一个请求是get input.jsp,第二个请求是post control.jsp
------解决方案--------------------
登陆页面是客户端的。而转发和重定向是属于服务端页面跳转的概念。而且我觉得处理界面用servlet比较好。
------解决方案--------------------
form方式提交既不是重定向也不是请求转发,因为它不是通过request.getRequestDispatcher()  或者 response.sendRedirect()  跳转的,就是一个普通的和超链接一样的跳转方式,不同的是 它会把form内所有的表单元素 全部提交到指定的页面所有就可以通过request.getParameter()获取参数了,同样 超链接后面的?的参数也是一样一样的。
------解决方案--------------------
引用:
那为什么在control.jsp页面中能够获取到request,难道是 使用了什么传递吗?

收到的request是用户在input.jsp页面通过浏览器向control.jsp发送的表单形式的请求,你这里肯定有哪里没搞清楚。
------解决方案--------------------
几位大神回答的很好