首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

自己写的一个简单的购物系统,刷新总是追加记录~求高手解决!解决办法

2012-01-10 
自己写的一个简单的购物系统,刷新总是追加记录~~求高手解决!问题是:购买一次以后,在当前浏览器F5刷新后总

自己写的一个简单的购物系统,刷新总是追加记录~~求高手解决!
问题是:购买一次以后,在当前浏览器   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( "地址 ");

热点排行