(备注:
x待处理:代表理解不透彻,需要继续学习,甚至理解错误的内容;
y无法详细解释:代表逻辑比较复杂,暂时无法解释清楚的部分;
z易出错:代表开发中踩过、填过的坑;
"/":代表目录)
(二次备注:本项目是参考某大佬用Servlet完成的项目后,用JFinal重写实现,所以下面贴出大佬的博客和Github
博客:http://codingxiaxw.cn/2016/10/25/25-JavaWeb%E9%A1%B9%E7%9B%AE%E4%B9%8B%E5%AE%A2%E6%88%B7%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/
Github:https://github.com/codingXiaxw/CustomerManagement.git)
0、项目名:JFinal_CURDP
0.1、简介:用JFinal实现简单的增删改查+分页
0.2、采用技术/工具:JFinal3.1+JSP;IntelliJ+Maven+Git
0.3、项目地址:https://github.com/ss2468776986/JFinal_CURDP
1、效果展示
2、项目结构:
3、代码详解:
3.1、src
3.1.1、common/MainConfig
①Constants:设置视图类型为JSP;加载数据库配置文件config.properties
②Routes:指定路由;3个参数分别代表:url中输入的地址+处理的Controller+视图(JSP文件)存放的路径
③Plugins:C3p0数据库连接池+ActiveRecord(x待处理)+addMapping(数据库中的table与model映射)
④main:启动方式(不一定要写在MainConfig中;包含Eclipse/IntelliJ+Tomcat/Jetty/Jrebel多种组合方式(x待处理))
3.1.2、controller/UserController
①如果严格按照三层架构的设计模式,详细的业务逻辑应写在Service层,Controller层只包含页面跳转+渲染视图(x待处理)②list()、add() 、query()分别对应(跳转)前端的list.jsp、add.jsp、query.jsp;其中list()使用JFinal自带的paginate实现分页(需配合list.jsp中的手动分页使用)
③add()、edit()、submit()、update()、del();add.jsp页面通过EL表达式判断前端数据是提交至submit()还是update()(y无法详细解释)
④query()、search()部分存在bug,暂时无法使用
3.1.3、model/User
①代替了原JavaBean功能(x待处理)②dao只能对数据库进行操作,不能承载数据(x待处理)
③JFinal的Model与Db+Record模式的区别(x待处理)
3.1.4、config.properties
①数据库配置;注意数据库名改为自己的3.2、webapp
3.2.1、webapp/index
①使用iframe框架,不过现在已经不推荐使用iframe框架,原因是资源消耗过大(使用iframe双倍消耗资源)
②index.jsp通过jsp:forward包含frame.jsp
③frame.jsp通过frameset包含top.jsp和welcome.jsp(主体部分,必须包含)(x待处理)
④top.jsp包含跳转至list.jsp、add.jsp、query.jsp的超链接
⑤(x待处理)JSP部分的知识+视图层换成Velocity+模板
3.2.2、webapp/user
①list.jsp包含一个<table>+分页;<table>通过<c:forEach>语句遍历后台传来的数据(这里是userPage.list)②(z易出错)前台展示后台数据部分非常重要!关系到整个流程是否通畅;这里,后台通过paginate获得Page<User>型对象page,通过setAttr("userPage", page)传到前台;传到前台的Attribute名为"userPage",且Page<User>实际上是list型,所以前台使用<c:forEach items="${userPage.list }" var="user">来获得Attribute+遍历
③(x待处理)底端的分页超链接以后会单独开一篇博客讲
④(x待处理)当然随着前端及ajax的发展,前台展示后台数据部分通常由ajax来完成,对应的分页部分也要修改
⑤add.jsp只包含一个<form>,<form>再包含<table>;然而add.jsp需通过EL表达式判断渲染时后台是否传数据?以及提交至submit()还是update()?
⑥action处通过判断是否存在一个名为msg的Attribute(渲染时如果是修改,则会传这个Attribute),确定提交路径(路径问题十分蛋疼!(z易出错))
⑦每一个<input>或者<textarea>的value属性,通过EL表达式${msg.name }(name为table中的字段)获得
⑧注意<input>或者<textarea>的name必须为user.name(name为table中的字段,可变换但必须对应),否则数据传不到后台(对应后台getModel(x待处理))
⑨id的<input>为hidden型,数据库中id字段必须设置为自增
3.2.3、web.xml
①(z易出错)运行前应该第一个查看的文件;采用JFinal后需要配置的xml文件大大减少,只剩这个web.xml(但经常会忘!)②<filter>中的<param-value>对应项目中的MainConfig(路径要完整包括package名)
③<filter-mapping>中的<url-pattern>为"/*"(代表/下任意内容)(这里与Routes的区别)
④Servlet中的filter与listener(过滤器、监听器)
3.2.4、sql
①包含数据与结构的sql文件,导入即可②MySQL客户端使用Navicat(IntelliJ自带的数据库客户端?)