集成开发软件:eclipse
使用技术:Struts2 Mybatis maven jqery js
数据持久化工具:Oracle数据库
创建maven项目搭建开发环境
引入所需依赖jar包
junit junit 3.8.1 test javax.servlet javax.servlet-api 3.1.0 provided org.apache.struts struts2-core 2.3.16 org.apache.struts.xwork xwork-core 2.3.16 log4j log4j 1.2.17 org.projectlombok lombok 1.16.20 provided org.mybatis mybatis 3.2.2 ojdbc ojdbc 14 patchca patchca 0.5.0 jstl jstl 1.2 javax.servlet.jsp javax.servlet.jsp-api 2.2.1 provided com.github.pagehelper pagehelper 5.1.2 com.alipay.sdk alipay-sdk-java 3.7.4.ALL javax.mail mail 1.4
配置web.xml3.0版本
loginFilter com.huhuya.zyh.interceptor.LoginFilter loginFilter /back/main/* /back/book/* /back/category/* /back/order/* /back/user/* struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*
配置mybatis-config.xml
配置jdbc.properties 原理是类似于key value赋值 设置连接数据库的属性名字以及值
oracle.driver=oracle.jdbc.OracleDriver oracle.url=jdbc:oracle:thin:@localhost:1521:xe oracle.username=hr oracle.password=1234
配置struts.xml配置文件 此处使用 包含其他struts配置文件
举例其他模块的struts.xml配置文件
/back/main/main.jsp /back/login.jsp /front/user/register_form.jsp /front/user/login_form.jsp /front/user/register_ok.jsp /front/user/verify_form.jsp /category category_clientShowAll /address findAllAddress
配置Mapper.xml文件
问题1&#xff1a;如果是2.3版本 不能使用El表达式 需要在jsp头部引入 isELIgnored&#61;"false"解决方案&#xff1a;①修改web.xml版本为2.4 / 2.5 / 3.0 当修改为2.3以上版本时,可以在页面中直接使用el表达式②在jsp页面中添加el表达式的显示支持 isELIgnored&#61;"false"例 &#xff1a;<%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"utf-8" isELIgnored&#61;"false" %>2.3版本的jsp页面是不支持这个属性提示的,报黄线属于正常这时虽然可以使用el表达式,但与c标签结合使用时,会出现如下异常According to TLD or attribute directive in tag file, attribute items does not accept any expressions 查阅资料,貌似是c标签在2.3下不能与el一起使用解决方案&#xff1a;使用c标签的扩展库/c-rt /WEB-INF/c-rt.tld 上面的代码是在web.xml中配置的,当然你也可以直接在jsp页面中配置<%&#64; taglib uri&#61;"/WEB-INF/c-rt.tld" prefix&#61;"c"%> 或<%&#64; taglib uri&#61;http://java.sun.com/jstl/core_rt prefix&#61;"c"%>这样就可以在c标签中使用el表达式了
问题2&#xff1a;搭建环境时注意jar版本不兼容问题 例如ojdbc需要自己手动引入新建maven项目时需要切换jdk版本生成maven项目目录结构
写后台登陆时需要注意的问题
1&#xff1a;jqery实现表单非空以及格式验证
$(function(){var usn &#61; false;//验证账号名 通过id取值$("#txtUsername").blur(function(){var username &#61; $(this).val();var reg&#61;/^[a-zA-Z0-9]{3,20}$/;if(username&#61;&#61;""){$("#nameMsg").html("账号不能为空");usn &#61; false;}else if(!reg.test(username)){ $("#nameMsg").html("用户名为3-20位");usn &#61; false;}else{$("#nameMsg").html("√");usn &#61; true;}});//验证密码//通过id取值$("#txtPassword").blur(function(){var password &#61; $(this).val();var reg&#61;/^[a-zA-Z0-9]{3,20}$/;if(password&#61;&#61;""){$("#passMsg").html("密码不能为空");usn &#61; false;}else if(!reg.test(password)){ $("#passMsg").html("密码为3-20位");usn &#61; false;}else{ $("#passMsg").html("√");usn &#61; true;}});//验证from表单提交直接点击提交的时候验证所有的方法验证$("form").submit(function(){//将所有input框中的blur事件都执行一遍$("input").trigger("blur");if(!usn){return false;}});});
2&#xff1a;验证码异步刷新
首先在验证码刷新路径上定义一个点击事件换张图 也可以设置一个点击事件onClick&#61;"changeImage()" 点击图片的时候也会刷新写jqery代码//点击更换验证码function changeImage(){$("#imgVcode").attr("src","${pageContext.request.contextPath}/user/code?a&#61;"&#43;new Date().getTime());}
写后台类别的时候需要注意
1&#xff1a;写sql语句的时候写requestMap映射的时候注意id冲突问题
2&#xff1a;表关联查询
requestMap的书写
注意&#xff1a;如果需要关联表的值就写requestMap 如果不需要可以不写
左外关联on所连接的条件一定要在map中写出来不然也会出现问题
Mabatis中如果Mapper文件中做map映射的时候出现了错误其他的功能也会受其影响&#xff0c;因为
程序运行顺序为先运行web.xml,web.xml中写的有struts过滤器&#xff0c;会扫描struts
当链接数据库是会执行maybatis-config.xml文件 此文件做的mapper文件映射
这个时候会检查出来其他的mapper文件中的错误&#xff0c;会乱报异常
3&#xff1a;select下拉框的动态显示以及回显&#xff0c;
动态展示需要去数据库中查询&#xff0c;然后从作用域中取出
${cate.cate_name}
回显需要你传进来的所需id与数据空查询的id对应起来使用;
例如图书的动态获取以及回显:
${cate.cate_name} ${cate.cate_name} 后台已经没什么问题了 下面就是前台
前台 1&#xff1a;展示所有的商品以及各种不同展示涉及问题如下
sql语句随机查询2条数据
select * from (select * from dd_book order by dbms_random.value) where rownum<3 and author&#61;&#39;abin&#39;
sql语句降序升序
ORDER BY 语句用于根据指定的列对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序&#xff0c;可以使用 DESC 关键字。代码&#xff1a; 以字母顺序显示公司名称&#xff1a; SELECT Company, OrderNumber FROM Orders ORDER BY Company以字母顺序显示公司名称&#xff08;Company&#xff09;&#xff0c;并以数字顺序显示顺序号&#xff08;OrderNumber&#xff09;&#xff1a; SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber以逆字母顺序显示公司名称&#xff1a; SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
分页&#xff1a;
//生成6位随机数字的方法System.out.println((int)((Math.random()*9&#43;1)*100000));//生成5位随机数字System.out.println((int)((Math.random()*9&#43;1)*10000));//生成4位随机数字System.out.println((int)((Math.random()*9&#43;1)*1000));//生成3位随机数字System.out.println((int)((Math.random()*9&#43;1)*100));//生成2位随机数字System.out.println((int)((Math.random()*9&#43;1)*10));//生成1位随机数字System.out.println((int)((Math.random()*9&#43;1)));
mybatis提供的分页查询工具使用步骤&#xff1a;1&#xff1a;导入jar包 pagehelper 引入到项目中2&#xff1a;在mybatis-config中配置 插件拦截器 注意&#xff1a;位置不能放错The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"以上是标签书写顺序3&#xff1a; 注意action的使用Page startPage &#61; PageHelper.startPage(pageNum, 3);查询语句的sql必须写的result的上面bookService.findAllFirstAndScondeBook(category.getId());List result &#61; startPage.getResult();List list1 &#61; bookService.findAllFirstAndScondeBook(category.getId());int count&#61;list1.size();获取一共是多少页pageCount&#61;count%3&#61;&#61;0?count/3:(count/3)&#43;1;request.setAttribute("list",result);
购物车思路&#xff1a;存购物车的两种方式&#xff1a; 1&#xff1a;Map> 这样的好处是后面存订单的时候&#xff0c; 可以直接从购物车中直接获取&#xff0c;很方便&#xff0c;建议使用 2&#xff1a;Map 这种也挺好的 就是在存订单的时候有点不方便 实现逻辑&#xff1a;我只实现其中一种//查询商品信息List list &#61; bookService.findBookById(book);Map map&#61;(Map) session.getAttribute("cart");//获取商品对象book&#61;list.get(0);//判断购物车是否为空if(map&#61;&#61;null) {System.out.println("为空");//为空创建购物车map&#61;new HashMap();map.put(book,1);session.setAttribute("cart",map);}else {//遍历mapfor(Book book1:map.keySet()){;//判断此商品是否已经存在if(book.getId()&#61;&#61;book1.getId()){System.out.println("加一");//如果存在上商品数量加一map.put(book1,map.get(book1)&#43;1);session.setAttribute("cart",map);System.out.println(map.get(book1));}else {//如果不存在直接存进购物车map.put(book,1);session.setAttribute("cart",map);}} }//算出商品总价存进作用域Set k1&#61;map.keySet();for(Book book1:k1){Integer num &#61;map.get(book1);sum&#43;&#61;book1.getPrice()*num;sum1&#43;&#61;book1.getDiscountPrice()*num;sum2&#61;sum-sum1;session.setAttribute("sum",sum1);request.setAttribute("sum2",sum2);}return "cart"; }
jquery点击事件实现路径的跳转 function change(bookId){/* 控制台打印 */console.log(bookId);var num &#61; $("#"&#43;bookId).val();var reg&#61;/^[0-9]*[1-9][0-9]*$/; if(!reg.test(num-0)){ alert("此处必须为数字");}else{ location.href&#61;"${pageContext.request.contextPath }/shop/shop_modifyCart?book.id&#61;"&#43;bookId&#43;"&num&#61;"&#43;num;} }jsp页面代码变更
邮箱和alipay的使用
此次项目完成用了八天 我自己的问题主要在于js 以及jqery 比较弱其他功能实现基本没什么问题 主要是表单验证以及jquery代码比较浪费时间 需要加强练习 收获&#xff1a;对表单验证jquery代码有了更深的理解