终于下定决心开始用简书写总结了,以往觉得只需要写在笔记本上就可以了,但是出于对写作的情怀吧,写简书是个很不错的选择,不只是写作,更多的是自身认知能力的提升,因为角色变了,写的东西不仅自己要看得明白,你还要让别人看明白,我想这就是我写作的动力了。
Ⅰ.前期准备工作
*导入原型
需求分析,功能分析(前台后台)
前台:几大模块 各具备什么功能(比如商品页,分类,订单页,付款)
后台:几大模块 各具备什么功能(比如登陆,修改,上传,删除,改变)
*数据库分析设计(实体关系分析)
用户实体(比如id,名字,密码,邮箱,订单,状态,激活码,状态码)
商品实体(比如id,名称,价格,作者,分类,状态,与用户的关系)
订单实体(比如id,地址,时间,金额,状态,用户id)
订单项ID实体(比如订单id,图书id,数量,小计)
分类实体(比如cid cname)
这部分会涉及到中间表,外键(必须弄清表与表之间的关系,这是处理数据的前提)
*搭建环境。
创建项目,引入jar包,引入需要的工具类包括js工具类和一般java工具类。
引入jar包,注意JAVA项目的包需要buildpath。
*功能分析:建立包结构(三大框架)。
特殊环境:没有邮箱服务器需要搭建邮箱服务器环境。
Ⅱ.正式开发
三大框架整合开发
三大框架整合环境建设是前提,环境配置好一定要先进行测试。
Struts层 处理用户请求,主要负责参数接收和传递
Spring层 把外来的一切都纳入自己的管理范畴 和事务有关的操作放在service层,复杂的业务可以在service层进行进一步处理,如设置特殊属性,处理多个参数,以及事务的分解。
Hibernate层 和数据库打交道。主要的配置在映射文件里。Id生成策略 Inverse lazy 等属性需要特别注意。
*需要特别关注的问题
主要着眼于功能的实现和安全性,不必在意样式设计,但要特别注意代码的整齐性和简单易读性。
从登陆注册开始,需要什么创建什么,这样思路比较清晰。先不急于写代码,思路想好了,代码只是时间的问题。
应用集合要慎重。HashMap :没有特殊排序要求,可以根据某个id删除对象时用 ArrayList有明确顺序,可以根据书序值删除对应对象时候用。
充分考虑逻辑性的问题,不要急着运行程序。一般从用户走到数据库,再从数据库一步步回显到用户界面,每一步设置的变量要记清。实现某个功能,先分析它的切入点在哪,点击携带的信息传递给谁,涉及哪些类,jsp和数据库,他们之间的访问逻辑是怎样的,以及最终的跳转页面和需要展示的信息。这也是排错时的一般思路。需要什么条件,缺什么条件,条件有什么问题。
遇到一些难以检查出来的问题,先放一放,做下一个和它类似的功能,在比较两者的不同,一般都是很小的错误,比如括号和引号用错等。
关键技术总结
验证码技术
①引入验证码工具类
②把生成的验证码放在session中
③在servlet中进行校验
④牵扯一个验证码刷新技术,验证码上放一个onclick()函数,在每次请求路径后边加上一个日期的参数,这样每次刷新得到的验证码都不一样。
记住用户名(cookie)
①在请求成功后页面跳转前加上。
String parameter = request.getParameter("save");
//记住用户名的value值
if ("ok".equals(parameter)) {
Cookie cookie = new Cookie("username", string2);
//参数 cookie名 cookie值
cookie.setMaxAge(7 24 60 60);
cookie.setPath("/");
response.addCookie(cookie);
}
②在登陆页面加上
七日内免登录。(session)
①在登陆页面加上免登录选项
②在登陆成功后页面跳转前加上一个类似于记住用户名的判断。
③设置一个过滤器。在doFilter方法中进行设置。(用模板)
根据用户的不同类型进行页面权限的分配。
用模板,和上面的差不多,不要忘了配置过滤器的xml。
阻止用户直接登陆后台(jstl或者过滤器)
判断页面中是否有user的session对象
在doFilter()中判断。如果请求中有user 的session对象说明它登录过,可以访问。如果没有,那就是没有登录过这账号,阻止登陆。
Struts的拦截器:写一个类继承filter.在struts中进行配置。
令牌机制(防止重复提交注册信息)
在提交信息的页面的session中存入一个随机字符串
加上一个隐藏字段,该隐藏字段的值也是一个随机的字符串。而且相同
在servlet层中获取到那个UUID。然后把seesion中关于这个UUID的属性去掉,然后比较session中的UUID和隐藏字段的UUID。
隐藏字段==null||!隐藏字段.equals(session中的值)
第一次提交的时候,两个值相同,可以提交。
第二次提交的时候,session中的值没有了。隐藏字段也变成了null,所以再次判断的时候就不能提交,而是跳到错误页面抑或是原来的页面。
JAVABEAN的自动识别和简单运算技术
有getName()这个方法就默认有name这个属性(引起重视)
可以通过get方法,直接操作属性进行加减乘除添加删除清空等方法的编写(本来就有的,现在才发现)。
异步校验用户名是否重名(AJAX)
在注册名文本框上添加onblur函数。
然后是ajax异步校验模板。
通过三层架构获取到数据库里面是否有用户输入的内容,之后用DOM技术进行回显。
仿百度搜索提示(Ajax技术)
在注册名文本框上添加onblur函数。然后是ajax异步校验模板。
通过三层架构获取到数据库里的数据,截取(sql limit a,b)几个回显到一个jsp页面。之后会响应到responseText中,然后用DOM回显到搜索框下拉表中。
分页技术(算法问题)
创建分页的实体类,涉及当前页,总页数,总记录数,每页记录数,以及每页显示的记录的list集合。使用EasyUI的分页查询技术(默认值变量page和rows一直在页面)
Ⅲ.完善开发
考虑客户提交空参数的跳转。
考虑用户知道后台登陆路径的后果。设置过滤器阻止用户直接访问servlet和核心servlet
考虑代码的优化性,便于以后进行维护。推荐使用配置文件设置一些变动需求多的数据。
问题:tomcat运行错误
错误解决:端口被占用,重启或者通过tomcat根文件xml文件更改默认端口(端口默认8080)
接上一步:如果把项目部署到服务器不能访问下面的文件,需要在访问地址localhost后面加上服务器的端口号。
细节类错误总结:
字母,数量,位置,顺序写反。少敲空格,多敲空格。
对应位置错误,此处是用这个,另一处用那个,本应该统一,却因习惯问题弄成不同的。
上传类型enctype="multipart/form-data" 写错。
编写JS脚本的时候,千万不要把js中的变量var写成String ,不然它虽然编译可以通过,但是不会得到结果。
当web.xml中servlet的url-pattern的路径设置为*.xxx,前面不需要再加上个“/”,否则服务器启动后会出现非法参数异常。Tomcat服务器正常关闭是在工具栏中执行的,不是在控制台上直接关闭。
一个不常见但是值得注意的问题就是浏览器缓存问题,有时候你更改服务器端数据,由于浏览器之前缓存过页面,所以无论你怎么修改,他都是第一次加载的数据。所以,服务器上的一些链接要么别改动,要么在访问路径后边加上一个可变的参数,比如时间。这样每次访问都会重新发送数据。
以后记着,字符串比较相等用equals。对象数字比较用==
在html页面中的路径可以用“../” 在jsp页面只能用${pageContext.request.contextPath}/
Easyui中的html和jsp的数据是共享的,可以互相调用。
报错:没有对应映射 解决办法:检查action类 没有问题检查 applation.xml中的组建扫描
再检查注解
Write operations are not allowed in read-only mode (FlushMode.MANUAL) :事务注解没有开
Json数据回显时会出现数据是对的,页面不回显,那多半是因为你转jsond的时候,jsonObject和jsonArray用错了,或者用反了。还有就是传回数据没排除干净。
序列化和反序列化其实就是形态的变化,把数据或对象从一种形态转化为另一种形态,数据内容和本质还是一样的。Bean中的序列化指的是对象转为二进制,反序列化则相反。而jsonlib中的序列化是把集合转为json数据以方便页面的解析。这两个是不一样的。
对于一些检查不出来的非代码错误的问题,很可能是因为排版问题比如注释掉不该注释的或少注释了,还有就是界面控件的设置问题而引发的取不到值的问题。尽可能的多尝试改动与这个错误相关的细节问题,因为这时解决问题的唯一途径了。
有关报映射问题错误或者动作错误,一般都是由很小的错误引起的,要检查动作名和路径名是否一致,另外就是配置文件的返回页面配置的问题。
Jsp页面大面积错误并提示jsp.sevlet.PageContent.cant… 把tomcat 中lib下的jsp-api 和servlet-api 两个jar包导入到工程
控制台出现ambiguous这个字眼的时候,是因为某个方法或者路径定义重复了。
Ⅳ.框架学习总结
Dao层框架
A.MyBatis框架:
1.最外层用mapper包括 ,意味着整个配置文件都是映射!!!有一个命名空间,说明当包过多时用它的命名空间可以做一个区分。
2.然后里面包裹了一个又一个sql语句,如果共同的部分太多,可以用标签做一个统一的查询语句,如果别的查询语句需要就可以通过标签引用补全,这是最核心的部分
3.语句很多,有基本的增删查改,还有复杂的多表查询和条件查询。优势是可以随时修改sql语句,应用灵活。
4.每一个语句的id就是接口中的方法,这一点很关键。此外还要指定查询参数和返回的结果类型。返回类型可以简单写成pojo类名,但是你需要在spring中配置
name="typeAliasesPackage"
value="cn.itlfy.core.pojo"> 这段配置
这和在sqlMapConfig里面的别名配置一样。
5.查询语句中最复杂的条件查询会用到标签,以及标签,根据实际需要决定是否需要哪个条件。
6.更新语句中记着加上set标签才能完成整个查询。
7.一般参数用#{custSource}作为占位符 条件查询中参数like '%${custName}%' 和like "%"${custName}"%"两个达到的效果一样.
8.出错最多的地方在扫描包的配置上面。
B.Hibernate框架
1.把bean的属性和表中的字段形成映射,然后操作bean就可以直接操作数据库,主要通过HQL和离线查询语句来实现对表的操作,核心配置文件被spring托管。可以不存在。
2.表与表之间的关系有三种,其中一对多最常见,多对多最复杂,一对多通常需要配置casade属性进行级联删除,还需要在失去维护权的一方配置文件中另一方的集合上配置inverse=true;用来解决级联添加,只需一步操作。这样能提高查询速度,提升客户体验。
WEB层框架
struts框架
第一个web层框架,由动作来完成页面数据的处理和跳转,页面传过来的属性用动作所在的类的成员变量接收,在动作中进行一些列处理给service层,得到数据后存储到值栈中,在页面取出。配置文件里主要配置动作的返回页面,可以进行重定向和转发。
在页面,有它提供的标签,来对返回的数据进行处理。需要引入它的标签库。
程序应用阶段 true一定要变成false!!!
SpringMVC框架
对页面参数的处理放在了方法上而不是成员变量上,有模型接收,也有变量接收,还可以通过httpservletrequest等接收。通过注解形式来对页面请求的动作进行映射,从而完成特定的功能,注解扫描需要配置,得到返回的数据后,可以通过注解,变成json数据返回给页面,也可以直接返回页面的名称,映射到页面。
似乎每一个web层的框架都有拦截器,都需要先继承一个类或者实现一个类,然后在配置文件里进行配置,从而达到拦截的目的。而拦截器处理的套路一般都一样,取出session中的数据,然后对比一下拦截的数据,一致就放行,不一致就让它跳到登陆页面。
Service层
Spring框架
这是一个航空母舰级别的框架,本身并没有什么用,而是通过整合其他框架,让他们发挥各自的优势,由它来调用,从而提高效率,每一个类如果想受他调用就必须在它的配置文件里面注册bean。
配置文件里可以整合所有的其他框架的配置文件。但一般都是分好几个配置文件进行配置,便于管理。
开启注解开发可以大大减少配置文件的配置,需要配置注解驱动和扫描驱动否则无法找到注解,更不会调用,这个错误经常犯。任何类,如果想要引用另一个类,只需要通过注解的形式引入它就可以实现对其方法的调用。
AOP不属于Spring,aop是一个联盟!
工作总结:
对于自己不熟悉的技术:
如果非常厉害,那就要学习;
如果你掌握了类似的技术,你还要学它,并对两者进行一个比较,明白什么情况下要用它,因地制宜选择对应的技术去完成特定的功能。
网友评论