Java绿地(~ming~)

Java 草地

常用链接

统计

最新评论

网上书店(jsp+servlet+javabean)

网上书店(jsp+servlet+javabean)

一.  过滤器的使用:

1.     对中文字符的处理:(若采用mssql略简单,mysql需设置为UTF-8,本项目数据库采用gb2312)

a. public class SetCharacterEncoding  implements Filter { //必须实现接口类的所有方法

public SetCharacterEncoding() {  super(); } public void destroy() {     }

   public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)  throws IOException,ServletException{

    request.setCharacterEncoding("gb2312");chain.doFilter(request,response);    }

public void init(FilterConfig filterConfig) throws ServletException {  } }

b.除在请求与响应处理外,对数据库的操作也进行过滤

url="jdbc:mysql://127.0.0.1:3306/DB?useUnicode=true&characterEncoding=GB2312";

c.也可以采取页面函数进行字符编码转换:

<%! public String convert(String s){ try{

return new String(s.getBytes("ISO-8859-1"),"GB2312"); }

catch(Exception e){return null;} } %>

2.     对用户权限的进行过滤,配置为:<url-pattern>/user/*</url-pattern> /表示项目全路径

public class UserFilter implements Filter {

String PAGE="/bookshop/admin/admin1.jsp" ;  protected FilterConfig filterConfig;

    public void doFilter(ServletRequest req, ServletResponse res,

            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest hreq=(HttpServletRequest)req;

        HttpServletResponse hres=(HttpServletResponse)res;//只有Http才有session

        HttpSession session=hreq.getSession();   String name="";

    try{ name=(String)session.getAttribute("name");

         if(name!=null){chain.doFilter(req, res);}else{hres.sendRedirect(PAGE);}}

    catch(Exception e){ e.printStackTrace();}   }

public void destroy(){this.filterConfig=null;}

    public void init(FilterConfig config) throws ServletException {

      this.filterConfig=config; }}




.CSS经典控制样式:

.button {BORDER-RIGHT: #9ac3d8 1px solid; BORDER-TOP: #cde7f4 1px solid; FONT-WEIGHT: normal; FONT-SIZE: 12px; BACKGROUND: #bedbea; BORDER-LEFT: #cde7f4 1px solid; COLOR: #0076c9; BORDER-BOTTOM: #9ac3d8 1px solid; FONT-STYLE: normal; FONT-FAMILY: 宋体, Arial, Helvetica, sans-serif; HEIGHT: 18px}

.inputbox { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; FONT-WEIGHT: normal; FONT-SIZE: 12px; BACKGROUND: #ffffff; BORDER-LEFT: #cccccc 1px solid; COLOR: #666680; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: 宋体, Courier, Helvetica, sans-serif }// <TABLE cellSpacing=2 cellPadding=0 align=center border=0>不同表格无缝

.txt_db { FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #666680; LINE-HEIGHT: 23px; FONT-FAMILY: "宋体", "Courier", "Helvetica", "sans-serif"

.tb_dotted { BORDER-RIGHT: #cccccc 1px dotted; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted }

.top_tb_solid {BORDER-RIGHT: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; WIDTH: 768px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 25px; BACKGROUND-COLOR: #f2f2f2}




二. 
管理员模块:

1.如果没有过滤器可以采用:<% String name=(String)session.getAttribute("name");

try { if(!name.equals("admin")){response.sendRedirect("/project/page.jsp");  } }

   catch(Exception e){out.print("对不起,您不是管理员!");  }%>

2.防止空值出现而使单独页面无法调试:(虽然可以用空判断但是空也可能指向一个内存地址)

<% String n=null; ResultSet  rs=null;

n=request.getParameter("id");    rs=DBBean.executeQuery(sql);

    if(rs!=null && rs.next()){   } %>   <td> <%= rs.getInt("id") %></td>

 

3.用Servlet对JDBC进行封装 action=”/project/servlet?id=”//此处要写满全路径

public class UpdateServlet extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { try{ String myid=request.getParameter("id");

String sql="update table set title='"+title+"' "+"where id="+myid;

Connection conn=DBContext.getInstance.getConnection();//得到一个连接

Statement stmt=conn.createStatement();   int i=stmt.executeUpdate(sql);

if(i>0){response.sendRedirect("/project/page.jsp");}}

catch(Exception e){ e.printStackTrace();}   }

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ doGet(req,res);   }  }


4.实现表单自动提交功能: <script language=javascript>

setInterval("document.表单名.submit()",10000000)</script> 



.登陆模块:

1.     javasript对登陆控制

<form name="form1" method="post" action="/project/servlet" onSubmit="return check()">

<SCRIPT language=javascript>

function check(){

var emailreg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;var pwdreg = /[a-z0-9]$/;

if ((document.form1.name.value)=="")

{window.alert ('用户名不能为空');document.form1.name.focus();return false;}

else if ((document.form1.name.value.length)<3){window.alert ('长度不能小于3 ');

document.form1.name.focus();return false; }

else if (form1.password.value!=form1.password1.value)

{window.alert ('两次输入的密码不一致');document.form1.pwd2.focus();return false;}

else if ((!emailreg.test(document.form1.email.value))&&(document.form1.email.value!=''))

{window.alert ('Email的格式不正确');document.form1.email.focus();return false;}

else  return true; } </SCRIPT>



2.注册时间类型的处理:因为sql.Date( )必须有Long Date参数,a.如果是在sql插入系统时间则

java.sql.Date date=new java.sql.Date(new java.util.Date().getTime());


3.忽视大小写:
if(name.equalsIgnoreCase("admin")&&paw.equalsIgnoreCase("admin"))


4.用户判断:
<%  String sql=" select count(*)  from table where name like '"+name+"'  ";

  ResultSet rs=DBBean.executeQuery(sql);   rs.next( );

  int i=rs.getInt(1); if(i!=0)  { session.setAttribute("name",name); }    %>


5.为防止<%=param%>初次调用显示为null:

<% String name=""; if(!session.isNew()){name=(String)session.getAttribute("name");

                    if(name==null)  name="";}   %>



6.用include根据用户显示界面:

<% String name1=null;name1=(String)session.getAttribute("name"); if(name1!=null){ %>

 <form  name="form1" class="inputbox" > 要显示的内容:</form>  

  <% } if(name1= =null) {  %>

<form action="forward.jsp" method="post" name="form1" class="inputbox"></form><% } %>



.查询模块:
<%  ResultSet rs=null; String idh=request.getParameter("text");

String var=request.getParameter("select");   if(var.equals("按图书编号查询"))

       {  rs=DDBean.executeQuery("select * from book where id like '%"+idh+"%'"); }

else if(var.equals("按图书书名查询"))

       { rs=DDBean.executeQuery("select * from book where title  like '%"+idh+"%'"); }

if(rs!=null) { while(rs.next()){  %> 显示内容:   <% }  }   %>



.购物车:页面用到:DBBean,ShoppingCart,BookDB,BookDetails四个javaBean

1.添加,删除和清空货物:

<% if(request.getParameter("Add")!=null){

        int id=Integer.parseInt(request.getParameter("Add"));//把得到的参数转换

        BookDetails book=bookDB.getBookDetails(id);  cart.add(id,book);  }

   else if(request.getParameter("Remove")!=null){

        int id=Integer.parseInt(request.getParameter("Remove")); cart.remove(id); }

   else if(request.getParameter("Clear")!=null){  cart.clear();}  %>

备注:若cart.add中的id是String类型:cart.add(new Integer(id).toString(),book);

2.显示购物车书目总数:您的购物车内有<%=cart.getNumberOfItems()%> 本书

   显示购物车书目总价:总额;<%=cart.getTotal()%> 元


3.迭代循环显示出每本书:

<% Iterator i=cart.getItems().iterator();   while(i.hasNext()){

   ShoppingCartItem item=(ShoppingCartItem)i.next();

   BookDetails book=(BookDetails)item.getItem();  %>

<tr>

<td><a href="showcart.jsp?Add=<%=book.getId()%>">添加</a> <%=item.getQuantity()%>/>

<td><a href="cartbook.jsp?id=<%=book.getId()%>"><%=book.getTitle()%></a></td>

<td align="center"><%=book.getPrice()%></td>

<td><a href="showcart.jsp?Remove=<%=book.getId()%>">删除</a></td>

</tr> <% } %>   <p><a href="showcart.jsp?Clear=clear">清空购物车</a></p>

4.对库存的操作,可在显示购物车的页面显示<%=saleAmount%>

  购物车对库存的操作(付帐页面): <& bookDB.buyBooks(cart);%>

5.得到超链接当前的路径:<%=request.getContextPath()%>/page.jsp

 

BookDetails.java(书的详细信息)

public class BookDetails {

private int  id=0;

private String title=null;

private String  name=null;

private float price=0;

private String description=null;

private String saleAmount=null;

public BookDetails( ){   }

public BookDetails(int id, String title, String name, float price, String description,String  saleAmount)

getter/setter( ){ }

//有参构造方法供BookDB插入书籍

 

ShoppingCartItem.java(将书封装成一个类整体)

public class ShoppingCartItem {

    Object item;    int quantity;

public ShoppingCartItem(Object anItem) {

    item = anItem;  quantity = 1;   }

//有参构造方法ShoppingCart调用封装书成类

public void incrementQuantity() { quantity++; }

public void decrementQuantity() { quantity--; }

 

public Object getItem( ) { return item;   }

public int getQuantity( ) { return quantity; }}

//这两个getter供BookDB和ShoppingCart调用

 
 

 

 

 


 

BookDB.java是数据库与购物车页面之间的纽带

public class BookDB {     

public BookDetails getBookDetails(int id)throws Exception{Connection conn=null;//得到具体书

    PreparedStatement prepStmt=null;   ResultSet rs=null;

try{conn=DBContext.getInstance.getConnection();

           String selectStatement="select * from book where id=?";

prepStmt=conn.prepareStatement(selectStatement); prepStmt.setInt(1,id);

     rs=prepStmt.executeQuery(); if(rs.next()){

BookDetails bd=new BookDetails(rs.getInt(1),rs.getString(2),rs.getString(3),

rs.getFloat(4),rs.getString(5), rs.getString(6));

prepStmt.close(); return bd;    }else {return null;}  }

finally{rs.close(); conn.close(); prepStmt.close(); }  }

 

public void buyBooks(ShoppingCart cart)throws Exception{Connection conn=null;//对库存的操作

        Collection items=cart.getItems();   Iterator i=items.iterator();

try{   conn=DBContext.getInstance.getConnection(); conn.setAutoCommit(false);    while(i.hasNext()){ ShoppingCartItem sci=(ShoppingCartItem)i.next();

    BookDetails bd=(BookDetails)sci.getItem(); int id=bd.getId();

    int quantity=sci.getQuantity(); buyBook(id,quantity,conn);}

conn.commit();conn.setAutoCommit(true);}

catch(Exception ex){conn.rollback();throw ex;} finally{conn.close();   }   }

 

public void buyBook(int id,int quantity,Connection conn)throws Exception{//调用id和购买数量

PreparedStatement prepStmt=null;ResultSet rs=null;

try{ String selectStatement="select * from book where id=?";

        prepStmt=conn.prepareStatement(selectStatement); prepStmt.setInt(1,id);

         rs=prepStmt.executeQuery(); if(rs.next()){ prepStmt.close();

        String updateStatement="update book set saleAmount=saleAmount-?where id=? ";

    prepStmt=conn.prepareStatement(updateStatement);prepStmt.setInt(1, quantity);//第一个?

    prepStmt.setInt(2, id); prepStmt.executeUpdate();  prepStmt.close(); }  }

finally{   rs.close();prepStmt.close();        }   }   }

 


ShoppingCart.java(购物车的实现功能)

public class ShoppingCart{ HashMap items=null; int numberOfItems=0;//调用多个Item只能用散列表

public ShoppingCart() { items = new HashMap();  }//构造方法实例化一个散列表

 public synchronized void add(int id, BookDetails book) {   if(items.containsKey(id)) {

   ShoppingCartItem scitem = (ShoppingCartItem) items.get(id);//调用散列表的get方法取出对象

   scitem.incrementQuantity();  } else {

ShoppingCartItem newItem =new ShoppingCartItem(book);  items.put(id,newItem);}

   numberOfItems++;  }//如果书存在了单种书+1,如果书不存在根据书的id存放在散列表里面

public synchronized void remove(int id) {    if(items.containsKey(id)) {

   ShoppingCartItem scitem = (ShoppingCartItem) items.get(id); scitem.decrementQuantity();

   if(scitem.getQuantity() <= 0)items.remove(id);  numberOfItems--; }  }

protected void finalize( ) throws Throwable { items.clear();  }//用于释放内存

public synchronized void clear() {items.clear(); numberOfItems = 0; }

//getter方法:

public synchronized Collection getItems( ) {return items.values(); }//values方法返回集合迭代

public synchronized int getNumberOfItems( ) { return numberOfItems;  }

public synchronized double getTotal( ) {    double amount = 0.0;

    for(Iterator i = getItems().iterator(); i.hasNext(); ) {

    ShoppingCartItem item = (ShoppingCartItem) i.next();//购物车的集合里面迭代Item书种的类

    BookDetails bookDetails = (BookDetails) item.getItem();//每个Item又调用具体书目的信息

    amount += item.getQuantity() * bookDetails.getPrice();    } return roundOff(amount); }

  private double roundOff(double x) {long val = Math.round(x*100); return val/100.0;  } }

posted on 2007-07-10 20:34 mrklmxy 阅读(5016) 评论(20)  编辑  收藏

评论

# re: 网上书店(jsp+servlet+javabean) 2007-09-24 13:25 ←OR→

谢谢咯!!!!!!!!!!!谢谢咯!!!!!!!!!!!谢谢咯!!!!!!!!!!!谢谢咯!!!!!!!!!!!谢谢咯!!!!!!!!!!!  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2008-01-27 18:08 xixi

谢谢
  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2008-11-03 00:31 金秋家圆梦

很好  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2009-04-05 09:59 独孤行

既然使用了Servlet,为什么还在jsp页面用<% %>这个呢,还不如直接
jsp+javabean得了,完全没体现出Jsp model2 mvc的强大  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2009-04-28 14:15 momo

你写得真好,但我看不懂  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2009-09-25 00:10 何同学

这位朋友,可否麻烦您把网上书店(jsp+servlet+javabean)的完整源码发一份给我:hezm66@163.com,多谢。  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2010-05-15 10:39 yan

能不能给我发一份完整的源代码呀??多谢啦!!急用  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2010-05-15 10:40 yan

哦,我的邮箱dang_2008_@126.com.十分感谢  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2010-08-26 23:34 mos

能不能发一份完整源码和数据库啊 谢谢啊
335952566@qq.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2011-06-09 08:50 zpxia22

能不能发一份完整源码和数据库啊 急用 谢谢谢谢 邮箱是1085883822@qq.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2011-11-07 17:30 juan

能不能发一份完整源码和数据库啊 急用 谢谢谢谢 邮箱是576114610@qq.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2012-02-18 16:46 wangaor

能不能给我发一份源代码。谢谢了!wangaor@126.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2012-03-11 05:22 kevin

求大虾发一份完整源代码供详细参考啊,万分感谢了!!!kevinding0218@gmail.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2012-05-13 12:43 mj

能不能给我发一份完整的源代码呀??多谢啦!!急用
邮箱:mjtx.jianyang@qq.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2012-10-21 16:21 123

求源代码 谢谢 ztq0701@163.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2013-05-27 12:36 李强

求源代码991459629@qq.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2013-06-05 17:50 sunny

求源码和数据库~~~万分感谢了 ~~~  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2013-06-05 17:51 sunny

求源码和数据库~~万分感谢~~邮箱2267961672@qq.com  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean)[未登录] 2014-10-22 11:18 默默

可不可以给我发一份完整的网上书店的源代码呀,急用  回复  更多评论   

# re: 网上书店(jsp+servlet+javabean) 2014-12-25 20:40 11

@juan
能不能给一份源码给我啊  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问