Java web MVC(jsp,servlet,dao)+Bootstrap购物网站开发经验总结 (持续更新)
2017-02-17 00:00
916 查看
一开始对java web 不是很熟悉,重新温习了java web ,对El expression ,jstl的使用有了更加深的印象,mvc模式下的分层结构有了进一步的了解.
MVC中的M就是model:模型层,用于表达一个对象,javabean,也可以叫值对象(value Object)用于缓存对象所包含的信息,比如一个商品javabean,一开始没有广泛使用的时候用于解决大量参数传递的麻烦,例如要传递商品信息,就要写方法 public void setGoods(String name,String id,String picture){……省略}
如果开发中要想添加商品的属性pirce 是不是要在方法参数中添加,这样的话对后期维护会很麻烦,造成代码臃肿,所以引入了值对象(value object)也就是javabean。将商品封装成一个类,想传递商品信息的时候就直接传递Goods类型的对象。
MVC中的V就是View表示层:Java web中用jsp表示。在jsp中我配置好bootstrap中的代码就可以显示漂亮的界面了。
MVC中的C就是(controller)控制层:Javaweb中使用servlet,用于写业务逻辑和调用Dao层
下面讲解下我整个网站的开发思路
首先先编写数据层database类 连接数据库 然后根据功能编写dao类,暂时实现GoodsDao类,里面有通过商品id获取单一商品的详细信息的方法
获取数据库所有的商品信息的方法,里面包含了数据分页处理的代码,分层的不是很好
先获取商品的记录数,通过商品的记录数除以每页你想设置多少个商品数(limit)去最大整数获得总页数
从前台request.getParameter("pages")获取当前的页码,通过页码显示当前页数所要展示的商品
需要注意的是获取分页记录数的算法:select*from tb_goods order by id limit 起始记录数,记录数数量
order by id:按照id 大小顺序来排序返回结果
limit (当前页数-1*limit) ,(limit)
例如 limit 5,10 返回6-15记录数
下面是分页的javabean:PageBean
下面介绍Servlet 控制层
GoodsServlet:
dopost方法主要控制业务逻辑,通过request.getServletPath()获取前台当前页面的路径,在web.xml中已经设置好GoodsServlet的两个路径
通过获取当前的路径调用所对应的方法
所调用的方法在Servlet中实现
需要注意的是StringHandler,是一个字符串帮助类,主要实现字符串与各类型之间的转换
需要注意的是:在listGoods.jsp中当前路径也要改成
指定/listgoods路径显示的jsp是listGoods.jsp页面
MVC中的M就是model:模型层,用于表达一个对象,javabean,也可以叫值对象(value Object)用于缓存对象所包含的信息,比如一个商品javabean,一开始没有广泛使用的时候用于解决大量参数传递的麻烦,例如要传递商品信息,就要写方法 public void setGoods(String name,String id,String picture){……省略}
如果开发中要想添加商品的属性pirce 是不是要在方法参数中添加,这样的话对后期维护会很麻烦,造成代码臃肿,所以引入了值对象(value object)也就是javabean。将商品封装成一个类,想传递商品信息的时候就直接传递Goods类型的对象。
MVC中的V就是View表示层:Java web中用jsp表示。在jsp中我配置好bootstrap中的代码就可以显示漂亮的界面了。
MVC中的C就是(controller)控制层:Javaweb中使用servlet,用于写业务逻辑和调用Dao层
下面讲解下我整个网站的开发思路
首先先编写数据层database类 连接数据库 然后根据功能编写dao类,暂时实现GoodsDao类,里面有通过商品id获取单一商品的详细信息的方法
//获取单一商品信息 public GoodsBean getSingleGoods(int goodsBuyId)throws SQLException { GoodsBean singleGoods=null; String sql="select*from tb_goods where id=?"; //保存参数 Object[]params={goodsBuyId}; //查询商品 dataBase.doPstm(sql,params); //获取结果集 ResultSet resultSet=dataBase.getRs(); List<GoodsBean> singlegoodsList=new ArrayList<GoodsBean>(); while (resultSet.next()) { singleGoods=new GoodsBean(); singleGoods.setId(resultSet.getInt(1)); singleGoods.setGoodsName(resultSet.getString(2)); singleGoods.setGoodsPrice(resultSet.getFloat(3)); singleGoods.setGoodsViewpic(resultSet.getString(4)); singleGoods.setGoodsStoreNum(resultSet.getInt(5)); singleGoods.setGoodsStocktime(StringHandler.timeTostr(resultSet.getTimestamp(6))); singleGoods.setGoodsInfo(resultSet.getString(7)); singleGoods.setGoodsMaker(resultSet.getString(8)); singleGoods.setGoodsBrand(resultSet.getString(9)); singlegoodsList.add(singleGoods); } resultSet.close(); if (singlegoodsList!=null) { singleGoods=singlegoodsList.get(0); } return singleGoods; }
获取数据库所有的商品信息的方法,里面包含了数据分页处理的代码,分层的不是很好
先获取商品的记录数,通过商品的记录数除以每页你想设置多少个商品数(limit)去最大整数获得总页数
从前台request.getParameter("pages")获取当前的页码,通过页码显示当前页数所要展示的商品
需要注意的是获取分页记录数的算法:select*from tb_goods order by id limit 起始记录数,记录数数量
order by id:按照id 大小顺序来排序返回结果
limit (当前页数-1*limit) ,(limit)
例如 limit 5,10 返回6-15记录数
public List<GoodsBean> listGoods(HttpServletRequest request,HttpServletResponse response,int limit) { PageBean pageBean=new PageBean(); List<GoodsBean> singlegoodsList=new ArrayList<GoodsBean>(); String sql="select count(*) from tb_goods"; pageBean.setLimit(limit); //计算记录总数的第二种办法:使用mysql的聚集函数count(*) ResultSet resultSet; try { resultSet = dataBase.getPreparedStatement(sql).executeQuery(sql); if(resultSet.next()) { pageBean.setCount(resultSet.getInt(1));//结果为count(*)表,只有一列。这里通过列的下标索引(1)来获取值 } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //由记录总数除以每页记录数得出总页数 pageBean.setTotalpages((int)Math.ceil(pageBean.getCount()/(pageBean.getLimit()*1.0))); //获取跳页时传进来的当前页面参数 String strPage = request.getParameter("pages"); //判断当前页面参数的合法性并处理非法页号(为空则显示第一页,小于0则显示第一页,大于总页数则显示最后一页) if (strPage == null) { pageBean.setPages(1); } else { try { pageBean.setPages(java.lang.Integer.parseInt(strPage)); } catch(Exception e) { pageBean.setPages(1); } if (pageBean.getPages()< 1) { pageBean.setPages(1); } if (pageBean.getPages() >pageBean.getTotalpages()) { pageBean.setPages(pageBean.getTotalpages()); } } //由(pages-1)*limit算出当前页面第一条记录,由limit查询limit条记录。则得出当前页面的记录 try { resultSet = dataBase.getPreparedStatement("select*from tb_goods order by id limit "+(pageBean.getPages()-1)*limit+","+limit).executeQuery(); while (resultSet.next()) {//遍历显示 GoodsBean singleGoods=new GoodsBean(); singleGoods.setId(resultSet.getInt("id")); singleGoods.setGoodsName(resultSet.getString("goods_name")); singleGoods.setGoodsPrice(resultSet.getFloat("goods_price")); singleGoods.setGoodsViewpic(resultSet.getString("goods_viewpic")); singlegoodsList.add(singleGoods); } request.setAttribute("pageBean", pageBean); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return singlegoodsList; }
下面是分页的javabean:PageBean
package com.hhb.javabean; public class PageBean { private int pages; //待显示页面 private int count; //总条数 private int totalpages; //总页数 private int limit; //每页显示记录条数 public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } public int getTotalpages() { return totalpages; } public void setTotalpages(int totalpages) { this.totalpages = totalpages; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getPages() { return pages; } public void setPages(int pages) { this.pages = pages; } }
下面介绍Servlet 控制层
GoodsServlet:
dopost方法主要控制业务逻辑,通过request.getServletPath()获取前台当前页面的路径,在web.xml中已经设置好GoodsServlet的两个路径
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>GoodsServlet</servlet-name> <servlet-class>com.hhb.servlet.GoodsServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GoodsServlet</servlet-name> <url-pattern>/listgoods</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>GoodsServlet</servlet-name> <url-pattern>/viewgoods</url-pattern> </servlet-mapping>
通过获取当前的路径调用所对应的方法
@Override public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException { String servletPath=request.getServletPath(); System.out.println("servletPath:"+servletPath); //String methodName=request.getParameter("methodName"); //if(methodName!=null&&methodName.equals("listgoods")) //{ // listGoods(request, response); //} if("/listgoods".equals(servletPath)) { listGoods(request, response); //listDividegoods(request, response); } else if("/viewgoods".equals(servletPath)) { viewGoods(request, response); } }
所调用的方法在Servlet中实现
//获取所有的商品 protected void listGoods(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { try { GoodsDao goodsDao=new GoodsDao(); List<GoodsBean> allgoodsList=goodsDao.listGoods(request, response,12); request.setAttribute("allgoodsList",allgoodsList); goodsDao.closed(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } request.getRequestDispatcher("/listGoods.jsp").forward(request, response); } //查询商品详细信息 protected void viewGoods(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { Integer goodId=StringHandler.strToint(request.getParameter("goodId")); try { GoodsDao goodsDao=new GoodsDao(); GoodsBean singleGoods=goodsDao.getSingleGoods(goodId); request.setAttribute("singleGoods", singleGoods); goodsDao.closed(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } request.getRequestDispatcher("/viewGoods.jsp").forward(request,response); }
需要注意的是StringHandler,是一个字符串帮助类,主要实现字符串与各类型之间的转换
//删除空格 public static String delBlank(String str) { if (str!=null) { return str.replace(" ",""); } return null; } //字符串转换成整型 public static Integer strToint(String str) { if (str!=null&&!str.equals("")) { try { return Integer.parseInt(str); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return null; } } return null; } //将字符串转换成时间格式 public static String timeTostr(Date date) { String strDate=""; if (date!=null) { SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); strDate=format.format(date); } return strDate; } //时间转换成字符串 public static String getSerial(Date date) { SimpleDateFormat fm=new SimpleDateFormat("MMddyyyyHH"); String serials=fm.format(date); return serials; } //将字符串转换成数组 public static int[] changeToIntArray(String[]strs) { int[] nums=null; if (strs!=null) { nums=new int[strs.length]; for (int i = 0; i < strs.length; i++) { nums[i]=Integer.parseInt(strs[i]); } } return nums; } //将Cookie public static String cookieEncode(String str) { String change=""; if(str!=null) { try { change=URLEncoder.encode(str,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return change; } public static String cookieDecCode(String str) { String change=""; if(str!=null) { try { change=URLDecoder.decode(str,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return change; } //将字符串转换成List public static List StringToList(String str) { String[] arraystrs=null; List listStrs=null; if (str!=null&&!str.equals("")) { listStrs=new ArrayList(); arraystrs=str.split("\r\n"); for (int i = 0; i < arraystrs.length; i++) { if(arraystrs[i]!=null&&!arraystrs[i].equals("")) { listStrs.add(arraystrs[i]); } } } return listStrs; } //数组转换成字符串 public static String ArrayToString(String[] array) { String string=""; if (array!=null&&array.length!=0) { for (int i = 0; i < array.length; i++) { string+=array[i]+","; } } //去掉最后一个, string=string.substring(0,string.lastIndexOf(",")); return string; }
需要注意的是:在listGoods.jsp中当前路径也要改成
String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; String servletPath="listgoods"; String currentPath=basePath+servletPath;
指定/listgoods路径显示的jsp是listGoods.jsp页面
相关文章推荐
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之09.JDBC DAO设计模式
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之08.JDBC可更新的ResultSet及RowSet 推荐
- Java web 开发小问题总结(持续更新中)
- JavaWeb开发【JSP】系列文章索引目录表(持续更新中..)
- Java Web开发 之小张老师总结EL、JSP、Servlet变量
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之34.Tomcat安装与配置 推荐
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之33.HTML表单 推荐
- WEB开发中的JAVA字符编码经验总结
- WEB开发中的JAVA字符编码经验总结
- WEB开发中的JAVA字符编码经验总结
- WEB开发中的JAVA字符编码经验总结
- WEB开发中的JAVA字符编码经验总结
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之14.Servlet请求头信息
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之11.Servlet简介 推荐
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之01.JDBC简介 推荐
- WEB开发中的JAVA字符编码经验总结
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之13.Form表单处理(2)
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之06.JDBC PreparedStatement
- WEB开发中的JAVA字符编码经验总结
- Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之02.JDBC Connection 推荐