玩命加载中 . . .

JavaWeb综合案例


综合案例

创建maven工程,加载依赖,设置tomcat插件快捷方式

image-20200515222153693

bug1:ava.lang.NullPointerException: inStream parameter is null
提交数据库没有保存数据
原因:JDBCUtils中的/druid.properties的"/"去掉
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");

bug2:信息不回写 注册失败
原因:findUserByName的sql语句写错,查询不到值
注册功能:
1.在前端进行异步表单校验(正则表达式,离焦事件(要定义在onload方法中,否则会无效)、提交事件(submit(fun()))
2.提交表单ajax向servlet发送请求(serialize()方法将表单的值变成字符串)
3.servlet:获取数据,封装对象,调用service方法完成注册,根据返回信息,回写信息
4.service:调用dao方法查询用户信息,根据返回信息判断是否存在该用户,再调用保存信息
5.dao:实现查询用户信息、保存用户信息的功能
6.增加验证码验证,在servlet中获取验证码信息,获取存储在session中的验证码进行比对,回写信息
7.前端增加信息提示,获取回写的数据
image-20200517143251824
bug1:u.setStatus("N")空指针异常
原因:不是查询到的用户,而是传递过来的参数用户
改为:user.setStatus("N")

bug2:激活链接code= 没有值
原因:正文的超链接写错,注意' "的位置

bug3:回写信息,页面上没有显示超链接,原样输出了
原因:没有设置回写的格式
改为:加上response.setContentType("text/html;charset=utf-8");
邮件激活:
1.在成功保存用户信息之后,使用邮件工具类(需要邮箱授权码)发送邮件,内容设置成点击激活
2.在点击激活设置超链接,传参激活码,链接到servlet中
3.servlet:获取激活码,调用service方法update,传入激活码,回写信息激活成功,请登录
4.service:调用dao方法通过激活码查询用户信息,调用方法改变激活状态

image-20200517161032800

bug1:angular.min.js找不到
原因:没有该文件
改为:找到导入的代码,导入一下

bug2:点击按钮没反应||错误信息不提示
原因:前端代码写错
改为:注意#有没有加,data.有没有加

bug3:点击登录出现你好,undefined
原因:session中存储的是字符串,但异步获取的是字符串.name
改为:session中存储user对象,异步获取对象.name
登录:
1.前端绑定登录按钮事件,提交异步请求,获取信息,展示在错误信息div中
2.后端:
  servlet:获取表单信息,封装成对象,获取验证码,判断验证码是否正确,调用service方法查询user,返回user,判断是否存在,是否激活,响应错误信息
  service:调用dao中的方法通过账号、密码查询用户信息,返回user
3.页面展示:欢迎你,姓名
退出:
1.前端退出的超链接设置路径到servlet(location.href='')
2.servlet:删除session中的用户,重定向到主页(虚拟路径 request.getContextPath)
bug1:路径改过后,还是findNameServlet
原因:缓存没有清楚
改为:将缓存清空即可

bug2:NoSuchMethodException
原因:方法的修饰符是protected beanServlet没有权限获取该方法
改为:修改成public
Servlet优化:减少Servlet数量,将一个模块的功能整合到一个Servlet中
1.创建UserServlet,创建BaseServlet
2.UserServlet继承BaseServlet,BaseServlet继承HttpServlet(目的让UserServlet拥有HttpServlet规范)
3.BaseServlet:service方法:方法分发
    获取请求路径uri
    获取方法名称(截取uri)
    获取方法对象(this.getMethod)
    执行方法(invoke)
4.修改方法的修饰符public(不改会出现bug2)
5.将所有servlet整合到总servlet的方法中
6.修改前端路径(user/方法名)
image-20200518173356734
bug1:InvocationTargetException
原因:Dao层写错,在JdbcTemplate没有加参数,JDBCUtils.getDataSource()
改为:JdbcTemplate(JDBCUtils.getDataSource());

bug2:全部修改好,界面不显示
原因:缓存没有清理
改为:清空缓存
分类数据展示:
1.创建categoryServlet,继承BeanServlet
2.categoryServlet:findAll方法(public):调用service方法,获取分类数据集合,将数据序列化json,回写给客服端(可以在BeanServlet封装序列化Json方法)
3.service:调用dao方法,获取数据库分类数据集合
4.dao:查询分类数据库,返回数据集合
5.前端:header:发送ajax请求,获取数据,遍历数据添加在字符串成为li组,将字符串添加到ul中
注意:
1.使用时需要先开启redis服务器

bug1:数据仍然是通过数据库查询
原因:存储redis时key值写错,redis中没有查询到该有的值(查询的和保存的不是一个Key)
改为:将zrangeWithScores("categorys", 0, -1)-->zrangeWithScores("category", 0, -1)

bug2:list空指针异常
原因:list在成员变量中设置的是null,在数据存在的情况下,没有创建List对象
改为:list=new ArrayList<Category>();
分类数据缓存处理:
* 分类数据不常修改,不需要每次都查询数据库,将数据存储到缓存当中,查询缓存即可
1.CategoryServiceImpl中findAll方法:jedis获取缓存数据,判断数据是否存在
    不存在:第一次访问,查询数据库的数据,并保存到缓存当中
    存在:将缓存数据转换为list集合返回(因为findAll方法的返回类型是list)
分类传递id:
* 点击分类的页面之后会传递一个?cid=xxx
1.修改redis:将cid也传入redis当中(zrangeWithScore),将泛型从category改为Tuple
2.修改前端代码:header.html 传递cid
3.获取cid:location.search  (?cid=xxx)

image-20200519224338551

bug1:显示0条记录
原因:url中没有?cid=5
改为:点击正确的链接进入

bug2:点击页数,数据没有改变
原因:没有将currentPage传入ajax参数中,load(参数需要拼接字符串'+cid+','+i+')

bug3: 2.5设置好,但是分页不见了
原因:当前页面currentPage是从ajax请求返回来的pb对象中的currentPage,第一次currentPage是没有值的
改为:currentPage -- > pb.currentPage
分页查询:
1.后台:
1.1.创建PageBean类:总记录数(数据库)、总页数(可计算)、当前页码(前端)、每页显示条数(前端)、每页展示的数据集合
1.2.RouteServlet:pageQuery方法:获取参数、处理参数和初始化、调用service方法查询到pageBean对象,将对象序列化Json,回写json
1.3.RouteDao:查询总记录数、查询每页展示的数据集合
1.4.RouteServiceImpl:创建PageBean对象,调用方法/计算获取数据,将数据封装进对象
2.前台:
2.1展示总页码、总记录数:在route.html中发送异步请求,传递cid,获取到总页码、总记录数
2.2加载分页栏:利用字符串拼接,分为三部分,首、中、末,中间应用循环遍历来拼接
2.3加载分页数据:利用字符串拼接,应用循环遍历拼接
2.4分页栏链接指定:将2.2,2.3封装为一个方法,方法内是异步请求,传参cid,currentPage,点击调用该方法重新异步加载,首末页、上下页指链接,上下一页做判断避免出现负页和超页,设置当前页的格式为curPage
2.5分页栏显示10个:
    前5后4
    前不够5,后面补齐10个
    后不够4,前面补齐10个
后台注意:
1.获取输入框值的时候是val(),不要忘记括号
2.前端获取url中的cid和rname,可以使用js封装的方法getParameter("cid") 
3.在dao中拼接字符串,注意空格,like条件注意%%的拼接,sb.toString();params.toArray()不要忘记
前台注意:
1.加rname参数的时候注意单引号,需要转移字符的位置

bug1:3.2 传入参数之后,数据和分页栏都消失
原因:没有对rname解码,导致获取的值找不到
改为:在3.1进行解码操作

bug2:3.4 在首页搜索,cid为null,查询不到任何值 NumberFormatException
原因:cid的值是null,在servlet中获取cidStr是字符串null,将其转换为int类型会报转换异常,将null的情况忽略掉,后台调用数据库就会忽略掉cid的条件,不影响搜数据
改为:servlet:在转换的if中增加!"null".equals(cidStr)

bug3:修改完之后,不搜索查看所有信息,点其他页查询不到任何信息
原因:和bug2类似,增加的rname参数是字符串"null",访问数据库rname的判断语句缺少,导致多拼接了条件rname
改为:在访问数据库判断语句应该加上!"null".equals(rname)
线路查询:
1.传递信息,跳转url:
1.1.绑定查询按钮的单击事件,获取输入框的值rname,设置url并拼接字符串,cid,rname
2.后台:
2.1.servlet:获取rname,(tomcat8以前都要进行)将rname的url转码为String,将rname传入service方法中
2.2.service:对Service方法和dao方法全部传入rname参数
2.3.dao:将sql语句条件设置成where 1 = 1,之后用StringBuider增加条件,用ArrayList保存条件?的值
3.前台:
3.1.在route_list.html:获取cid,rname,将rname进行url解码decodeURIComponent(因为是字符串,浏览器会自动加码)
3.2.将cid,rname传入异步请求当中
3.3.将load()的参数全部加上rname
3.4.解决不点route页面出现cid=null的问题
    原因:在servlet中获取cidStr是字符串null,将其转换为int类型会报空指针异常
    解决方法:在转换的if中增加!"null".equals(cidStr)
bug1:传递id url是rid= 没有值
原因:字符串拼错,使用单引号,将javacript的jquery代码写在导包的后面
改为:将js代码写在一起

bug2:图片没有换,提示length无法获取
原因:循环条件写错,应该是json中的数据名(routeImgList),不是impl中存入的数据名(imgList)
改为:"routeImgList": 是json中的数据名
    for(var i=0;i<imgList.length;i++) --> for(var i=0;i<routeImgList.length;i++)
    
bug3:默认大图片还是原来的图片
原因:没有修改默认大图片
改为:将大图片拼接字符串,让其变为加载后图片的第一张

bug4:点击上下三角没有反应
原因:图片一共就4张

bug5:没点上下三角显示的是5张图,点之后隐藏成4张
原因:if语句写错,i从0开始,显示4张应该是>3的隐藏
改为:if(i>3){}
旅游线路详情:
1.传递id:
1.1.点击查看详情,超链接传递?rid=route.rid
2.后台:
2.2.servlet:获取rid,并且调用service方法获取route对象,转换为json回写客户端
2.3.service:调用routedao方法查询route基本数据,调用imgdao方法查询图片集合对象,将其封装进route对象中,调用sellerdao方法查询卖家信息对象,将其封装进route对象中,返回route
2.4.dao:routedao通过rid查询,imgdao通过route对象的rid查询,sellerdao通过route对象的sid查询
3.前台:
3.1.route_detail.html:获取rid,发送ajax请求传递rid
3.2.将获取到的route对象展示在页面上:基本信息、商家信息
3.3.图片信息拼接字符串完成(图片只显示4个,其他的隐藏),将切换图片的效果代码封装成方法,在拼接完字符串后再调用
前台注意:
2.2.未收藏是默认值,只需要修改flag为true的情况
    修改是增加属性 class增加值:already
                增加disabled属性,值为disabled,使用attr 
                (attr:可以增加部分固有属性、非固有属性,prop:只能增加固有属性)
线路收藏状态、收藏次数:
1.后台:
1.1.servlet:获取rid(url中获取),uid(session中获取),调用service方法查询出是否收藏的布尔值
1.2.service:调用dao查询收藏记录对象,如果为空则返回false,不为空则true
1.3.dao:查询数据库,获取收藏记录对象
2.前台:
2.1.使用ajax请求,传入rid,获取是否收藏的布尔值
2.2.如果未收藏,改变按钮的样式,已收藏就不用动
3.收藏次数:根据rid查询数据库收藏次数,封装进route对象中,在前台显示
点击收藏:
1.后台:
1.1.servlet:获取rid,uid,调用Service方法增加收藏
1.2.service:调用dao方法增加收藏
1.3.dao:访问数据库增加收藏
2.前台:
2.1.发送ajax请求获得用户信息,判断其是否登录
2.2.未登录:弹出未登录,并跳转到登录界面
2.3.已登录:刷新页面(不管用,不知道怎么回事)
2.4.优化:已收藏(灰色按钮)不能再点击-->删除单击事件(removeAttr是jquery的方法)

文章作者: 小苏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小苏 !
评论
  目录