(注释中文乱码,只能说你可以导入别人的项目乱码,可以自己的项目不同项目乱码,但千万不要同一项目不同类用不同的编码)
1. Map<String,String[]> map=request.getParameterMap();搭配BeanUtils.populate(类,map)可以做到将页面参数配合类的set方法一起封装到实体类里。其中如果涉及到日期格式,即实体类中是Date类型(如private Date birthday;)它的populated只限于字符串
,所以可以自定义myBeanUtils,里面其实嵌套BeanUtils.populate,只是为了日期来注册一个时间转换器:
转换是convert,格式是pattern,所以它得将一个设置了格式的转换器(DateConverter)注册到ConvertUtils.register(转换器,转换类)。
2.servlet的开发真的该被淘汰,用个c3p0还得自己写一堆重复的连接,事务提交和queryRunner等。
3.关于页面跳转:
ssh是返回给struts.xml一个字符串, <result name="success" type="redirect">/index.jsp</result> type里面决定要不要重定向
ssm返回的是“redirect:/xxx” xxx的前后缀已经在springmvc中定义。
servlet却是 response.sendRedirect("/store_v1.0/index.jsp"); return null;
springboot 与ssm区别在没有springmvc-config.xml,所以是在WebMvcConfiguer里定义:
registry.addViewController("/login.html").setViewName("login");注册控制器的视图,并给它别名。
4.我自定义了一个BaseServlet extends HttpServlet,在里面截取url,获得访问的方法,再从继承BaseServlet的运行的子类中取出和请求的方法同名的方法,再写请求分派路径。我想这就是SSM的@RequestMapping前身。
5.在导航栏的显示中,查询所有分类运用了redis。
JedisConfig用来如果你有最大连接数类似的要求。JedisPool()来启动连接池,参数为config和主机号、端口号。有了连接池就可以获得数据源getResource()。之后的使用语法就是get/set,set要存的是json类型的。resp.getWriter().print(jsonstr);是用来输出到前端的。记住close().
6.
加入购物车功能:
购物车在数据库中是没有表的,它是存在用户的session中的。而订单和订单项都有表。
实体类有cartItem,购物车需要有product另一个实体类,数量,金额;多个cartItem再放到列表里,放到实体类cart里,数量,金额。值得一提的是数量的叠加和金额的计算实在实体类中实现的,逻辑是:HashMap<String,cartItem>,通过map来确定其中是否之前已经有加入购物车,有的话把之前的数量加上现在的数量作为新数量(map.getKey(xx).getItem().getNum()+传进来的item.getNum()),金额的叠加用:map.getValues()返回一个列表迭代相加,所以map和购物车搭配真心好用,反正是session里存的暂时数据,map.remove/clear实现删除某个购物车项和清空购物车。
添加商品到购物车用的就是上面map的数量叠加逻辑,所以在servlet层写的时候,从session中取出“cart”,cart.add(cartItem)
7.我的订单:
从session取出cart,orderItem需要它的product/数量、金额,再把多个orderItem存到order里,order有额外属性,如订单的编号、时间、用户。在保存的时候要注意,由于order表和orderItem表有依赖,所以事务得一起提交,所以con.setAutoCommit(false); 最后再.commit();值得一提的是在分页显示我的订单时,分页的bean有一个Url属性,是用来方便拼接跳转路径的,单独付款某个订单的pm.setUrl("orderServlet?method=findbyPage");分页的时候从数据库拿信息也很有趣,为了数据的不冗余,会有product表、orderItem表和order表,用的时候再表相连。这个时候除了根据用户id获得order外,还要把product表和orderItem表连接,用到BeanMapHandler()和populate把数据库信息装到相应的两个实体类中。
8.注册邮箱验证:
注册保存用户之后,写一个工具类MailUtil,里面是如何锁定邮箱,发送链接,链接里面还是个包含了active的url,这样点击之后就会触发另一个方法,那个方法返回到注册页面告诉你是否注册成功。
9.文件上传:
和ssh不一样,没能直接就取到上传的文件信息。而且ssh是图片保存。我们现在要的是上传本地图片,是开发者非用户者角度,而且估计还是不同主机上传到某一台主机,当管理员点击表单提交,触发servlet层相应方法的时候,要把图片从磁盘-->变成文件项--->上传到request请求中,所以:
new DiskFileItemFactory();//factory ServletFileUpload(factory)//感觉像内嵌了一种处理方式 upload.parseRequest(req)//就是启动内嵌方式把req返回List<FileItem>,又由upload包装成与上传有关的格式吧。
List<FileItem>//list,迭代用a表示,有的是表单项,有的是图片上传项,这是不同类型,要不同处理,所以用map来存储;用.isFormField(),是表单域就是普通表单项,map存的是名字(a.getFieldName())、值(直接a.getString("utf-8"),FileItem直接就是值)而对于文件项,名字是a.getName(),后面常规操作创建文件夹什么的,不同的是保存图片时用的是流的方式,IOUtils.copy(输入流,输出流)a.getInputStream()获得输入流,FileOutputStream(地址),保存的地址。map存路径。