全栈练习笔记
2021-03-08 19:36:43 0 举报
AI智能生成
全栈练习笔记
作者其他创作
大纲/内容
后台
webapp操作性移动端的架构-self
安卓或PDA,页面都在本机,与后台就只用传递数据
但是用服务器端的jsp做页面,就需要每次发送整个页面以及参数,传输内容过多。
可以在jsp中,封装ajax方法,根据来回的参数的控制页面。这样与后台每次也只用传递参数,初始化页面慢一点,页面复杂度高一些。
当然也可以在关联性不是很大的页面之间,还是选择发送不同的页面吧,这样至少能在一定程度上减少单jsp代码的复杂度。
get和post请求
get请求有长度限制
在地址栏上可以看到传递参数,不安全
get是一个请求
post是两次请求
在网络环境比较好的时候,两种传输速度无所谓
但是在网络环境不好时,post就安全保证一些
form提交
可以有post请求,也可以get请求
可以将form表单中的数据序列化后,再用ajax请求。
可以直接使用post请求带参传递
但是对于json数据有多层结构时,就比较难以自动拼接(不常用)
图片
分支主题
可以考虑用一个input传递json的字符创格式,到后台再解析
window.location.href
只能是get请求
window.location.href="${pageContext.request.contextPath}/app/login/receive/ordersQuery.action?"+$.param(data);
注意这里的$.param(data);序列化后的json结构变成了平铺行,因此后台也无法直接获得原始的json结构,当然也可以写一些方法封装嘛
ajax请求
可以与后台来回传递参数
最大的问题就是:后台接受ajax请求,就无法使用model模型转发页面
后台controller
接受可以用封装好的Page
返回参数
modelAndView
用来返回参数到另外一个页面,比较好
PageData,String等
用来返回ajax的需要返回的数据,比较好
SSM架构
文件
pojo.java
mapper.xml
namespace是指定mapper.java的位置吗?
猜想:yqwms中是直接写mapper的名字,因为框架已经做了处理,补全了路径
mapper.java
service.java接口
serviceImpl.java接口实现类
controller
jsp
注解
@Controller
@Service
@Autowired与@Resource的区别
说明
mybatis开发dao两种方法:
传统dbc不考虑,太老了
1.原始dao开发方法(程序需要编写dao接口和dao实现类,sqlSessionFactory要写)(掌握)
没有使用mapper代理接口
自定义接口以及实现类,没有完全封装好
1.2yqwms中的doSupport
没有mapper代理接口
封装了sqlSessionFactory等底层代码
2.mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)
使用mapper接口代理对象
sqlSeesionFactroy还没有封装
2.2自定义servcie和在serviceImpl中调用mapper.java以实现更多业务逻辑
使用mapper接口代理对象
数据传递
json有什么好处
与前端交互时,直接传递一个对象一个map一个集合都可以,为什么使用json?
转换json
List<Map<String,object>>使用List2Json转换失败
jsonArray转换只能对于String类型吧
应该换成List<Map<String,String>>
mapper..java接口中的返回值List<Map<String,?>>的value类型,
可以用String接收,
也可以用Object接收,
这是框架自动根据接口的返回类型转的
java将map类型转换成json对象
JSONObject dataJson = JSONObject.fromObject(data);
import net.sf.json.JSONObject;
前端报错
Uncaught SyntaxError: Invalid shorthand property initializer
一个是等于号,一个是冒号
分支主题
这是因为我个人原因失误,将addObject中的参数传成了List<Map>
前端需要判断后台参数后做转发处理
描述
移动端web
jsp和controller都在服务端
controller处理的信息方返回为jsp或则转发到其他页面
controller中,用PageData接受没有问题
使用ajax提交请求时,可以返回PageData,不能使用modelAanView
解决办法
首次请求使用ajax,后台用PageData接受,返回PageData,当然也可以返回json
ajax接受返回参数,判断各种状态,再用post(非ajax)请求
$.ajax({
async: false,
type: "POST",
url: '${pageContext.request.contextPath}/app/login/doLogin.action',
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data: $("#myForm").serialize(),
dataType: "json",
success: function (data) {
if(data.status === 1){
window.location.href="${pageContext.request.contextPath}/app/login/chooseClient.action?"+$.param(data);
}else if(data.status === 106){
alert("用户不存在");
}else if(data.status === 107){
alert("密码错误");
}
},
error:function(){
alert("网络故障,请联系网络管理员");
}
});
window.location.href="";请求路径
$.param(data)是jquery自带的将对象类型序列化成httpURl的参数形式
再次接受请求的controller的接受参数为PageData,返回参数为ModelAndView
注意要用json格式
java基础
接口和接口实现类?
日期(见 03学院用书)
细节
分支主题
分支主题
分支主题
分支主题
分支主题
分支主题
分支主题
分支主题
Date(long,String,Calendar都可与之按一定形式实现互换,所以就已Date为相互之间的媒介)
分支主题
分支主题
数组
必须存放相同类型的内容
数组名是一个引用,它并不是数组本身
数组本身的大小(长度)不可变
数组与集合比较
数组没有add()等方法,也没有重写toString方法;
Arrays.sort();
用于排序
System.arrayCopy;
用于数组的扩容
Arrays.copyOf方法用于数组的复制
集合
图片
分支主题
分支主题
Collection
set
list
List接口是Collection的子接口,
用于定义线性表数据结构,
可以将List理解为存放对象的数组,
只不过其元素个数可以动态的增加或减少。
ArrayList
动态数组,更适合随机访问,
查找比较好
ArrayList<String> list =new ArrayList<String>();
E get(int index);
获取集合指定下标对应的元素
E set(int index,Element);
将指定的元素存入给定位置,并将原位置返回。
list.set(1,list.set(3,list.get(1)));
将索引1处的元素和3处的对换
E sublist(int tou,int wei);
前包括,后不包括。
截取父串得到子串,
子串与父串共用内存,
两则改变其一,另外也会变化
list.subList(3,8).clear();
删掉父串中的一段内容
static <T>List<T> asList<T>
List<String> list = Arrays.asList(strArr);
数组变成集合
返回的List集合元素类型由传入的数组元素决定,
并且返回的集合我们不能对其增删元素,
否则会抛出异常。并且对集合元素进行修改,会影响原数组对应的元素。
Collections.sort();
-void sort(List<T> list);
自然排序
注意排序比较也是Comparable接口,
可以重写改接口,定义类的比较原则
可以接口回调,实现临时比较规则。
LinkList
链表,适合插入和删除对象
Queue<String> queue = new LinkedList<String>();
queue.offer("1");
从线性表一段插入元素
这两者方法逻辑完全一样,只是不同操作的性能不同,性能要求不高时可忽略。
通用
Coollection<String> c = new HashSet<String>();
c.add("1");
每次添加自动向索引后添加
c.add(0,"1");
注意这里不能间隔索引添加值,原位置元素及后续元素都顺序向后移动。
c.remove("1");
并将删除的元素返回
c.contains("String");
本质调用的是对象类型的equals()方法,
所以该类型要重写Object的equals()方法才有意义。
c.addAll(Collection<?extend E>);
c.containsAll(C1);
C中是否全部包含C1中的元素,本质也是equals
c.size();
返回集合包含元素的个数
c.clear();
清空集合
c.isEmply();
是否为空
“”不为空
使用迭代器遍历集合
boolean hasNext();
判断集合是否还有元素可以遍历
E next();
返回迭代的下一个元素
Iterator<String> it = c.iterator();
while(it.hasNext){
String str = it .next();
it.remove();
}
? 使用迭代器,集合元素的类型都要相同吗?
注意这个的迭代器的remove,不能用集合的remove;
toArray();
Object[] toArray();
<T>T[] toArray(T[] a)
String[] strArr = list.toArray(new String[]{});
Map
图片
分支主题
分支主题
分支主题
分支主题
分支主题
分支主题
分支主题
Object都有hashCode,除了基本类,但是基本类的超类有,比如int i没有,而Interger有
分支主题
分支主题
分支主题
分支主题
分支主题
通用
HashMap
Map map = new HashMap();
put(key,value);
注意这里的key可以是任何对象,
而实际应用中,多为String。
get(Object key);
返回value,不存在就返回null
value值为null
key不存在
containsKey();
判断key是否存在
containsValue();
判断value是否存在
map.keySet();
返回所有key到一个set中
map.entrySet();
将所有的key-value封装成entry到set中。
问题
map的默认排序是什么?
HashMap的值是没有顺序的,他是按照key的HashCode来实现的。
TreeMap默认是升序的
LinkedHashMap
泛型
所有集合都带有泛型参数
循环
增加for循环
本质上的迭代器,
该循环不通用于传统循环工作,
其作用于遍历集合或数组
for(元素类型e:集合成数组){
循环体
}
类的实例化
使用getInstance()方法的原因及作用
先举例说明:
下面是一个例子,为什么要把这个类实例化?有什么好处?
//实例化
public static DBConnect instance;
public static DBConnect getInstance(){
if(instance == null){
instance = new DBconnect();
}
return instance;
}
总的来说:这是单例模式,一般用于比较大,复杂的对象,只初始化一次,应该还有一个private的构造函数,使得不能用new来实例化对象,只能调用getInstance方法来得到对象,而getInstance保证了每次调用都返回相同的对象。
详细解释一下:对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等。
*直接使用new就不能实现好的设计,这时候需要使用间接使用new,即getInstance方法。这是一个设计方式的代表,而不仅仅指代一个方法名。
1. new的使用:
如Object _object = new Object(),这时候,就必须要知道有第二个Object的存在,而第二个Object也常常是在当前的应用程序域中的,
可以被直接调用的
2. GetInstance的使用:
* 在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,即内存中有一块区域专门用来存放静态方法和变量,
* 可以直接使用,调用多次返回同一个对象。
3.两者区别对照:
* 大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new,new就是通过生产一个新的实例对象,或者在栈上声明一个对象 ,每部分的调用
* 用的都是一个新的对象。
* getInstance是少部分类才有的一个方法,各自的实现也不同。
* getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是static的。
*
* (1) 对象使用之前通过getInstance得到而不需要自己定义,用完之后不需要delete;
* (2)new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;
* (3) new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。
*
* 总结:
* getInstance这个方法在单例模式用的甚多,为了避免对内存造成浪费,直到需要实例化该类的时候才将其实例化,所以用getInstance来获取该对象,
* 至于其他时候,也就是为了简便而已,为了不让程序在实例化对象的时候,不用每次都用new关键字,索性提供一个instance方法,不必一执行这个类就
* 初始化,这样做到不浪费系统资源!单例模式 可以防止 数据的冲突,节省内存空间
变量
java中局部变量不赋值也没报错是什么情况?
Java中的变量分为局部变量和全局变量,
局部变量就是在方法中声明的变量,
而全局变量就是在类中声明的变量,
在java中有这么一条规则,
声明在方法中的变量在使用时必须要初始化(注意这里是使用时,
如果不使用的话,你也可以不赋值,
但是一般变量声明了之后都是要使用的,所以你最好初始化),
否则不能通过编译。
字符串比较
字符串是一个比较特殊的对象。
字符串之所以特殊,是因为java会在内容中为String类型的对像开辟一个空间,我们叫他串池!
字符串对象的创建之后会被放入到串池中。
串池有一个特点,就是对于相同对象,池中只存储一份。
那么串池把神马样的String看做是相同的String呢。请看:
String a="abc";和String b="abc" 对于这样的类型的声明方式(不是new出来的)串池把他们看做一个对象,所以池中只存储一分,只是有a 和b 两个引用罢了!
对于String只要用new关键字new出来的string,都是单独的一个对象。
而“==”号,他是用来比较对象的内存地址,所以只要用==号来比较string,只要不是自己比自己,那肯定是false。
而String中的equls方法已经做了处理,他是比较内容,所以要比较string的内容的时候而不是地址的时候,那就用它吧!
equals方法常用toString比较,有的类也会重写toString方法。
数据库
sql语句
在ssm框架中,mapper.xml等中,<= 或则>=不能直接写,应该用替换符号代替
<if test="create_time != null and create_timePlusOne !=null" >
and t1.create_time >= #{create_time} and t1.create_time <= #{create_timePlusOne}
</if>
存储过程
self命名准则
css
数据库
表名
t开头
下划线连接
单词都小写
字段名
单词都小写
下划线连接
数据传递
后台到前台,特别是数据库,小写用_连接
前后变量命名用驼峰命名,再返回。一直到数据中,sql中就会出现两个命名方法就不会乱
Idea
快捷键
ctrl+方向键
单词跳过移动光标
ctrl+alt+方向键
回到上次浏览位置
alt+方向键
左右窗口切换
ctrl+alt+空格
new后提示对象
crtl+z
返回上一步操作
crtl+shift+z
对应crtl+z的撤销,下一步
ctrl+d
复制光标所在行到下一行
crtl+y
删除光标所在行
crtl+f
当前窗口查找
ctrl+r
当前窗口字符替换
双击shift
当前项目查找文件或插件等
ctrl+shift+f
当前项目全局查找
ctrl+shift+r
当前项目字符替换
ctrl+shift+f10
运行当前方法,常用再单元测试
按住tab
整块代码右移
tab+shift
整块代码左移
ctrl+alt+o
清除没有引用的包
前端
three.js
html5
jsp
后台参数显示
后台直接传递map给前台时,map里面使用等于号连接的,不能被一些方法识别,应该从后台传递一个json对象。${json}.key.key[].key这样的方式,不能${json.key}这样
Uncaught ReferenceError: is not defined
分支主题
分支主题
要加上引号
分支主题
这里的${}形式有点问题啊?
json
JS将对象以JSON格式输出的两种方法
alert(JSON.stringify(data));
说明1
//创建
var data={ key1:"value1",key2:"value2"};
//取值
var dataValue = data["key1"]
//或 var dataValue = data.key1,当key 为数值时该取值法不可用
//例:
var data ={ 111:"111",222:"222"}
var dataValue = data["111"]//正确
var dataValue = data.111 //错误
//添加
data["key3"] = "value3"; //添加时无该key值则添加,有则修改value
//修改
data["key1"] = "value0";
//存在则删除
if (!!data["key2"]) {
delete (data["key2"]);
}
//!!把一个任意类型的值转换为布尔类型,存在为true,不存在为fleas
---------------------
作者:谁也没等,谁也不会来
来源:CSDN
原文:https://blog.csdn.net/weixin_43972348/article/details/85089551
版权声明:本文为博主原创文章,转载请附上博文链接!
分支主题
分支主题
分支主题
看看有没有这个键
对象.hasOwnProperty(prop)
ajax上,获取json第一层key有多少个
Object.keys(json).length
js中给json赋值
js中 给json对象添加新的属性
比如现在有一个json对象为jsonObj,需要给这个对象添加新的属性newParam,同时给newParam赋值为pre。做法如下:
var jsonObj={
'param1':22,
'param2' :33
};
jsonObj. newParam ='pre';
新的属性添加以后,json对象变成:
var jsonObj={
'param1':22,
'param2' :33,
'newParam':'pre'
};
获取json中key值
分支主题
获取json的长度
分支主题
function getJsonLength(jsonData) {
var length;
for(var ever in jsonData) {
length++;
}
return length;
}
这个不能用,用后面这个
Object.keys(myObject).length
处理开头有0的数字
假设后台传递的loginName为“01”
var data = ${data};
var loginName = data.loginName;
得到01
var loginName = ${data.loginName}
得到1
删除json的某一直
delete data.loginName;
delete data[0].XXX
遍历,根据key获取指定value值
var obj = {"id": 1, "name":"张三"};
for(var key in obj)
{
alert("Key是:" + key);
alert("对应的值是:" + obj[key]);
}
分支主题
ajax
接受后台传递的map,得到长度
Object.keys(data).length
存在跨域问题
javascript
在html中的位置
</head>之前
引用
内嵌
</body>之前
引用
内嵌
注释
单行
//
<!--hahahahaah-->这是html的标签
多行
/*
*/
数组
var arr = Array(4);
定义了一个数组的长度。
var arr = Array();或则不定义长度,
因为javascript的数组相当于java里面的集合。
var arr = Array(“”,“”,“”);
直接定义元素,用逗号隔开
var arr = ["","",""];
简写法
var arr=[];
arr[index] = x;
通过索引赋值
arr[0][0]
数组里面有数组的引用方法
关联数组
相当于把索引值变成了key,这种做法不好,可以用对象和map代替。
对象
创建对象及其属性
分支主题
分支主题
分支主题
var lennon = {};
对象里面有对象
通过lennon.person.name的方式访问属性;
分支主题
几种创建方式,以及怎么创建方法,百度一下。
几种对象
自定义对象
内建对象
宿主对象
函数与方法
函数是定义在全局的
方法是对象内部的函数。
可以有返回值,可以参数
分支主题
分支主题
使用“==”或则“!=”有可能会有类型转换的问题,
应该使用“===”或则“!==”避免没有注意到的类型转换问题
Comparison carAimType == 0 may cause unexpected type coercion less... (Ctrl+F1)
This inspection reports usages of JavaScript equality operators which may cause unexpected type coercions. It is considered a good practice to use the type-safe equality operators === and !== instead of their regular counterparts == and !=.
Depending on the option selected, this will either highlight:
All usages of == and != operators.
All usages except comparison with null. Some code styles allow using x == null as a replacement for x === null || x === undefined.
Only suspicious expressions, such as: == or != comparisons to 0, '', null, true, false, or undefined.
比较carAimType == 0可能导致意外类型强制减少...(Ctrl + F1)
此检查报告了JavaScript相等运算符的使用,这可能导致意外的类型强制。 使用类型安全的相等运算符===和!==而不是它们的常规对应物==和!=被认为是一种好习惯。
根据所选的选项,这将突出显示:
==和!=运算符的所有用法。
除了与null比较之外的所有用法。 某些代码样式允许使用x == null作为x === null ||的替代 x === undefined。
只有可疑的表达式,例如:==或!=与0,'',null,true,false或undefined的比较。
向表格中插入值,$("#th123").html("插入的内容");
不用innerHtml()
字符串的单双引号
内双外单,内单外双,内外相同用/转义
在拼接html语句时,应该用‘’单引号,而不是“”双引号
内有带参方法的调用拼接
$("#tr_title").after('<tr onclick="chooseAjax(\''+data.clients[i].client_pkno+'\')"><td>'+
data.clients[i].client_pkno+'</td><td>'+data.clients[i].client_name+'</td></tr>');
节点对象element
得到元素节点对象的方式
document.getElementById(String);
分支主题
docuemnt.getElementByTagName(String);
返回对象数组
分支主题
document.getElementByclassName(String);
返回对象数组
分支主题
元素节点对象.getAttribute("title");
得到属性节点
元素节点对象.setAttribute("title",String);
分支主题
分支主题
元素节点对象.childtNodes;
返回该对象的所有子对象的数组
元素节点对象.nodeValue;
图片
分支主题
分支主题
节点类型
节点对象.nodeType;
元素节点
1
属性节点
2
文本节点
3
文档加载完毕后调用
window.onload=moth;方法名不带();
onclick();事件调用
分支主题
分支主题
分支主题
平稳退化
有些浏览器会禁用javascript,最好的用户体验就是,单一的javascript代码有问题,不会整个网页都加载不出来。
向后兼容
判断浏览器的版本以及一些方法的正常使用与否。
分支主题
分支主题
分离javascript
分支主题
分支主题
优化javascritpt
代码优化
分支主题
分支主题
发布版本优化---压缩脚本
去掉注释等一些不必要的内容,可以在网上搜索一下现有的工具。
window.open(url,name,features);
分支主题
"javascript:"伪协议
分支主题
内嵌的事件处理函数
分支主题
分支主题
getElementById();返回true或false的用法
分支主题
为对象赋予事件函数
分支主题
分支主题
共享onload事件
分支主题
动态创建标记,也就是说创建新的HTML
传统技术
document.write
不是一种好的做法
分支主题
innerHTML
获取元素里面的文本内容
分支主题
分支主题
DOM技术
图片
分支主题
createElement
分支主题
appendChild
分支主题
分支主题
分支主题
createTextNode
分支主题
在已有元素前插入一个新元素
分支主题
在已有元素后插入一个新元素
分支主题
获取元素CSS样式以及改变
元素内联样式
元素外联样式
http://www.cnblogs.com/yucheng6/p/9696274.html
jquery
$( )用来获取页面dom,${ }用来接收后台参数
$("#span").text("");向span中写入值
css
采用技巧
设置div内容垂直居中
https://www.cnblogs.com/moqiutao/p/4807792.html
其中模拟表格法用过
当内容为span时,会把span内容全部放大,使得在中间,会导致span的位置无法调整
span默认不是设置大小(宽度和高度)
但是可以设置display: inline-block;
分支主题
设置span圆角
border-radius:20%;
书籍
样式的继承性
分支主题
分支主题
层叠性
分支主题
分支主题
颜色定义
分支主题
字体文本相关
字体定义
font-family
字体斜体定义
font-style
字体加粗
font-weight
<b>,<strong>标记
字体大小写相关
text-transform
字体大小
font-size
px
em
百分比
装饰
text-decoration
分支主题
首行缩进
text-indent
分支主题
保持不同字体的大小
font-size-adjust:aspest
appest值的计算
等等
技巧
合写
分支主题
div和span的选择
大块的内容用div
标签里面的内容用span
display:none
隐藏元素
容器
margin
padding
padding-上下左右
图像
边框
内嵌式(边框)大小
border
粗细
border-weight
颜色
border-color
线型
border-style
边框的选择
分支主题
大小(缩放)
weight
像素
百分比
height
像素
百分比
图文混排
文字环绕图片
float:right
margin来控制文字与图片的距离
图片对齐
通过父容器的text-align:左右中,纵向对齐vertical-align
背景颜色图像
分支主题
背景是border以内的真个区域,如何设置了border,那么看起来只有padding(包含padding)内的区域
盒子模型
content
width和height都是指的内容的长宽
分支主题
border
border-width
border-上下左右-width
border-corlor
上下左右
border-style
10种
border-上下左右-style
border-radius边角圆弧
text-algin文本对齐
图片
分支主题
分支主题
padding
图片
分支主题
分支主题
上下左右
margin
上下左右
选择器
基本选择器
标记选择器
标记的标签名
类选择器
标签的class的名字,用.(点)开头
id选择器
标签的id的名字,用#开头
复合选择器
交集选择器
分支主题
分支主题
并集选择器
分支主题
分支主题
后代选择器
全部后代
分支主题
分支主题
直接后代
分支主题
盒子模型之间的关系
标准文档流
块级元素
分配新行
行内元素
块级元素拥有自己的区域,而行内元素则没有
div和span的区别
div是块级元素,span是行内元素
行内元素可以在块级元素内部,反之不成立
diaplay属性可以变换块级元素和行内元素,甚至设置为none时可以隐藏块级元素
行内元素的水平margin
块级元素的竖直margin
塌陷
嵌套盒子之间的margin
分支主题
分支主题
浮动
图片
分支主题
float
:left,right
元素向左(右)浮动
none
元素向右移动
inherit
从父级继承浮动属性
clear
不是放置在设置浮动的盒子里,
而是该盒子外的其他受影响的盒子里,
比如文字内容里。
定位
position
static
效果如同relative
偏移量在此情况下,不会起作用
Z-index在此情况下,也不会起作用
relative
默认设置属性
absolute
fixed
top,left,right,bottom
偏移量,指的是在标准流中,对于系统默认定位的便宜量。
注意与margin不是一回事。
自定义
业务技巧练习
首页
a标签实现动态拼接路径
href="${path}agv/agvParameter.action"
a标签实现从javascript变量获取动态路径
<base href="<%=basePath%>">
某个单独页面就算没有引用jquey也能使用$
这是因为你其他页面引用了,在浏览器中保存了
真的是这样的吗?
登入
注册
form表单的提交
按钮提交问题
分支主题
如果想在提交之前做一些验证
可以通过事件方法提交
注意按钮一定要放在form外面
上句话是不对的,可以放在form里面,type为button,
但是onclick的方法名一定不能为取名为submit();这很奇怪
分页查询显示
0 条评论
下一页