JAVAEE_Servlet_19_重定向可以解决页面刷新问题(sendRedirect)
重定向可以解决页面刷新问题(sendRedirect)
在向数据库中添加数据的时候,如果使用转发(getRequestDispatcher),数据插入成功后,转发到提示插入成功页面,在数据插入成功页面刷新该页面,那么就会再次向数据库中添加一遍该数据,因为转发是一次请求,刷新一次添加一次数据。
如果使用重定向(sendRedirect),那么数据插入成功之后跳转到提示插入成功页面,此时刷新该页面,刷新的只是提示插入成功页面,因为重定向是两次请求。
代码:
向数据库中插入数据Servlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*; public class SaveServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决中文乱码问题
request.setCharacterEncoding("UTF-8"); //获取表单数据
String userCode=request.getParameter("usercode");
String userName=request.getParameter("username"); //创建数据库连接对象
Connection connection=null;
PreparedStatement preparedStatement=null; try {
// 连接数据库
Class.forName("com.mysql.cj.jdbc.Driver"); // 获取连接
connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
"root","123456"); // 获取预编译数据库操作对象
String sql="insert into t_user(usercode,username)values(?,?)";
preparedStatement=connection.prepareStatement(sql); //给预编译数据库操作对象插入值
preparedStatement.setString(1,userCode);
preparedStatement.setString(2,userName); //执行SQL语句
int count=preparedStatement.executeUpdate(); // 显示执行结果
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
if(count!=0){
out.print("数据插入成功,正在跳转...");
//转发
//request.getRequestDispatcher("/SearchServlet").forward(request,response);
//跳转
response.sendRedirect("/myWeb/SearchServlet");
} } catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally { //释放资源
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
- 提示成功页面,并把数据库中的数据显示出来的 Servlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class SearchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
request.setCharacterEncoding("UTF-8");
//创建数据库连接对象
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
// 连接数据库
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取连接
connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
"root","123456");
// 获取预编译数据库操作对象
String sql="select * from t_user";
preparedStatement=connection.prepareStatement(sql);
//执行SQL语句
resultSet=preparedStatement.executeQuery();
//处理查询结果集
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
//HTML代码
out.print(" <!DOCTYPE html>");
out.print("<meta http-equiv=\"content-type\" content=\"text/html\" charset=\"utf-8\"/> ");
out.print(" <head>");
out.print(" <meta charset='UTF-8'>");
out.print(" <title>用户信息</title>");
out.print(" </head>");
out.print(" <body>");
out.print(" <h3 align='center'>用户信息表</h3>");
out.print(" <hr width='60%'>");
out.print(" <table border='1' align='center' width='50%'>");
out.print(" <tr align='center'>");
out.print(" <th>序号</th>");
out.print(" <th>用户编号</th>");
out.print(" <th>用户姓名</th>");
out.print(" </tr>");
int i=1;
while(resultSet.next()){
String userCode=resultSet.getString("usercode");
String userName=resultSet.getString("username");
out.print(" <tr align='center'>");
out.print(" <th>"+(i++)+"</th>");
out.print(" <th>"+userCode+"</th>");
out.print(" <th>"+userName+"</th>");
out.print(" </tr>");
}
out.print(" </table>");
out.print(" </body>");
out.print(" </html>");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
JAVAEE_Servlet_19_重定向可以解决页面刷新问题(sendRedirect)的更多相关文章
- C# 中解决页面刷新后字体等变大问题
来源:http://blog.csdn.net/wcsjsdn/article/details/5109605 我们在.net开发中时常会遇到一个问题,那就是,当点击某个按钮后,调用js语句,当点击& ...
- vue路由传参的三种方式以及解决vue路由传参页面刷新参数丢失问题
最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$r ...
- vue路由传参页面刷新参数丢失问题解决方案
最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$r ...
- 解决angular2页面刷新后报404错误
如果你的angular项目部署到一个tomcat容器里面,localhost:8080是JavaWeb的主页,localhost:8080/driver/login是你angular2项目的登陆地址. ...
- AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题
解决AngualrJS页面刷新导致异常显示问题 绪 俗话说,细节决定成败,编程亦是如此.编程过程中我们可能会不自觉的忽视一些细节问题,殊不知,这些细节正是导致页面显示出现问题的地方.今略举一例,与君共 ...
- vue 使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- 2、vuex页面刷新数据不保留,解决方法(转)
今天这个问题又跟页面的刷新有一定的关系,虽然说跟页面刷新的关系不大,但确实页面刷新引起的这一个问题. 场景: VueX里存储了 this.$store.state.PV这样一个变量,这个变量是在app ...
- 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- 移动端点击返回时强制页面刷新解决办法(pageshow)
在做移动端项目的时候经常遇到这样一个功能比如: 返回后页面不刷新,一些失效的信息依然显示在页面上.这个问题在iphone手机上会出现,在Android手机上返回时会自动刷新(由于手机机器种类不多,无法 ...
随机推荐
- 1.代码规范之 if 语句编写
最近在看项目代码的时候, 看到需要判断的地方,出现了if的多重嵌套, 甚至是出现了十几层的嵌套, 代码的阅读性非常之差. 简单的举个例子(这里只是两层的嵌套): public class demo ...
- Debain 系统U盘安装完全图解
习惯了使用图形界面的操作,总有一股想要切换到文字界面的Linux的冲动,刚好趁家里的老台式机,没什么用了,就打算用来玩下Linux,在一路安装与使用的过程中,碰到了许多的问题.顺便记录下来,以希望可以 ...
- dpi dp px 换算关系
getResources().getDisplayMetrics().densityDpi 就是屏幕密度.getResources().getDisplayMetrics().density 也可以理 ...
- DCL之单例模式
所谓的DCL 就是 Double Check Lock,即双重锁定检查,在了解DCL在单例模式中如何应用之前,我们先了解一下单例模式.单例模式通常分为"饿汉"和"懒汉&q ...
- if...else和switch...case
一.位运算 class Demo01 { public static void main(String[] args) { int a = 5; int b = 3; /* 0000 0101 |00 ...
- .NET Core Generic Host项目使用Topshelf部署为Windows服务
1..NET Core Generic Host是什么? 在.NET Core 2.1版本加入了一种新的Host,即Generic Host(通用主机). 现在在2.1版本的Asp.Net Core中 ...
- kubernets资源预留
一. Kubelet Node Allocatable Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和Sy ...
- AJAX基本操作
XMLHttpRequest对象: XMLHttpRequest 是 AJAX 的基础.所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) ...
- Java 多线程 02
多线程·线程间通信 和 GUI 单例设计模式 * A:单例设计模式 * 保证类在内存中只有一个对象 * B:如何保证 * a:控制类的创建,不让其他类来创建泵类的对象,私有化构造方法 * b:在本类中 ...
- WAV16T VPX国产化千兆交换板
WAV16T是基于盛科CTC5160设计的国产化3U三层千兆VPX交换板,提供16路千兆电口,采用龙芯 2K1000处理器.支持常规的L2/L3协议,支持Telnet.SNMP.WEB,CLI等多 ...