一:新建java web项目 (懂得使用gradle哦!)
1.http://www.cnblogs.com/xylle/p/5234380.html
2.新建项目后,然后新建module, 如果甲Module要使用乙Module的类,我们可以在gradle中编译乙Module的类。 实现导入!
你的问题:mapper语句!
3. mybatis的@Param:此注解可以让sql语句语法更宽松! #{}和${}都可以! 不然只能是#{}。
4. 建表——》 写mapper文件(sql文件)、dao接口、domain;
注意还有数据库配置文件哦! 所以最重要的还是mybatis的配置文件和spring的配置文件哦! spring整合mybatis;这个要好好的看看哦!
二:重大突破
1.我居然学会用mybatis generator生成JavaBean、mapper文件、接口了! 哈哈哈哈! 找回自信!你可以的!
http://blog.csdn.net/wyc_cs/article/details/9023117
http://blog.csdn.net/zhshulin/article/details/23912615
配置好配置文件——》 java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite
2.我也学会了哦:
A. exploded archive (development mode) 这种叫开发模式这是直接把文件夹,jsp页面 ,classes等等移到tomcat 部署文件夹里面,进行加载部署
B. Packaged Archive(production mode) 这种叫发布模式,这是先打成war包,再发布。
三:遇到的问题
1.mapper文件的路径问题,找不到? 这时候代码提示就是调错利器了! 致伟大的IDE!
2.看之前项目的package不就知道它需要什么包了吗? 9494
3.generator生成的sql语句只有insert: 哦,没有设置主键哦!
4.java区分: 双引号和单引号哦! String:“” char:‘’
四:项目搭建
1.R工具类里的变量必须声明为final,@Requestmapping的value才不报错! 必须是常量(声明为final就没事了)
2.vm文件居然可以在地址栏直接访问! dream-heaven.vm
3.问题描述: web.xml没有读取到,项目是怎么启动的呢? 将青奥的build.gradle里面的东西copy进来就OK!
4.log4j的配置文件复制进来就可以用? 居然这省事?
5.报错信息
A:2016-11-08 17:59:23,706 ERROR (org.springframework.web.context.ContextLoader:331) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'indexController' defined in file [C:\Users\Administrator\Desktop\life\classes\artifacts\sunwin.zhangdong.web\exploded\sunwin.zhangdong.web- 1.0- SNAPSHOT.war\WEB- INF\cla sses\sunwin\zhangdong\web\controller\IndexController.class]: Post-processing failed of bean type [class sunwin.zhangdong.web.controller.IndexController] failed; nested exception is java.lang
解决:将之前青奥项目的gradle的那个copy到gradle.build里面。
B: tomcat依旧报错: org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart org.apache.catalina.core.StandardContextstartInternal
SEVERE: Context [/******] startup failed due to previous errors
解决:http://xpenxpen.iteye.com/blog/1545648
6. 地址栏请求没有进入断点? 什么鬼? (Spring MVC模块哦) Spring的试图解析! (参照王金生的项目哦!哈哈,抄,你总会吧!)
答:说明dispatcherServlet没有拦截到?
五:遇到的问题
台阶一: 断点会影响tomcat的正常启动的哦!
台阶二: spring mvc的配置文件:视图的解析这里要好好的看下哦! 对配置文件的深入理解!
台阶三: web.xml 中的 dispatchServlet的url-pattern这个何解呢? 多个顺序执行?
台阶四: 伪静态
答:设置请求后缀名为html,控制器返回逻辑名,然后为逻辑名添加“.vm”后缀(spring mvc做视图的解析)!
台阶五:视图无法解析,web.xml中的配置问题,路径没配对,没找到vm文件。 主控制器不用return哦!
台阶六:List<domain>的size打印出来,但domain的属性值为啥就没查不出来呢? title属性查出来为null? 但content是有的哦! 什么情况?
答:哦,原来是mapper文件里实体类和数据库表对应的时候字段搞错了!
六:
1.什么鬼? 之前项目是好的,突然访问就404了,用gradle刷一下,重启居然又好了?
七:web项目启动顺序:web容器——》spring 容器
八:
定义请求路径,资源没有return路径,返回的是ModelAndView,vm文件是如何找到的呢?
还有页面死活解析不了velocity:$!R; 这是什么鬼? href属性没有值? 哦哦,没有添加到http的session中,用spring的话:添加到modelMap里哦!
九:
1.静态与非静态调用! 注意类名的大小写哦!
2.增加代码流程:点击button,调用js方法,调用ajax提交表单! 请求被控制器拦截:控制器调用service方法——》service层调用dao方法
1.触发ajax, 请求参数准备好! 然后发送过去。
2.拦截请求,请求参数入参, 控制器内部调用service层方法,service的方法内部调用dao层的方法。 实现数据的CRUD!
so easy!复杂的地方框架都封装了! 真正有内容的地方:视图渲染、请求参数入参!
3.parsererror, status: 200, statusText: "OK" 这是为什么呢?
答:哦,ajax参数url是空的,velocity没解析出来哦!
十:
1.spring MVC的机制:控制器里可以带ModelMap哦! 盛装bean的容器! spring创建的modelMap哦!
2.404错误,ajax提交的url路径没有? 还是没被拦截? 哦哦,url为空,所以才找不到资源路径啊!
3. R工具类里的请求路径? P里面:定义视图文件的路径!
视图的真实路径都是完整的目录哦!(相对目录)
4.spring控制器处理请求:返回String、modelMap、modelAndView?
5. 500:Could not resolve view with name 'guidelines.find' in servlet with name 'spring-web'
是不是因为文件目录太深了? vm/../../文件位置。 初步断定是这样子的哦! 好像不是哦! vm文件夹下的.vm文件都会遍历到?
6. 富文本编辑框的内容无法被表单序列化? 所以创建的时候内容没有! 查找王金生的哦! 看来好像不是得!去掉richtext照样没内容!
form表单无法被序列化: 序列化值为空! 我了个擦!
答:哦,表单的input元素必须有name属性哦! 不然无法传值的哦!
7. ajax创建记录后:数据库中没有值,应该是ajax请求参数绑定的时候出了问题! 所以domain的值为null!
ajax请求被拦截了,但是请求参数入参失败!
十一: 读项目代码
1.ModelAndView? 必须return? 是的噢,或者将ModleMap作为方法的形参,这样就可以啦!
2.AjaxResult: 封装Ajax请求的响应消息 统一规范Ajax响应消息的内容
3.参数如何传递到控制器中的? springMVC的机制
十二:
1.客户端与服务端的操作都是建立在: 发送请求——》 拦截处理请求——》生成并返回响应——》处理响应
1.@RequestMapping可以在类上面配置哦!
2.spring MVC:完成"http请求信息入参"(这一点非常的重要哦)
Servlet API: 或者直接用HttpServletRequest request请求对象
控制器返回值:ModelAndView(模型和逻辑视图名)、String(逻辑视图名)
控制产生模型数据,而视图是为了渲染模型数据!(渲染:就是呈现方式) 各种文件格式
@RequestParam('password'): 请求参数"按名称匹配方式"入参
@RequestParam等等:方法签名!
数据校验:在执行业务逻辑前要进行数据校验!
Http请求报文到达服务器后,web服务器会将其封装成一个HttpServeltRequest对象。
乱码的原因:velocity配置的问题? 很可能哦!(之前项目不是这样吗?)
宏:批处理,多条指令合并! 完成一项任务!
十三:
1.项目启动首页报404,因为请求都没有被拦截哦! 没进控制器!
2.css、js文件找不到! $!basePath 文件路径写成绝对路径!这样就不会有问题了!
十四:
1.enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 encode type
2.servlet用来处理请求! (晚饭后看看吧)
3.移动端320px?
4.表单:收集用户输入信息!
对信息编码(在请求报文中),发送http请求报文到服务器端!
服务端将请求报文封装为HttpServlet的实例! 后端以面向对象的方式操作!
服务器端利用HttpServletResponse的实例,完成对响应报文的设置,然后发送回客户端!
十五:
1.ajax创建那个终于搞定了啊! 哈哈哈! 原来是页面input的name属性必须设置为何domain一样的啊!
快乐是什么? 成功是什么? 就是得其所想! 自己强烈的想做成一件事,然后历经磨难终于柳暗花明,得到预期! 哈哈哈,哈哈哈! 加油,young man!
2. 406:客户端浏览器不接受所请求页面的 MIME 类型!
答:解决方法: 因为请求时候的MIME类型是application/html; 相应的却是application/json!
所以将请求时候的MIME类型改为application/json即可! 奇了怪了,就是按照王工的那个来大家你的啊!
3.错误的原因:jar包的版本依赖问题导致的哦!
十六:
1.请求报400,看来是web.xml先处理的请求吧!
答:解决400,原来是请求参数不合法吧! 因为创建时间在转换过程中肯定出错了!
2. jquery: $.each()
3. id为啥获取不到呢? 页面不显示? 和domain中的属性名不一样? 啥情况啊!
答:哦哦,访问类变量id的时候是调用那个它的getxx方法,此处的getInteger(), 改为getId()即可。
undefined:未引入就先使用了哦! 必须先引入jquery,然后才能用jquery哦 ! (顺序又忘了注意)
4. int和integer
5,guideMapper:500错误 Dao层:空指针异常; 数据库表id是自增长的,所以插入的时候就不能再包含id了,或者选择insertSelective。
6.数据库update无效? dao层的方法执行失败。 原来是id没有传递进去哦! 擦了!
好好利用debug功能吧! 看debug模板界面,不要只看代码后的输出! 还有打印出来就什么都知道了! 哦哦! 哈哈!
执行update、delete操作的时候一定要知道唯一标识此条记录的domain哦!
十七: debug,所有的错误信息都要看一下哦,不要只看开头,以根错误为起点、重点,但解决不了就需结合下面的错误信息哦!
1.擦了,突然间报一大堆错误! bean无法创建? http://blog.csdn.net/zzg1229059735/article/details/51320218
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [sunwin.zhangdong.dao.GuidelinesMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
答:通过添加注解解决了,但又报错了, 原来是mapper文件里面一个单词被空格分开了,日。。。。。。。查了快整整一天。。。。。。
mapper文件有错,导致无法创建dao层接口的实现类,所以无法完成dao bean的创建,连锁反应!
依旧有错:BeanDefinitionStoreException nested exception is java.lang.ArrayIndexOutOfBoundsException: 2675
再答:日,原来是注解搞得鬼,去掉@Qualifier("guidelinesMapper") 就好了!
2. 删除操作报406(ajax删除)
哦,老问题了,请求后缀改为.json就Ok了!
然后居然还报错,哦,ajax的data参数你居然都写错了,很久不用的下场啊! data:String或Object
3. 日期的问题,日期在数据库中的格式,日期java类型?
十八:
1.com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
a:表里的字段命名,有无和mysql的关键字冲突。
十九:
1.记得浏览器中打开页面,导航栏上面的页面icon图标哦! <link rel="icon" href="../../favicon.ico">
2.登录模块(数据合法性、合理性校验) 抽空总结一下表单中常用的校验规则哦!
java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
答:因MySQL的时间类型datetime范围是1000-01-01 00:00:00 到 9999-12-31 23:59:59,所以报错。
逻辑思想:
a:页面发起请求-》请求拦截——》交给指定的控制器处理请求——》然后返回逻辑视图(login页面),没有数据模型哦!
b:填写表单信息(验证格式、长度),提交表单(定义目标url哦,请求方法),服务器拦截此请求,进行数据验证(用户名和密码都一致),如果匹配,则返回相应 的视图,
并执行逻辑操作(记录用户登录日志 等等)。如果不匹配,则返回当前页的逻辑视图、数据模型(错误信息)。
c:安全性补充:密码加密!
01:密码加密
02:md5摘要
03:http://www.jb51.net/article/73292.htm
04:摘要(散列算法,不可逆的)第一,同一输入得到的输出是唯一的;第二,输出的大小是固定的;第三:不可能从输出得到输入的任何信息。
05:密码加密后还需加盐(这样更安全)。
06:防暴力破解:图片验证码(一次消费)
d:注意
01:请求消息入参(页面input框的name属性和domain的属性名一致) 。 按名称(name)匹配哦!
02: 需要在视图解析配置文件里配置哦,暴露session中的属性,velocity变量才能解析得到结果哦! 哎,你为什么要放到session中呢? spring提供的也是
可以得啊,ModleAndView ModelMap等等。
3.注册模块(数据合法性、合理性校验)
a:页面发起请求 href——》请求拦截——》交给指定的控制器处理请求——》返回逻辑视图(注册页面) 同样没有数据模型哦!
b:(非空校验、格式校验、长度校验)提交表单,后端校验:验证码校验、注册过的用户名应该不予注册,所以这里要判断用户名是否已经注册,
最后将此信息更新到数据库的user表中哦! 即可!
理解逻辑:用户名一定是唯一的,密码是可以重复的!
c: 补漏,service层抛出的方法控制器层的方法也要声明异常哦! throws!
MysqlDataTruncation: Data truncation: Data too long for column 'password' at row 1
答:顾名思义,就是password的字段在数据库中的长度太短了哦 !
d:思路决定出路: 读代码心得
1.文件路径的问题,IDE认,但浏览器不认哦! 尤其是background属性的url。
2.下路菜单组件:大盒子(触发button,下拉菜单列表)
3.CDN
4.注意文件导入的顺序:css存在样式的覆盖, js文件存在依赖。
5.注意设置页面的min-height哦! 或者 设置footer为fixed定位。
6.div ul li a
7.下路单选框 在herf属性中写javascript代码
想要做到:选中下拉框中的指定元素,那么就打开一个此option的url页面。
当下拉框改变时(onchange事件),获取当前下拉框Dom对象的options属性(数组),获取指定的选中Dom的属性值。
总结:onchange事件 + window.open(url) 关键是获取url!
8.Meta http://www.jb51.net/web/70787.html (整理到博客哦)
0:name属性和http-equiv属性
a:元数据可以被使用浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 Web 服务调用。
b:定义文档关键词,用于搜索引擎。<meta name="keywords" content="HTML, CSS, XML, XHTML, JavaScript">
c:定义web页面描述:<meta name="description" content="Free Web tutorials on HTML and CSS">
d:定义页面作者:<meta name="author" content="Hege Refsnes">
http-equiv属性:
a:每30秒刷新页面:<meta http-equiv="refresh" content="30">
A、Expires(期限)
B、Pragma(cache模式) 注意:这样设定,访问者将无法脱机浏览。
C、Refresh(刷新) 自动刷新并指向新页面。
9.图片的显示规则,搞清楚哦! 不要问为什么规则是这样!
10.jqeury的高度函数等等!
11.标签页激活:不能选其父元素哦! a
12.前端:读取图片(都是请求) 必须知道请求的url是什么? 你要请求什么,总得告诉服务器吧!
图片url、视频的url
视频播放:通过url向服务器发起请求,然后服务器不停的发送数据给你,插件做的应该就是不断的发送请求、处理响应。
13.图片上传:将图片文件保存到服务器指定目录,将地址保存到数据库服务器中。
视频上传:同理吧!
14.js中的参数问题哦! 看js教程,整理到博客哦!
15.alert console.log() js调试利器哦! 别忘了!
16.图片显示:
二十:
1.实现velocity变量是全局!
项目基础巩固
1.对返回内容的长度截取:
方式一:在java代码中做处理:servie、控制器java代码 substring()
方式二:在vm页面做处理,用vm语法。
2. <script src="" charset=""></script>
3.rest清除<input type="hidden"/> hidden后就是默认了无法从界面上改其值, reset本来就是让表单的值重置恢复到默认。
项目重难点突破
架构技术方案:
表现层: springMVC(web.xml配置文件、spring mvc配置文件)
业务逻辑层:spring事务 (spring配置文件和mybatis配置文件的整合)
数据访问层:mybatis (mapper文件、mybatis配置文件、mapper接口)
日志:log4j
开发工具:IntelliJ idea、git、svn、gradle、tomcat、jrebel
项目的启动顺序:
web容器启动——》spring容器
web.xml ——》 springmvc.xml(表现层)、spring-mybatis.xml(业务逻辑+持久层)
WEB容器的加载顺序是:ServletContext -> context-param -> listener(监听) -> filter(过滤) -> servlet(拦截)
web.xml文件的学习: http://blog.csdn.net/believejava/article/details/43229361
认知:
1.spring:一个轻量级的IOC和AOP的容器框架!
2.mybatis:半自动ORM框架
3.控制器内部返回视图的逻辑名(视图的路径和文件名)(路径、后缀名自己配哦)
参考的优秀资源:
1.http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html (mybatis的中文api)。
http://www.mybatis.org/mybatis-3/ (mybatis的英文api)。
本机桌面上的mybatis的pdf文档。
2.http://www.admin10000.com/document/6436.html
3.http://jinnianshilongnian.iteye.com/blog/1594806
项目心得
一:排错,解决问题的利器
1.Debug
2.打印出来:System.out console.log() alert()
二:本质的东西
1. 文字内容的CRUD
2. 图片的上传、下载、删除
3. 视频的上传、下载、删除
4. 以上资源访问性能的提升!(用户体验)
三:yes,就是这种感觉,这种费力解决问题后的感觉。 成就感,你需要的就是遇到问题去解决的能力,而不是退缩和逃避! 加油,骚年!
追求兴趣和事业的一致! 哈哈哈哈哈哈哈啊。。。。。。
良性循环:一定要让自己走上! 解决问题——》增加信心和乐趣——》再去攻克更难的问题——》循环往复——》终成正果。