uot;no");
String name = request.getParameter("name");
Connection connection = null;
PreparedStatement preparedStatement = null;
// 表示影响数据库的行数
int count = 0;
try {
// 连接数据库
connection = DBUtil.getConnection();
// 注意: ? 不要加 '', ""单双引号,不然无法识别到该占位符的
String sql = "INSERT INTO studnet (`no`,`name`) VALUES(?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,no);
preparedStatement.setString(2,name);
count = preparedStatement.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
// 释放资源
DBUtil.close(connection,preparedStatement,null);
}
if(count == 1) {
// 添加成功
// 先用 转发机制 ,转发服务器内部,不要加项目名
// request.getRequestDispatcher("/succeed.html").forward(request,response);
// 优化修改为重定向:重定向前端需要指明 项目名(/项目的根路径)
// request.getContextPath() 该方法可以获取到: "/项目的根路径",注意是带有 / 的,所以不要多写了 /
response.sendRedirect(request.getContextPath()+"/succeed.html");
} else {
// request.getRequestDispatcher("/error.html").forward(request,response);
response.sendRedirect(request.getContextPath()+"/error.html");
}
}
}
4. 转发 与 重定向的区别
- 代码上的区别:
转发 :转发的路径 不要 写项目名(项目的根路径)
// 获取请求转发器对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/dept/list");
// 调用请求转发器对象的forward方法完成转发
dispatcher.forward(request, response);
// 合并一行代码
request.getRequestDispatcher("/dept/list").forward(request, response);
// 转发的时候是一次请求,不管你转发了多少次。都是一次请求。
// AServlet转发到BServlet,再转发到CServlet,再转发到DServlet,不管转发了多少次,都在同一个request当中。
// 这是因为调用forward方法的时候,会将当前的request和response对象传递给下一个Servlet。
重定向 :重定向的路径,需要 写项目名(项目的根路径)
response.sendRedirect("/servlet12/b");
// 可以使用 request.getContextPath() 获取到项目名(也就是项目名的根路径),注意该返回的路径是带 “/”的 /项目名,所以不要多写了 “/”
response.sendRedirect(request.getContextPath()+"/index.html");
- 形式上有什么区别 ?
- 转发和重定向的本质区别 ?
- 转发:是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的。所以无论 服务器
转发
了多少次,而我们前端也就是浏览器端是不知道我们服务器端对这个请求内部转发处理了多少次。 并且无论我们服务器内部转发了多少次,前端浏览器都仅仅只会认为仅仅只转发了一次,也就是仅仅发送了一次请求 。因为我们服务器端虽然进行了转发,但是浏览器的地址栏上的请求路径的地址是没有改变的(还是初始的请求路径)
- 重定向:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。当浏览器请求一个
URL
时,服务器返回一个重定向指令,告诉浏览器要处理该请求的URL地址已经变了,麻烦使用新的URL
再重新发送新请求。所以,前端浏览器是知道我们重定向了多少次的,而且重定向是“重定向几次,就会发送几次请求”。
- 相同点: 无论是 “转发”还是 “重定向”都可以跳转到另外一个资源当中,都是不仅仅是 Servlet 资源,也可以是其他的服务器上合法的资源比如:html等等。
- 优缺点上的区别:
- 转发: 可以通过请求域存储数据的方式,实现多个Servlet 数据的共享。因为:多少次转发都是只视为一次请求。但是转发存在刷新问题 。
- 重定向:没有刷新问题,但是无法通过请求域存储数据的方式,实现多个Servlet 数据的共享。因为:“重定向几次,就会发送几次请求”。而请求域只在一次请求范围有效。
- 转发与重定向 举例图示上的描述:
转发:
重定向:
5. “重写向”与“转发”的合理选择
- 如果在上一个Servlet当中向request域当中绑定了数据,希望从下一个Servlet当中把request域里面的数据取出来,使用转发机制。
- 剩下所有的请求均使用重定向。(重定向使用较多。)
重定向的目的是当Web应用升级后,如果请求路径发生了变化,可以将原来的路径重定向到新路径,从而避免浏览器请求原路径找不到资源。
6. 总结:
-
转发 :指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。
-
转发是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的 ,而我们前端也就是浏览器端是不知道我们服务器端对这个请求内部转发处理了多少次。 并且无论我们服务器内部转发了多少次,前端浏览器都仅仅只会认为仅仅只转发了一次,