文档章节

Java web MVC(jsp,servlet,dao)+Bootstrap购物网站开发经验总结 (持续更新)

L
 LeoHuang55
发布于 2017/02/17 15:53
字数 1682
阅读 115
收藏 1

一开始对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获取单一商品的详细信息的方法

//获取单一商品信息
	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页面

© 著作权归作者所有

共有 人打赏支持
L
粉丝 0
博文 3
码字总数 2325
作品 0
广州
私信 提问
Jsp 和 Servlet 有什么不同?

面试中被问到了 Jsp 和 Servlet 有什么不同?在这里总结分享下。 回答思路先分别进行基本介绍,然后分析说明两者相同点和不同点。 基本介绍 Servlet: Servlet 是一种服务器端的Java应用程序...

几个栗子
08/22
0
0
Java和PHP在Web开发方面的比较

比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发。以下是我就几个主要方面进行的比较:   一、 语言比较   PHP是解释执行的服务器脚本语言,首先php有简单容...

52java
2013/02/04
0
0
分享26个关于Java开发视频教程(免费下载)

分享26个关于Java开发视频教程(免费下载) 1、开发前传_CSS.avi 2、开发前传_HTML基础.avi 3、开发前传_javascript.avi 4、Web开发工具的安装与使用.avi 5、Servlet起源.avi 6、Servlet编程...

邓剑彬
2012/12/01
386
1
Java新手如何学习Spring、Struts、Hibernate三大框架?

ava三大框架的各自作用 一、Spring Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spr...

懿涌
2017/06/02
683
9
(JavaEE-07)JSP.md

JSP JSP全称是Java Server Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态Web资源的技术。JSP的编写就像编写HTML一样简单,但是与HTML不同的是,在JSP中,可以编写Java代码...

_-Leon-_
2014/07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TiDB EcoSystem Tools 原理解读(一):TiDB-Binlog 架构演进与实现原理

简介 TiDB-Binlog 组件用于收集 TiDB 的 binlog,并提供实时备份和同步功能。该组件在功能上类似于 MySQL 的主从复制,MySQL 的主从复制依赖于记录的 binlog 文件,TiDB-Binlog 组件也是如此...

TiDB
18分钟前
0
0
Confluence 6 文档主题合并问答

在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用。我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将这个主题...

honeymose
21分钟前
0
0
sparkCore-RDD详解

1.1 什么是RDD 1.1.1 产生背景 当初设计RDD主要是为了解决三个问题: Fast: Spark之前的Hadoop用的是MapReduce的编程模型,没有很好的利用分布式内存系统,中间结果都需要保存到external di...

freeli
22分钟前
0
0
walle的试用和结合vagrant

walle Vagrant 入门指南

miaojiangmin
24分钟前
0
0
python popen.stdout.read阻塞 解决办法

需求:利用python的subprocess模块结合logging模块实现监控子程序运行情况 代码如下(程序阻塞在stdout.readz这里,日志里找不到hang on...................): import osimport sysimpor...

fang_faye
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部