本帖最后由 小石姐姐 于 2018-5-30 10:20 编辑
商品的增删改查及分页 客户端提交到服务端,服务端有三层,在servlet 接收参数,封装数据,调用service ,把Dao返回来的数据存到域(request,seeeion,)中, 然后页面跳转到jsp,在jsp取数据,显示数据(el,jstl)。
页面每次点击提交数据,都会把数据提交到后台,servlet-service-Dao。
商品信息的CRUD:
使用MVC模式(JSP+Servlet+JavaBean+JDBC);先创建数据库和表,导7个包mysql、c3p0、dbutils、beanutils2个、JSTL2个。修改c3p0数据库名字。新建一个工程,创建包结构,创建jsp
首页点击查询所有,把请求提交到servlet(trycatch一下)在servlet里调用业务层service接着调用service里的方法 把dao返回来的集合保存到域(request,session)中 再页面跳转(转发)到jsp ;在service里调用Dao中的方法;在Dao写查询的方法,方法里对JDBC(数据库连接,获得连接池两种方法)进行封装(QueryRunner)写SQL语句;在jsp里引入核心标签<%@>,从域中取出数据<c:foreach var="" items="${list}" > foreach遍历循环,显示数据;把工程发布到Tomcat服务器。
商品添加: 点击添加按钮需要绑定事件在js(<script>window.location.herf) 里写代码跳转到一个添加页面(提交表单格式的页面form添加完成后返回到商品列表页面),其实也得把请求提交到-servlet-service-dao;现在只是在servlet里进行跳转页面,暂时没有其他步骤。
点击添加商品按钮把数据提交到servlet中,(接收页面数据前处理中文乱码)在servlet里用Map集合接收参数(request.getparameter),封装数据(Beanutils.populate)UUID获得随机小写id 调用service 然后跳转页面,在service里调用Dao,在Dao中创建保存商品的方法保存到数据库;
转发的话,地址栏路径不变,所以添加商品页面和商品列表页面的地址不会变化,故在这两个页面刷新都会多次提交表单。
添加完商品后在商品列表页面点刷新或者在添加商品页面刷新都会出现重复提交问题,还有一种情况是网速慢。
解决重复提交问题: 令牌机制(一次性),在添加商品的jsp页面中添加代码,<%java代码%>,然后在商品添加的servlet中判断是否重读提交,再清空session中的令牌。session中保存一份,表单取一份作比较,再刷新时会把session中的那份清除掉,所以两份就不一样了,然后就返回,跳转一个新的提示页面。
session的应用场景:令牌机制(token),和一次性验证码很像,session共三步获得,提交,清除。
商品信息的修改: 在列表页面点击修改,提交到servlet,根据ID查询信息把查询到的数据显示到修改页面,在修改页面修改数据然后提交到数据库,跳转到/ProductFindAllServlet。在修改页面上添加隐藏的id字段,因为条件where需要id,所以需要添加隐藏的id。
在修改商品的页面jsp中添加如下EL语句<!-- 此处用EL获取页面的数据,test的含义是如果为true,后边的checked执行 --><c:if test="${ product.is_hot==1 }">checked</c:if>>
同一个页面不同的按钮操作同一个表单向不同的地址提交是很常见的情况;JQuery通过ID属性获得,用$(#id).prop操作属性,修改各自的提交路径action,然后$(#id).commit提交;
分页: 采用物理分页的方式,前台传给后台currentpage,后台给前台返回currentpage当前页数,totalPage总页数,totalsize总记录数,pagesize每页大小,显示的数据List。
存到request域request.setAttribute(“totalpage”,totalpage), select * from product where ...limit a,b;a=(currentpage-1)*pagesize;a表示从哪开始查,b表示到哪结束;
存到域中setAttribute("p",product),以“p”存的,就以什么取(${p})。取页面上的数据用EL$语句,<c:if test="${p.flag==0}">;
商品条件查询里,用到了模糊查询like,需要"%"+pname+"%"的格式写;
删除商品之后需要跳转(转发)到/ProductFindAllServlet,而不能直接跳转到jsp页面,因为需要跳转到servlet后通过查询数据,再显示到页面,如果直接跳转到页面会不显示数据
<c:forEach var="p" items="${plist}" varStatus="status">forEach遍历:var:名字随便取的,items:取出待遍历的对象
|
|