自己写的一个简单的购物系统,刷新总是追加记录~~求高手解决!
问题是:购买一次以后,在当前浏览器 F5 刷新后总是自动追加记录.
目前分析是jsp的代码问题。
测试软件:tomcat-5.5
jsp源代码如下:
<%@page contentType= "text/html;charset=gb2312 " %>
<%@page import= "shop.*,java.util.* " %>
<html>
<head>
<title> 手机大甩卖 </title>
</head>
<body>
<center>
<h1> 欢迎购物 </h1>
<form action= "/mvc2/zhang/shopservlet " name= "show " value= "add " method= "post ">
<select name= "Favorite ">
<option> 三星|韩国|银白|$1 </option>
<option> 三星|韩国|银白|$2 </option>
<option> 三星|韩国|银白|$3 </option>
<option> 三星|韩国|银白|$4 </option>
<option> 三星|韩国|银白|$3 </option>
<option> 三星|韩国|银白|$2 </option>
</select>
数量 <input type= "text " name= "buy " size= "3 ">
<input type= "hidden " name= "cmd " value= "add ">
<input type= "submit " value= "购买 ">
</form>
<%
Vector vector = (Vector)session.getAttribute( "total ");
if(vector!=null && vector.size()> =0){
%>
<table bgcolor= "#238734 " border= "2 " width= "50% ">
<tr>
<td> 产品名 </td>
<td> 产地 </td>
<td> 颜色 </td>
<td> 单价 </td>
<td> 数量 </td>
</tr>
<%
for(int index=0;index <vector.size();index++){
ShopBean sh = (ShopBean)vector.elementAt(index);
%>
<tr>
<td> <%=sh.getName()%> </td>
<td> <%=sh.getCountry()%> </td>
<td> <%=sh.getColor()%> </td>
<td> <%=sh.getPrice()%> </td>
<td> <%=sh.getNumber()%> </td>
<form action= "/mvc2/zhang/shopservlet " name= "shop " method= "post ">
<td>
<input type= "submit " name= "sumbit " value= "删除 " size= "5 ">
<input type= "hidden " name= "cmd " value= "delect ">
<input type= "hidden " name= "del " value= " <%=index%> ">
</td>
</form>
<td> <%=index%> , <%=vector.size() %> </td>
</tr>
<% } %>
</table>
<% String money = (String)request.getAttribute( "count ");%>
<%if(money!=null){%>
<td> 总金额:
<%
out.println( '$ ' + money);
}
%> </td>
<form action= "/mvc2/zhang/shopservlet " name= "shop " method= "post ">
<input type= "submit " name= "shop " value= "结帐 " size= "5 ">
<input type= "hidden " name= "cmd " value= "count ">
</form>
<% } %>
</form>
</center>
</body>
</html>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
javaBean代码如下:
package shop;
public class ShopBean{
private String name = " ";
private String country= " ";
private String color = " ";
private float price = 0;
private int number = 0;
public ShopBean(){
}
//名
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//产地
public void setCountry(String country){
this.country = country;
}
public String getCountry(){
return country;
}
//颜色
public void setColor(String color){
this.color = color;
}
public String getColor(){
return color;
}
//单价
public void setPrice(float price){
this.price = price;
}
public float getPrice(){
return price;
}
//数量
public void setNumber(int number){
this.number = number;
}
public int getNumber(){
return number;
}
/**public String toString(){
return
}*/
public static void main(String[] args){
ShopBean s = new ShopBean();
s.setName( "qer ");
s.setCountry( "as ");
s.setColor( "xxz ");
s.setPrice(23);
s.setNumber(23);
System.out.println(s.getName());
System.out.println(s.getCountry());
System.out.println(s.getColor());
System.out.println(s.getPrice());
System.out.println(s.getNumber());
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Servlet代码:
package shop;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShopServlet extends HttpServlet{
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
req.setCharacterEncoding( "GBK ");
resp.setCharacterEncoding( "GBK ");
HttpSession session = req.getSession(true);
String cmd = req.getParameter( "cmd ");
Vector vector = (Vector)session.getAttribute( "total ");
if(!cmd.equals( " ")){
if(cmd.equals( "add ")){
//String count = session.getAttribute( "count ");
PrintWriter out = resp.getWriter();
ShopBean sh = getSh(req);
if(vector==null){
vector = new Vector();
vector.addElement(sh);
}
else{
vector.addElement(sh);
}
}
if(cmd.equals( "delect ")){
String sIndex = req.getParameter( "del ");
int index = Integer.parseInt(sIndex);
vector.removeElementAt(index);
}
if(cmd.equals( "count ")){
float scount =0;
for(int i=0; i <vector.size();i++){
ShopBean one = (ShopBean)vector.elementAt(i);
float onePrice = one.getPrice();
int oneNumber = one.getNumber();
scount += (onePrice * oneNumber);
}
String money = " " + scount;
req.setAttribute( "count ",money);
}
session.setAttribute( "total ",vector);
getServletConfig().getServletContext().getRequestDispatcher( "/shop.jsp ").forward(req,resp);
}
else
{
getServletConfig().getServletContext().getRequestDispatcher( "/shop.jsp ").forward(req,resp);
}
}
//获得表单中的值,并将其传给ShopBean对象
public ShopBean getSh(HttpServletRequest req){
String sSh = req.getParameter( "Favorite ");
StringTokenizer stSh = new StringTokenizer(sSh, "| ");
String name = stSh.nextToken();
String country = stSh.nextToken();
String color = stSh.nextToken();
String sPrice = stSh.nextToken();
sPrice = sPrice.replace( '$ ', ' ').trim();
//float price =;
String sNumber = req.getParameter( "buy ");
int number = Integer.parseInt(sNumber);
ShopBean sh = new ShopBean();
sh.setName(name);
sh.setCountry(country);
sh.setColor(color);
sh.setPrice(Float.parseFloat(sPrice));
sh.setNumber(number);
return sh;
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
虚拟路径设置:
<web-app>
<servlet>
<servlet-name> asd </servlet-name>
<servlet-class> shop.ShopServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> asd </servlet-name>
<url-pattern> /zhang/shopservlet </url-pattern>
</servlet-mapping>
</web-app>
[解决办法]
在你的form加多一个hidden,value为自己生成的一个值,数据提交后把hidden值保存在cookie里,刷新时(表单再次提交)把hidden和cookie比较一下,如果相同就不做处理
有很多方法,这只是一种
[解决办法]
你没用javabean吧?
[解决办法]
用Struts 的话好象有一个功能是可以避免刷新问题。
[解决办法]
<%@ page contentType= "text/html; charset=gb2312 " language= "java " import= "java.sql.*,java.io.* "%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= "http://www.w3.org/1999/xhtml ">
<head>
<meta http-equiv= "Content-Type " content= "text/html; charset=gb2312 " />
<title> Untitled Document </title>
</head>
<body>
<%
String currentRecord = null;//保存文本的变量
BufferedReader file; //BufferedReader对象,用于读取文件数据
String nameOfTextFile = "E://count1.txt "; //E:/apache-tomcat-5.5.12/webapps/bbs/
//读取
file = new BufferedReader(new FileReader(nameOfTextFile));
String readStr =null;
int writeStr =0; //如果计数文本中的计数值为空则让它显示时变成1并写入
try
{ readStr = file.readLine(); }
catch (IOException e)
{ System.out.println( "读取数据错误. "); }
if (readStr == null) readStr = "没有任何记录 ";
//判断cookie,第一次登陆时加1,刷新时不累计计数
else if (request.getHeader( "Cookie ")==null)
{ writeStr = Integer.parseInt(readStr)+1;}
else
{ writeStr = Integer.parseInt(readStr);}
//写入时控制因为刷新引起的重复计数
if (request.getHeader( "Cookie ")==null)
{
try {
PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile));
pw.println(writeStr);
pw.close();}
catch(IOException e) {
out.println(e.getMessage());}
}
%>
<%=writeStr%>
</body>
</html>
这个是一个防止刷新的计数器,你看你用得上不?只是要另外写个文件在 E://count1.txt
[解决办法]
作个同步控制啊
[解决办法]
日,多简单的问题啊,提交执行完了加个跳转,哪怕是跳转到本页面也行,这样就不用怕刷新造成重复提交了
response.sendRedirect( "地址 ");