2023年7月29日发(作者:)
java商品展⽰页⾯代码_java学习(⼗四)实现商品的展⽰、curd以及分页展⽰本⽂主要完成使⽤jdbc完成购物⽹站中实现:展⽰所有商品、添加商品、删除商品、修改单个商品、删除多个商品、分页展⽰的功能实现。1.展⽰所有商品本章节主要实现点击⾸页上展⽰所有商品的超链接,实现在页⾯上展⽰所有的商品信息。1.1创建数据库和表create database day14;use day14;create table `product` (`pid` varchar (96),`pname` varchar (150),`market_price` double ,`shop_price` double ,`pimage` varchar (600),`pdate` date ,`pdesc` varchar (765));INSERT INTO `product` VALUES('1','⼩⽶ 4c 标准版','1399','1299','products/1/c_','2015-11-02','⼩⽶ 4c 标准版 全⽹通 ⽩⾊ 移动联通电信4G⼿机 双卡双待');INSERT INTO `product` VALUES('10','华为 Ascend Mate7','2699','2599','products/1/c_','2015-11-02','华为 AscendMate7 ⽉光银 移动4G⼿机 双卡双待双通6英⼨⾼清⼤屏,纤薄机⾝,智能超⼋核,按压式指纹识别!!选择下⽅“移动⽼⽤户4G飞享合约”,⽆需换号,还有话费每⽉返还!');INSERT INTO `product` VALUES('11','vivo X5Pro','2399','2298','products/1/c_','2015-11-02','移动联通双4G⼿机 3G运存版 极光⽩【购机送蓝⽛⽿机+蓝⽛⾃拍杆】新升级3G运⾏内存·双2.5D弧⾯玻璃·眼球识别技术');INSERT INTO `product` VALUES('12','努⽐亚(nubia)My 布拉格','1899','1799','products/1/c_','2015-11-02','努⽐亚(nubia)My 布拉格 银⽩ 移动联通4G⼿机 双卡双待【嗨11,下单⽴减100】⾦属机⾝,快速充电!布拉格相机全新体验!');INSERT INTO `product` VALUES('13','华为 麦芒4','2599','2499','products/1/c_','2015-11-02','华为 麦芒4 晨曦⾦ 全⽹通版4G⼿机 双卡双待⾦属机⾝ 2.5D弧⾯屏 指纹解锁 光学防抖');INSERT INTO `product` VALUES('14','vivo X5M','1899','1799','products/1/c_','2015-11-02','vivo X5M 移动4G⼿机双卡双待 ⾹槟⾦【购机送蓝⽛⽿机+蓝⽛⾃拍杆】5.0英⼨⼤屏显⽰·⼋核双卡双待·Hi-Fi移动KTV');INSERT INTO `product` VALUES('15','Apple iPhone 6 (A1586)','4399','4288','products/1/c_','2015-11-02','AppleiPhone 6 (A1586) 16GB ⾦⾊ 移动联通电信4G⼿机长期省才是真的省!点击购机送费版,⽉⽉送话费,⽉⽉享优惠,畅享4G⽹络,就在联通4G!');1.2 新建项⽬,导⼊jar包,创建包结构其中导⼊的jar包驱动⽂件dbutilsc3p0jstl和standardbeanutils包结构中需要增加⼯具类包utils⼯具类:datasourceutils导⼊c3p0的配置⽂件1.3 创建Product对象在domain包内创建⽂件,并⽣成get/set⽅法package ;import ;public class Product {private String pid;private String pname;private Double market_price;private Double shop_price;private String pimage;private Date pdate;private String pdesc;...各属性的get/set⽅法}1.4 创建⽂件1.5 创建FindAllServlet⽂件protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//调⽤service查询所有商品List plist = null;try {plist = new ProductService().findAll();} catch (SQLException e) {// TODO Auto-generated catch tackTrace();}//将List放⼊request域中ribute("list", plist);//请求转发uestDispatcher("/product_").forward(request, response);}1.6 创建ProductServicepublic class ProductService {/*** 查询所有商品* @return list* @throws SQLException*/public List findAll() throws SQLException {return new ProductDao().findAll();}}1.7 创建ProductDaopublic class ProductDao {public List findAll() throws SQLException {QueryRunner qr = new QueryRunner(aSource());String sql = "select * from product";return (sql, new BeanListHandler<>());}}1.8 创建product_⽂件...pid商品图⽚商品名称${}市场价${_price}超市价${_price}商品描述操作${ }${ }修改|删除2. 添加商品本案例实现在页⾯增加⼀个超链接,点击跳转到另⼀页⾯,⽤于填写商品信息,点击保存按钮,将商品保存在数据库中。2.1 修改⽂件在页⾯上增加“增加商品信息”的内容2.2 创建⽂件主要完成form的action配置和input的name属性配置,形成增加商品信息的表单。商品名称市场价超市价商品描述2.3 ⾃动⽣成ID值在添加商品时,需要让商品⽣产⾃动的id值,因此,需要使⽤如下代码public class UUIDUtils {public static String getId() {return UUID().toString().replace("-", "").toUpperCase();}}该段代码会根据系统和硬件,⾃动⽣成包含"-"字符的32位字符串ID值。2.4 创建addproductservlet⽂件protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码,因为接受请求中含有中⽂racterEncoding("utf-8");//1.封装数据Product p = new Product();try {te(p, ameterMap());//1.1 设置(());//1.2设置时间te(new Date());//2.调⽤service完成添加new ProductService().addProduct(p);//3.页⾯跳转//请求转发uestDispatcher("/findAll").forward(request, response);}catch (Exception e) {tackTrace();ribute("msg", "添加商品失败");uestDispatcher("/").forward(request, response);}}在⽣成addproductservlet⽂件时,当添加商品失败时,为了增强⽤户体验,增加⽤于提醒⽤户。${msg }2.5 ProductService实现商品添加public void addProduct(Product p) throws SQLException {new ProductDao().addProduct(p);}2.6 创建addProduct⽅法public void addProduct(Product p) throws SQLException {QueryRunner qr = new QueryRunner(aSource());String sql = "insert into product(pid,pname,market_price,shop_price,pdate,pdesc) values(?,?,?,?,?,?)";(sql, (),me(),ket_price(),p_price(),te(),sc());}2.7 令牌机制有表单使⽤的时候,若使⽤请求转发会出现重复提交的问题,因此需要使⽤如下两种⽅法:1.重定向;2.令牌机制2.7.1 令牌机制原理服务器端在处理到达的request之前,会将request中的Token值与保存在当前⽤户session中的令牌值进⾏⽐较,看是否匹配。在处理完该request后,且在response发送给客户端之前,将会产⽣⼀个新的Token,该Token除传给客户端以外,也会将⽤户session中保存的旧的Token进⾏替换。这样,如果⽤户会退到刚才的提交页⾯并再次提交的话,客户端传过来的Token值和服务器端的不⼀致,从⽽有效地防⽌了重复提交地发⽣。2.7.2 实施过程在添加页⾯上随机⽣成⼀个字符串,放⼊session中⼀份,放⼊表单中⼀份,提交的时候在后台获取这两个token,然后移除session中的token(只使⽤⼀次),然后判断两个token是否⼀致,若不⼀致就是重复提交了。2.7.3 应⽤实例在⽂件中增加⽣成随机码⽅法public static String getCode() {return getId();}在⽂件中,增加⽣成session中的token的⽅法String code = e();//将code放⼊到session 后台进⾏验证ribute("s_token", code);//将code放⼊到pagecontext域中ribute("r_code", code);%>......在AddProductServlet中封装数据前对两个token进⾏校验//令牌机制//获取session中令牌和提交过来的令牌String r_token = ameter("r_token");String s_token = (String) sion().getAttribute("s_token");//移除session中的令牌sion().removeAttribute("s_token");//⽐较两个令牌if(s_token == null || !s_(r_token)) {//已经提交过了⽣成错误提⽰信息放⼊到request域中,传给ribute("msg", "商品已经保存");uestDispatcher("/").forward(request, response);return;}3. 修改商品信息当需要对商品信息进⾏更改时,点击表单中的修改命令,⽹页应该跳转⾄⽂件,将原来的信息进⾏展⽰,修改之后保存。因此为了实现修改商品,⾸先必须完成查询操作。3.1 步骤分析3.1.1 查询步骤创建修改超链接创建getProductById⽅法1.获取商品pid;2.通过pid获取商品,返回product对象;3.将product放⼊到request域中,请求转发到中进⾏修改3.1.2 修改步骤已经将商品的所有信息展⽰出来需要将商品的id通过隐藏域放⼊表单中;点击保存,跳转到editProductServlet;在editProductServlet需要完成1.封装数据;2.调⽤dervice完成修改更新操作;3.页⾯跳转到FindAllServlet(重定向)3.2 查询实现3.2.1 创建超链接创建修改的超链接,将原来的修改|删除修改为|删除3.2.2 创建⽂件protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码,因为传⼊的数据中⽶有汉字,因此⽆需转码//获取商品的IdString pid = ameter("pid");//调⽤service通过id获取商品Product p=null;try {p = new ProductService().getProductById(pid);} catch (SQLException e) {// TODO Auto-generated catch tackTrace();}//将product放⼊request域中,请求转发到ribute("bean", p);uestDispatcher("/").forward(request, response);}3.2.3 在服务层获取dao层数据public Product getProductById(String pid) throws SQLException {return new ProductDao().getProductById(pid);}3.2.4 dao层获取数据public Product getProductById(String pid) throws SQLException {QueryRunner qr = new QueryRunner(aSource());String sql = "select * from product where pid=?";return (sql, new BeanHandler<>(), pid);}3.2.5 创建⽂件在该⽂件中已经使⽤request域中的product数据,因此,value值为${bean.***}商品名称市场价超市价商品描述3.3 修改实现3.3.1 创建EditProductServlet⽂件protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码racterEncoding("utf-8");//封装数据Product p = new Product();try {te(p, ameterMap());//调⽤service完成更新new ProductService().updateProduct(p);//重定向direct(textPath()+"/FindAll");} catch (Exception e) {tackTrace();ribute("msg", "未能完成更新,出错了");uestDispatcher("/").forward(request, response);}}3.3.2 在服务层获取dao层数据public void updateProduct(Product p) throws SQLException {new ProductDao().updateProductById(p);}3.3.3 dao层获取数据public void updateProductById(Product p) throws SQLException {QueryRunner qr = new QueryRunner(aSource());String sql = "update set pname = ?,market_price = ?,shop_price = ?,pdesc = ? where pid = ?";(sql, me(),ket_price(),p_price(),sc(),());}最终的错误信息会显⽰在⽂件中。4.删除商品4.1步骤分析给删除添加事件点击删除,触发单击事件,弹出提⽰,confirm();点击确定,删除商品="/day14/deleteProductById?pid=?"相当于超链接deleteProductById实现1.获取商品id2.调⽤service完成删除3.页⾯重定向到findallservlet4.2 代码实现给删除添加超链接删除添加单击事件function deleteP(obj){if(confirm("你真的不要我了吗")){="${tPath }/deleteProductById?pid="+obj;}}创建deleteProductByIdServelet⽂件protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取商品IdString pid = ameter("pid");//调⽤service完成商品删除try {new ProductService().deleteProductById(pid);} catch (SQLException e) {tackTrace();ribute("msg", "你没能把我删除掉哦,这是缘分");uestDispatcher("/").forward(request, response);return;}//重定向direct(textPath()+"/findAll");}在服务层获取dao层数据public void deleteProductById(String pid) throws SQLException {new ProductDao().deleteProductById(pid);dao层获取数据库数据public void deleteProductById(String pid) throws SQLException {QueryRunner qr = new QueryRunner(aSource());String sql = "delete from product where pid = ?";(sql, pid);}5.删除多个商品5.1 步骤分析1.给每⼀个商品添加复选框,同时添加name属性,值为"pid",value为当前商品的pid;2.点击删除选中,需要将勾选上的商品的id提交给后台1)ameterValues("pid");2)必须把所有的商品放⼊⼀个表单中3)给删除标签添加单击事件,需要先获取表单,调⽤表单的submit()⽅法。3.创建delCheckedServlet1)获取商品id(String[] ids);2)调⽤service完成删除操作; 3)页⾯重定向FindAllServlet5.2 前台实现增加复选框,为每⼀个对象添加name属性,实现全选功能和按钮单击事件功能pid商品图⽚商品名称${}市场价${_price}超市价${_price}商品描述操作${ }${ }|删除function deleteP(obj){if(confirm("你真的不要我了吗")){="${tPath }/deleteProductById?pid="+obj;}}function checkAll(obj){var arr=mentsByName("pid");for(var i=0; iarr[i].checked = d;}}function delChecked(){mentById("formId").submit();}5.3 后台实现创建DeleteCheckedProductServletprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取idString[] ids = ameterValues("pid");//调⽤service完成删除try {new ProductService().deleteCheckedProducts(ids);} catch (SQLException e) {// TODO Auto-generated catch tackTrace();}//重定向direct(textPath()+"/findAll");}在ProductService中创建删除⽅法public void deleteCheckedProducts(String[] ids) throws SQLException {ProductDao pDao = new ProductDao();for(String pid:ids) {ProductById(pid);}6.多条件查询6.1 步骤分析1.在页⾯增加表单和查询按钮;2.提交路径findproductbycondition:1)获取两个条件;2)调⽤service完成查询,返回值为List类型;3)将List放⼊request域中,请求转发;tdao难点在于sql语句:select * from product where 1=1若商品名不为空 and 若商品名不为空 and pdesc like ...
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690580433a372723.html
评论列表(0条)