全栈练习笔记
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
java将map类型转换成json对象
JSONObject dataJson = JSONObject.fromObject(data);
import net.sf.json.JSONObject;
前端报错
Uncaught SyntaxError: Invalid shorthand property initializer
一个是等于号,一个是冒号
分支主题
这是因为我个人原因失误,将addObject中的参数传成了List
前端需要判断后台参数后做转发处理
描述
移动端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 list =new ArrayList();
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 List asList
List list = Arrays.asList(strArr);
数组变成集合
返回的List集合元素类型由传入的数组元素决定,
并且返回的集合我们不能对其增删元素,
否则会抛出异常。并且对集合元素进行修改,会影响原数组对应的元素。
Collections.sort();
-void sort(List list);
自然排序
注意排序比较也是Comparable接口,
可以重写改接口,定义类的比较原则
可以接口回调,实现临时比较规则。
LinkList
链表,适合插入和删除对象
Queue queue = new LinkedList();
queue.offer("1");
从线性表一段插入元素
这两者方法逻辑完全一样,只是不同操作的性能不同,性能要求不高时可忽略。
通用
Coollection c = new HashSet();
c.add("1");
每次添加自动向索引后添加
c.add(0,"1");
注意这里不能间隔索引添加值,原位置元素及后续元素都顺序向后移动。
c.remove("1");
并将删除的元素返回
c.contains("String");
本质调用的是对象类型的equals()方法,
所以该类型要重写Object的equals()方法才有意义。
c.addAll(Collection);
c.containsAll(C1);
C中是否全部包含C1中的元素,本质也是equals
c.size();
返回集合包含元素的个数
c.clear();
清空集合
c.isEmply();
是否为空
“”不为空
使用迭代器遍历集合
boolean hasNext();
判断集合是否还有元素可以遍历
E next();
返回迭代的下一个元素
Iterator it = c.iterator();
while(it.hasNext){
String str = it .next();
it.remove();
}
? 使用迭代器,集合元素的类型都要相同吗?
注意这个的迭代器的remove,不能用集合的remove;
toArray(); T[] toArray(T[] a)
Object[] toArray();
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等中,<= 或则>=不能直接写,应该用替换符号代替
and t1.create_time >= #{create_time} and t1.create_time <= #{create_timePlusOne}
存储过程
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中的位置
之前
引用
内嵌