网购商城项目开发日记(一)
1.经典JavaEE三层架构
原型开发:前端页面响应式设计,后端使用分层模式解耦——>经典的JavaEE三层架构图
Web层(视图层)-接收请求,调用服务,返回响应。
Service层(业务层)-对业务进行处理,调用Dao层,完成对数据库的操作。
Dao层(数据持久层)-curd,直接操作数据库。
2.需求分析与功能划分
需求分析-功能划分-具体功能的细致需求分析-实现思路分析-走代码实现-完成测试
3.功能划分(1)-用户注册与登录
大致思路分析(架子):
建库建表user表------DB(Mysql)
↓
对应的JavaBean类User-----Entity层
User类中提供有参无参构造器(后续反射会用到),表字段对应属性的set,get方法
↓
对应的BasicDAO类与UserDAO接口与UserDAOImpl实现类-----Dao层
UserDAO中需要去分析需要提供什么方法,sql语句从数据库中获取信息或者对数据库加以dml操作
↓
对应的UserService接口与UserServiceImpl实现类-----Service层
UserService中调用UserDAO中的方法实现具体的业务需求
↓
对应的UserServlet-----Web层
从前端的表单获取信息并对UserService的方法进行使用,估计业务需求进行信息返回/请求转发/重定向等等
↓
前端页面,对应的表单提交数据
4.功能实现中的小收获
4.1想在登录界面放一个小的提示框,提示输入校验结果
在from之前放一个span
然后可以在Servlet中设置好
if xxxxx{ request.setAttribute("msg","登录信息错误xxx");}
而后根据msg在需要的地方放置span,使用EL表达式${requestScope.msg}将信息显示出来
或者
前端jsp文件中进行设置,同样需要span,给它一个class=errorMsg
之后使用jquery的选择器$("#span.errorMsg").text("xxxxxxxxxx");
或者$("span[calss="errorMsg"]").text("xxxxxxxxxx");
4.2关于Service、Dao层的Impl与接口
使用接口-实现类的开发模式,便于拓展
同样的,如果下service中要使用Dao提供的方法时,我们在service中放一个dao的接口对象指向实现类的实例
4.3 IDEA快捷键-定位方法
Ctrl+B---查看编译类方法
Ctrl+At+B---查看实现类的方法
4.4 id设置为自增长,表中id却不连贯的问题
注册测试中发现数据库id设置为自增长后,一些失败的注册(前端正则校验没有通过)过后,在进行正常注册
会发现id不是连续的了,(123579)中间的id没有进入表但是被占用了
原因:猜测是被没有提交的事务占用了,(此外回滚也有可能占用)
4.5IDEA快捷键-撤销撤销
撤销与撤销撤销
Ctrl+z与Ctrl+shift+z
4.6 java三层架构-后续进阶
Web-Service-Dao
(web——SpringMVC)(Service-Dao——Spring)
4.7接口方法找实现类
在接口方法上Alt+Enter
4.8对域对象的一次使用
4.9合并登录注册的Servlet
设施一个隐藏域
<input type="hidden" name=action value="login"或者是"register" />
将Servlet中的doPost方法与doGet方法抽象出一个抽象类:BasicServlet,让其他Servlet继承他
反射+模板设计模式(抽象类)+动态绑定机制实现
//使用反射,获取当前对象的某个方法,方法名就是action的value try { Method declaredMethod = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); //使用方法对象,进行反射调用 declaredMethod.invoke(this,request,response); } catch (Exception e) { e.printStackTrace(); } }
4.10 Dao层sql语句一个坑
sql语句中,表名与Where之间需要有空格,否则sql语句不被正确识别,报错!
4.11 登录失败保留用户名信息
在jsp的from表单列中使用域对象
<input type="text" name="username" value="${requestScope.username}"
同时在对应的Servlet中设置好属性即可
4.12mysql建表int(11)什么意思
int(11),11代表宽度,例如输入int是123456,那么表中存放的是00000123456这个值宽度为11
4.13 decimal定点数
用来很好的处理price的类型,decimal(5,2)表示一共5位数字,小数点后俩位,eg:123.45,456.25
4.14 javaBean中如何对应表的decimal定点数
使用Bigdecimal类即可
4.15javaBean中对应表的int应该使用对应的包装类
使用包装类:Integer,why?包装类自动装箱,可以接收null,避免不必要的报错
4.16表中字段与pojo属性名不一致怎么办?
sql语句查不到了,怎么办---sql语句中起别名,对应字段名的别名取得和pojo属性名一致既可以了
4.17输入信息控制
使用正则表达式进行test,如果 正则表达式.test(待测数据)不成功则不通过