您的位置:首页 > 运维架构 > 网站架构

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

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