JAVA项目:订餐系统步骤解析
最近做了个订餐系统的练习,感觉做完以后自己对JAVA又有了更深的理解,所以来写下这个订餐系统项目所需要的步骤。主要是用到Struts2框架和Hibernate框架来进行实现。下面是步骤流程:
一、首先要配置好运行环境所需要的配置文件,这样才能进行操作和链接数据库。
二、新建项目所需要的包,这里用的是MVC框架所创建的包:
Control包:存来控制处理Model包里面的处理语句后进行Action的跳转的类
Model包: 存来写处理语句对数据库进行操作的类
Etity包:用来存实体类
Util包:存些所需要的工具类
MyInterceptor包:自定义的拦截器
三、登录界面步骤
1.要先写好用户的实体类User,在配置好User.hbm.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="Entity">
<class name="User">
<id name="id">
<generator class="native"></generator>
</id>
<property name="userName"></property>
<property name="passWord"></property>
</class>
</hibernate-mapping>
2.再对jsp页面进行排版
3.当form表单提交信息时进到struts.xml找到对应的Action跳到对应的控制方法对用户进行验证,
<!-- 登录Action -->
<package name="strutsDemo2" namespace="/test2" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="mydemo1_*" class="Control.LoginKZ" method="{1}">
<result name="success">/ShouYe.jsp</result>
<result name="shibai">/Login.jsp</result>
<result name="input">/Login.jsp</result>
</action>
</package>
这里我加了校验器来对用户输入进行校验,空或则小于3位就跳回登录界面
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.dtd">
<validators>
<field name="us.userName">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
</field>
<field name="us.passWord">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">3</param>
<message>密码小于3位</message>
</field-validator>
</field>
</validators>
4.再LoginKZ(控制层)调用对应的处理类来获取数据库信息进行验证,错误就跳回Login.jsp,成功就跳到首页,当登录时将用户ID存进session里面,方便后面订购。
四、首页的分页显示步骤:跳到对应的Action找到对应的控制类,调用处理类再返回到对应的视图进行显示
1.一样是先定义好食物的实体类Food,要显示什么就自定义什么属性。
2.写好获取分页时所需要的总页数和所需要显示的个数的处理类,这里用的是hql来进行操作数据库
所需要显示的个数的hql代码,存成ArrayList集合,到时遍历出实体类来
s = HibernateUtil.getSesssion();
ts = s.beginTransaction();
String hql = "from Food f where f.lei=?";
Query q = s.createQuery(hql);
q.setString(0, lei);
//这里可以像sql的limit一样可以规定每页显示数量
q.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
List<Food> li = q.list();
list = (ArrayList)li;
ts.commit();
获取总页数的hql代码
s = HibernateUtil.getSesssion();
ts = s.beginTransaction();
String hql = "from Food f where f.lei=?";
Query q = s.createQuery(hql);
q.setString(0, lei);
int count = q.list().size();
if(count%pageSize==0){
pageCount = count/pageSize;
}else {
pageCount = count/pageSize+1;
}
3.当点击首页时就跳到对应的Action找到对应的方法,在控制的方法里面调用分页的处理类来获取总页数和显示个数,再跳到Shouye.jsp里面进行显示。
<!-- food分页 -->
<package name="strutsDemo1" namespace="/test1" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="mydemo1_*" class="Control.FoodKZ" method="{1}">
<!-- 查看详细 -->
<result name="xiangxi">/XiangXi.jsp</result>
<result name="success">/ShouYe.jsp</result>
</action>
</package>
五、注册界面步骤
1、因为上面登录已经写了用户表实体类,所以可以直接调用就可以,所以先排版好jsp页面,可以写些js来对用户名和密码进行判断不能为空,再加个验证码通过才跳Action
2.新建注册的处理类进行处理和操作数据库,注册用户是可以用Hibernate直接存实体类,再加个排除重复用户名的处理进行判断
注册排重处理方法,定义成boolean类型,当hql查到不为空时返回ture
boolean b = false;
s = HibernateUtil.getSesssion();
String hqlStr = "from User as user where user.userName=:name";
Query q = s.createQuery(hqlStr);
q.setString("name", userName);
List<User> list = q.list();
if(list.size()!=0){
b = true;
}
注册处理方法也定义成boolean类型,然后再调用排重方法
boolean b = false;
s = HibernateUtil.getSesssion();
ts = s.beginTransaction();
//调用排重方法,false就保存用户
if(!this.getName(us.getUserName())){
s.save(us);
b = true;
}
ts.commit();
3.创建注册的控制器,在控制器里面调用注册方法,返回对应的视图层,成功就跳到登录页面,失败就跳回注册页面继续注册。
<!-- 注册Action -->
<package name="strutsDemo3" namespace="/test3" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="mydemo1_*" class="Control.ZhuCeKZ" method="{1}">
<result name="success">/Login.jsp</result>
<result name="shibai">/zhuce.jsp</result>
<result name="input">/zhuce.jsp</result>
</action>
</package>
六、订购界面步骤。
1.订购时先要判断下用户是否登录了,没有就跳到登录界面,也可以加拦截器来拦截。登录后点击订购时将对应的食物ID、用户ID、食物价格、食品数量存进购物车表。所以我们先写好购物车表的实体类,再配置到hibernate.xml配置里面。
2.写好实体类后,再写处理类里面的数据操作,就是将需要的属性存进购物车表里面。
这里需要排重下,不让相同的食物重复的存进购物车表里面,因为有时用户不同所以用于不同用户ID对应不同的食物ID,相同就返回true.
boolean b = false;
s = HibernateUtil.getSesssion();
ts = s.beginTransaction();
String hql = "select count(*) from MyCar as mc where mc.userid=? and mc.foodId=?";
Query q = s.createQuery(hql);
q.setInteger(0, userid);
q.setInteger(1, foodId);
String count = q.uniqueResult().toString();
System.out.println(count);
if(count.equals("1")){
b = true;
}
ts.commit();
存订购信息到购物车表,进行排重,这里处理的返回值是boolean类型,已经有该条信息就直接返回true,没有就先存再返回。
boolean b = false;
s = HibernateUtil.getSesssion();
s = s.beginTransaction();
//调用排重方法,为true就直接返回true,而不保存
if(this.isAddCar(foodId, userid)){
return true;
}
s.save(mc);
ts.commit();
b = true;
3.存好用户订购的食物后,就是如何在页面中显示给用户看并结算,所以就要从数据库中遍历出登录用户订购了多少种食物,这里就要用到用户的ID。因为登录时已经把用户ID存进session里面,我们可以直接就获取的到,所以把获取到的订购信息分别存到ArrayList里面,方便jsp页面遍历
ArrayList list=null;
s = HibernateUtil.getSesssion();
ts = s.beginTransaction();
//这里我是新建了个实体类,定义了对应属性的构造器,这样和sql做左连接差不多
String hql = "select new Entity.JieSuanBean(c.id,f.photo,"
+ "f.foodname,f.xianJia,c.foodNum,f.id) "
+ "from Food f,MyCar c "
+ "where f.id=c.foodId and c.userid=?";
Query q = s.createQuery(hql);
q.setInteger(0, userid);
List<JieSuanBean> li = q.list();
list = (ArrayList) li;
ts.commit();
4.通过控制层对处理类进行操作,再返回到对应的视图,因为加了拦截器,没登陆直接跳到登录界面。
<!-- 查看订单界面Action -->
<action name="mydemo2_*" class="Control.ChaKanKZ" method="{1}">
<result name="success">/JieSuan.jsp</result>
<result name="shibai">/Login.jsp</result>
<interceptor-ref name="myYZ"></interceptor-ref>
</action>
5.Jsp页面显示如下,这里可以用strut2的标签直接遍历出来,加上修改数量的js,和删除或清空订单的功能。修改数量在提交订单时再跳到控制层调用处理层来对每种食物数量进行修改
七、结算界面步骤。
1.这里可以先对jsp页面进行好排版,但记得把总价传进里面。
2.填写好订单信息后,就是把里面的信息存进数据库,所以要有对应的实体类,因此写好实体类和里面属性,再配置到hibernate.xml里面方便操作数据库。
3.在处理类里写个方法对数据库进行操作,把订单实体类存进去。
try {
s = HibernateUtil.getSesssion();
ts = s.beginTransaction();
s.save(mo);
ts.commit();
} finally {
if(s!=null){
s.close();
}
}
4.控制层调用处理层对数据库进行操作完后,就跳回对应的视图。
<!-- 填写提交订单Action -->
<action name="mydemo4_*" class="Control.TianXieKZ" method="{1}">
<result name="success">/WanCheng.jsp</result>
<interceptor-ref name="myYZ"></interceptor-ref>
</action>
完结