0%

2017年9月18日 上午11:08

  1. 下载myeclipse的svn插件,拷贝里面的内容到myeclipse的安装位置,
    我的安装位置是: D:\myEclipse\MyEclipse 10\dropins,拷贝到这里就可以了
  2. 安装服务器,很简单的一直下一步就可以了
  3. 在服务器上指定项目的存储位置,在红圈里右键选择第一个,新建数据仓库,名称随便写.然后在user里面创建一个用户,用户名和密码你也随便写
    在你新创建的仓库上,右键选择属性properties设置,选择你刚才创建的用户,add进来就可以了.服务器部分就已经搞定了!!!!

  4. 打开你的myeclipse,开始创建一个要共享的项目吧,项目叫什么都可以,没有要求.创建好项目以后,在项目上右键选择Team选项,仔细找找,选择share project选项


    出现一个url地址,打开你的svn服务器,选择你的项目,然后右键选择拷贝当前的项目地址,然后粘贴过来
    https://Nis-PC/svn/cctv/这个地址就是你拷贝过来的,把里面的那个Nis-pc的主机名称改成你电脑的ip地址,我的是192.168.0.104

    红圈圈就是你要分享的地址和项目了,一会给你的团队成员看看,别整差了


  5. 都整完了就开始分享项目,作为团队大哥的你责任当然要大一些,分享吧,骚年!在你的项目上,右键选择”提交”按钮,你的项目就可以了
    温馨提示,需要输入用户名和密码的时候,选择你刚才在svn服务器上创建的用户名和密码就可以

  1. 作为腿毛的我,想要看看大哥的项目怎么办?在浏览框里,右键选择import,导入项目,请选择svn检出项目


刚才大哥给你发过那个服务器地址吧,现在可以拷贝上了

大功告成!!!


svn中 更新,提交,与资源库同步分别会有什么效果 - CSDN博客

2017年9月17日 下午11:10

总结理解:

骗分导论
国家集训队论文集
动态规划和分治的区分
从现实—>代码的正确理解
算法时间复杂度T(n)
数据结构笔记提取
写算法的思路总结(数据结构之后)
笔记
学习数据结构和算法的基本方法
重新理解数据结构+算法
JULY 算法01

简单训练:

刷题网站
搭建hustoj
9_1base.cpp 查找
8_2practice.cpp 排序
8_1base.cpp 排序
数据结构源码
7_2practice.cpp 图
7_1base.cpp 图
6_2practice.cpp 树与二叉树
6_1base.cpp 树与二叉树
5.1base.cpp 数组,矩阵,广义表
3_2thinking.cpp 栈和队列
3_1base.cpp 栈和队列
wrong.cpp 出现的错误
2_4thinking.cpp 线性表
2_3practice.cpp 线性表
2_2.cpp 链表
2_1.cpp 顺序表
Mac+ sublime + (g++) 使用

算法实验课

2017年9月17日 下午4:15

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
//2_2.cpp
#include<iostream>
using namespace std;

typedef struct LNode
{
int data;
struct LNode * next;
}LNode;


// 这节的内容默认链表是有序的,这也就是为什么最后要讲排序的原因

//单链表的合并
// 这道题首先是了解链表的基本使用,不要在使用.来操作了
// 要有的几种意识:已有资源的意识,已有资源的意识,设置初始值的意识
void merge(LNode *A,LNode *B,LNode *&C){
LNode *p = A->next; //跟踪最小值节点
LNode *q = B->next;
LNode *r; //为了链表尾部中添加节点方便

C = A; //利用已有资源的意识
C.next = NULL;

free(B); //已有资源的意识
r = C; //设置初始值的意识


while(p!=NULL && q!= NULL){
if(p.data > q.data){
r->next = p;
p = p->next;
r = r->next;
}
else{
r->next = q;
q = q->next;
r = r->next;
}
}

if(q!=NULL){
r->next = q;
}

if(p!=NULL){
r->next = p;
}
}


//有n个元素已经存储在了数组a中,用尾插法建立链表C
//只要是题目中出现的变量,都要作为参数,比如说这里的n(这里是为了使数组使用更加严谨)
// create操作说明需要一个s变量
void createListR(LNode *&C,int a[],int n){
LNode *s ,*r;//这里说的是插入,所以要建立一个尾指针r
int i ;

C = (LNode *)malloc(sizeof LNode);
C->next = NULL;//关注初始值
r = C;//

for(i = 0 ;i < n ; i++){
s = (LNode *)malloc(sizeof LNode);
s->next = NULL;
s.data = a[i];

r->next = s;
r = r->next;
}
}

// 头插法
// 为了解决上一个问题无法下手的情况:如何确定我们需要什么
//这个头插法写的思路是:先确定我想实现的核心操作
// s = (LNode *)malloc(sizeof LNode);
// s->data=a[i];
// s->next = C->next;
// C->next = s;
//这时就会发现没有s和i变量,说明我们要创建这两个变量
//这里不需要使用r来指向尾节点
void createListL(LNode *&C,int a[],int n){
LNode *s;
int i ;

C = (LNode *)malloc(sizeof LNode);
C-next = NULL;

for(i = 1;i < n;i++){
s = (LNode *)malloc(sizeof LNode);
s->data=a[i];
s->next = C->next;
C->next = s;
}
}

// 2_1中侧重于对一些细小易错的知识点总结
// 2_2中除了上面说的,添加了一些思维上的技巧,帮助完成功能


// 归并为一个递减的链表
// 思考:一定是在原来的基础上做部分的修改,这里改用头插法就可以完成
//头插法---> 注意链接断裂
void merge(LNode *A ,LNode *B,LNode *&C){

//同样是先写核心内容

LNode *q = A;
LNode *p = B;

LNode *s;

C=B;
C->next = NULL;
free(A);

while(p!= NULL && q!= NULL){
if(p->data > q->data){
s = p;//否则会链表断裂,要写保存起来
p->next = C-next;//
C->next = p;//p代表最大值的节点
p = s->next;
}
else{
s = q;
q->next = C-next;
C->next = q;
q = s->next;
}
}

while(p!= NULL){
s = p;
p->next = C-next;
C->next = p;
p = s->next;
}

while(q!= NULL){
s = q;
q->next = C-next;
C->next = q;
q = s->next;
}
}


// 对于这些算法,我觉得还是要站在一个理解的角度去熟练记忆,而不是去站在一个创造者的角度去希望自己也能在不看他的源码基础上写出来。
// 能写是一定能写出来,但是时间上不划算,更何况是人家已经写出来的东西了,造成二次浪费。


// 链表中节点的查找并删除节点 已知一个节点值
// 链表中只能按值来查询,而顺序表可以按下标查询
// 我写的时候没有考虑查找不到的情况:此时,p指向最后一个节点,因为此时p->next = NULL
int findAndDelete(LNode *C,int x){
int i;

LNode *p = C;
LNode *q ;//临时保存用

while(p->next != NULL){
if(p->next->data == x)break;
p=p->next;

}
//写到这里要返回去加上一前驱节点,因为删除一定要一个前驱节点


if(p->next==NULL){
//我在这里稍微迟疑了一下
// 因为我错误的认为链表的最后一个节点的data值没有做判断,
// 虽然p指向最后链表最后一个节点的时候没有执行上面的判断语句,
// 但是,判断语句判断的是当前节点的下一个节点的data值,当前节点的data值,在之前已经判断过了,才来到这个节点的
return 0;
}
else{
q=p->next;
p->next = p->next->next;
free(q)
}
}


####################################################################################################################################

// 双链表
typedef struct DLNode
{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;

// 采用尾插法建立双链表
//create的对于顺序表来说-----length++ 但是在这里没用 只是记录一下思考的过程
//create--->DLNode *s malloc节点
// 尾插法--->DLNode *r 指向尾节点
void createDListR(DLNode *&L,int a[],int n){
DLNode *s;
DLNode *r;
int i;

//建立头节点
C = (DLNode *)malloc(sizeof DLNode);
C->next = NULL;
c->prior = NULL;

for(i = 0; i < n ; i++){
s = (DLNode *)malloc(sizeof DLNode);
s->data = a[i];
s->next = NULL;
s->prior = r;
r->next = s;
r = r->next;
}
}


// 双链表(单链表)节点查找算法

DLNode* findNode(DLNode *C,int x){//同样,这里的x一定也是值data的值
DLNode *p ;
p = C->next;

while(p!=NULL){
if(p->data == x){
return p;
break;
}
p=p->next;
}
return NULL;
}

// DLNode *&L ;做参数 用这种写法做参数的时候,一般都是这个L传过来的时候就是空的链表,连头结点都没有。
// 那么,但我们给L定义头结点的时候,自然就要改变L本身的值。L = (DLNode *)malloc(sizeof DLNode);

// r->next = s;这么一句话如果要是这么想:next其实是一个指针,他存的其实是一个地址,这个地址指是另个一个DLNode节点的地址。
// 这么想你就做不了题,这样的分析是对的,但是这样的分析方法对我们做题写程序是一定用都没有。
// 那我们应该怎样去理解呢?宏观的认识就行了,认为指针不存在,上面的分析当做一种底层实现,而我们操作r->next = s;就像是在调用底层给我提供的好理解接口一样。
// 这就像是做java项目时的封装一样。


// 双链表插入
// 插入节点是s
// 前两行是关键,因为保证了最后一个不会丢,s->next 即可以找到
// 可以把s当成一个空值,那么前两行对于s这个空值的操作一定不会造成链接断裂的
s->next = p—>next;
s->prior = p;
p->next->prior = s;
p->next = s;


// 双链表删除
// 如果是不删除中间s节点的话,第一,第四句可省略
s=p->next;
p->next=p->next->next;
p->next->prior = p;
free(s);


// 总结:
// 不能说是编程的思路和编程的思路一样。但是的确,当我将我做数学题的思路拿过来的时候,有不少问题的确得到了解决。

2017年9月17日 下午4:15

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//2_1.cpp
#include <iostream>
using namespace std;
#define maxSize 100
// 顺序表结构定义
typedef struct {
int data[maxSize];
int length;
}SqList
//顺序表的第二种定义方式
int data[maxSize];
int length;

// 单链表结构体定义
typedef struct LNode{
int data;
struct LNode *next;
}LNode;

//双链表结构体定义
typedef struct DLNode
{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;
//动态分配内存
LNode *A = (LNode * )malloc(sizeof DLNode);

// 顺序表的findElem 返回第一个比x大的元素的位置
int findElem(SqList L,int x){
int i = 0;
for(i = 0; i < l.length;i++){
if(L.data[i] > x){
return i;
}
}
return i;
}
// 顺序表的findElem 返回e元素的位置 如果没有则返回-1
int findElem(SqList L,int e){

for(int i = 0; i < L.length;i++){
if(l.date[i] = e){
return i;
}
}
return -1;
}


// 顺序表insertElem() 按顺序插入
void insertElem(SqList &L,int x){
int p;
p = findElem(L,x);
// 后移动
for(int i = L.length-1; i >= p ;i-- ){
L.data[i+1] = L.data[i];
}
L.data[p] = x;
++(L.length);//lenght要记得加一
}


// 顺序表插入元素的算法 按指定位置插入
int insertElem(SqList &L,int p ,int e){//要对p的位置进行限定
if(L.length < p || p < 0 || L.length == maxSize){//这里p = l.length也行,并且要对maxSize进行判断
return -1;
}
for(int i = L.length; i >= p ;i++){
L.data[i+1] = L.data[i];
}
L.data[p]=e;
(L.length)++;
return 1;
}

// 顺序表删除指定位置元素,并将删除元素赋值给e,成功返回1,否则返回0
int deleteElem(SqList L, int p ,int &e){//忘了设置e的值了
if(p > L.length-1 || p<0 )return 0;

// L.data[L.length-1] = ;//这里不用担心最后一个位置元素的值,因为L.lenght就限定死了
e = L.data[p];
for(int i = p; i < L.length-1 ;i++){
L.data[i] = L.data[i+1];
}
(L.length)--;
return 1;
}

//顺序表的初始化
void initList(SqList &L){
L.length=0;
}

//顺序表求指定位置元素
int getElem(SqList &L,int p ,int &e){
if(p < 0 || p >= L.length) return 0;
e = L.data[p];
return 1;
}


int main(){

cout<<"hello world"<<endl;
return 0;
}

2017年9月17日 下午4:15

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
//wrong.cpp

// 顺序表的findElem x暗示有序 e则无具体要求
int findElem(SqList L,int x){//对参数x代表的意思模糊不清 x说明是查找大于x的第一个位置
int i = 0;
for(i = 0; i < l.length;i++){
if(L[i] == x){//这里不是L[i]
x = i;
return 1;
}
}
if(i == l.length-1){
x = -1;
return -1;
}
}

int findElem(SqList L,int x){
int i = 0;
for(i = 0; i < l.length;i++){
if(L[i] == x){//这里不能用等于
return i;
}
}
if(i == l.length-1){
return -1;
}
}

####################################################################################################################################


// 顺序表insertElem()
int insertElem(LNode L,int x){
int p;
p = findElem(L,x);
L[p] = x;
}

int insertElem(LNode L,int x){//操作类型是SqList,不是LNode
int p;
p = findElem(L,x);
// 后移动
for(int i = L.length-1; i < p ;i-- ){
L[i+1] = L[i];
}
L[p] = x;
}

int insertElem(SqList L,int x){
int p;
p = findElem(L,x);
// 后移动
for(int i = L.length-1; i < p ;i-- ){//这是不小于
L.data[i+1] = L[i];
}
L.data[p] = x;
}


int insertElem(SqList L,int x){
int p;
p = findElem(L,x);
// 后移动
for(int i = L.length-1; i >= p ;i-- ){
L.data[i+1] = L.data[i];
}
L.data[p] = x;
++(L.length);//lenght要记得加一
}


id insertElem(SqList &L,int x){//要使用引用传值,改变本来的值
int p;
p = findElem(L,x);
// 后移动
for(int i = L.length-1; i >= p ;i-- ){
L.data[i+1] = L.data[i];
}
L.data[p] = x;
++(L.length);//lenght要记得加一
}
####################################################################################################################################



// 顺序表插入元素的算法 按指定位置插入
void insertElem(SqList &L,int p ,int e){//要对p的位置进行限定
for(int i = L.length; i >= p ;i++){
L.data[i+1] = L.data[i];
}
L.data[p]=e;
(L.length)++;
}


int insertElem(SqList &L,int p ,int e){//要对p的位置进行限定
if(l.length =< p || p < 0){//这里p = l.length也行,并且要对maxSize进行判断
return -1;
}
for(int i = L.length; i >= p ;i++){
L.data[i+1] = L.data[i];
}
L.data[p]=e;
(L.length)++;
return 1;
}


// 顺序表删除指定位置元素,并将删除元素赋值给e,成功返回1
int deleteElem(SqList &L , int p , int &e){//这里的e指的是你最后删除的值,而不是一开始指定说我要删哪个。这道题要求通过位置删除,不是元素内容
int p;
p = findElem(SqList L,int e);
if(p == -1) return -1

for(int i= p;i < L.length - 1;i++){
L.data[i] = L.data[i+1];
}

(L.length)--;
return 1;
}

int deleteElem(SqList L, int p ,int &e){//忘了设置e的值了
if(p > L.length-1 || p<0 )return 0;

// L.data[L.length-1] = ;//这里不用担心最后一个位置元素的值,因为L.lenght就限定死了
e = L.data[p];
for(int i = p; i < L.length-1 ;i++){
L.data[i] = L.data[i+1];
}
(L.length)--;
return 1;
}
####################################################################################################################################

//单链表的合并
void merge(LNode *A,LNode *B,LNode *&C){
LNode *p = A->next;
LNode *q = B->next;
LNode *r;

C = A;
C.next = NULL;

free(B);
r = C;


while(p!= NULL&&q!=NULL){
if(p.data > q.data){//这里不能用点,要用->
r.data = p.data;//这里是针对于整个节点,而不是对节点中的一个值
//不是对r操作,而是对e->next操作
p = p.next;
}
else{
r.data = q.data;
q = q.next;
}
}


}





void merge(LNode *A ,LNode *B,LNode *&C){

//同样是先写核心内容

LNode *q = A;
LNode *p = B;

LNode *s;

C=B;
C->next = NULL;
free(A);

while(p->next != NULL && q->next != NULL){
if(p->data > q->data){
p->next = C-next;//
C->next = p;//p代表最大值的节点
}
else{
q->next = C-next;
C->next = q;//p代表最大值的节点
}
}

if(p->next != NULL){
while(p->next != NULL){
p->next = C-next;
C->next = p;//p代表最大值的节点
}
}

if(q->next != NULL){
while(q->next != NULL){
q->next = C-next;
C->next = q;//p代表最大值的节点
}
}


}


void merge(LNode *A ,LNode *B,LNode *&C){

//同样是先写核心内容

LNode *q = A;
LNode *p = B;

LNode *s;

C=B;
C->next = NULL;
free(A);

while(p->next != NULL && q->next != NULL){//不能用p->next q->next 此时就是判断p,q本身就行
if(p->data > q->data){
s = p;//否则会链表断裂,要写保存起来
p->next = C-next;//
C->next = p;//p代表最大值的节点
p = s->next;
}
else{
s = q;
q->next = C-next;
C->next = q;
q = s->next;
}
}

while(p->next != NULL){//不能用p->next q->next 此时就是判断p,q本身就行
s = p;
p->next = C-next;
C->next = p;
p = s->next;
}

while(q->next != NULL){//不能用p->next q->next 此时就是判断p,q本身就行
s = q;
q->next = C-next;
C->next = q;
q = s->next;
}
}


int findAndDelete(LNode *C,int x){
int i;

LNode *p = C;

while(p->next->next != NULL){//不能用p->next->next 你想:你要的是下一个就行,next->next=下一个的下一个
if(p->next->data == x)break;
p=p->next;

}
//写到这里要返回去加上一前驱节点,因为删除一定要一个前驱节点

p->next = p->next->next;//没有释放删去的那个中间节点


}
####################################################################################################################################

2017年9月17日 下午2:16

概述

  1. 首先明白一点:当数据库字段用date类型时,我们的一条sql针对于date类型时可以直接使用时间字符串表示的。
    1. 例如insert into student(name,sex,age,address,birthday,remark) values('陈志恒','男','22','太原','1995-01-01','无')
  2. 说一下整个关于日期的处理步骤
    1. 第一步:从前台到数据库
      1. 从前台取到的是string类型
      2. string类型——>java.util.Date date类型
      3. java.util.Date date类型——>java.sql.Date(date.getTime()) 类型
    2. 第二步:从数据库到前台
      1. java.sql.Date()类型 ——>java.util.Date(rs.getDate(i).getTime()))类型
  3. 当我们需要对按时间进行where查询的时候
    1. 在mysql中使用datediff(时间差)函数
    2. 一共有三个参数,参考下面的连接
    3. 值得注意的一点是:这里的参数直接使用字符串类型就行。这就省去了我们转换的麻烦
    4. 链接
      1. 关于SQL模糊查询日期时间的方法_百度知道
      2. Java String 转成 Mysql Date - Hi, Sun - ITeye博客

排错

错误:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
参考:json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException - ye1992的专栏 - CSDN博客
关键:map.put(rs.getMetaData().getColumnName(i),new java.util.Date(rs.getDate(i).getTime()));

源码说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 按条件查询
* 按时间查询的完整例子
*/
@Override
public List<Map<String, Object>> queryForListOnCondition(Page p, String condition, String condition_date) {
String sql1 ="select count(1) from student where name like '%"+condition+"%' and datediff(day,date,'"+condition_date+"') < 0 ";
int count = dao.queryForCount(sql1);
p.setCount(count);

// String sql = "select * from student limit "+(p.getPageNum()-1)*p.getSize()+","+p.getSize();
// return dao.queryForList(sql);

String sql="select * from student where name like '%"+condition+"%' limit "+(p.getPageNum()-1)*p.getSize()+","+p.getSize() ;
System.out.println(sql);
return dao.queryForList(sql);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 增加保存
* 第一步:从前台到数据库(非预处理)
*/
@Override
public int addSave(String name, String sex, String age, String address, String birthday) {
java.util.Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
String sql = "insert into student(name,sex,age,address,birthday,remark) values('"+name+"','"+sex+"',"+age+",'"+address+"',"+"'"+new java.sql.Date(date.getTime())+"',"+"'无'"+")";
System.out.println(sql);
return dao.excuteUpdate(sql);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 更新保存
* 第一步:从前台到数据库(预处理)
*/
@Override
public int updateSave(String id, String name, String sex, String age, String address, String birthday) {
java.util.Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
String sql = "update student set name=?,sex=?,age=?,address=?,birthday=? where id=?";
int[] types={Types.VARCHAR,Types.VARCHAR,Types.INTEGER,Types.VARCHAR,Types.DATE,Types.INTEGER};
Object[] obj = {name,sex,age,address,new java.sql.Date(date.getTime()),id};
return dao.excuteUpdate(sql, types, obj);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 更新保存
* 第二步:从数据库到前台(放到map中)
*/
private List<Map<String, Object>> rsToList(ResultSet rs) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
while(rs.next()){
Map<String, Object> map = new HashMap<String,Object>();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
switch (rs.getMetaData().getColumnType(i)) {
case Types.INTEGER:
map.put(rs.getMetaData().getColumnName(i),rs.getInt(i));
break;
case Types.VARCHAR:
map.put(rs.getMetaData().getColumnName(i),rs.getString(i));
break;
default:
map.put(rs.getMetaData().getColumnName(i),new java.util.Date(rs.getDate(i).getTime()));
// rs.getObject(i)
}
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}

2017年9月15日 上午10:49

参考:
javascript-js实现多线程 - 浩大王 - 博客园
浏览器的多线程机制(转) - SolHe - 博客园

概述

先说明浏览器的多线程实现方式,其中着重说明了其中一个线程—javaScript引擎线程的执行方式

浏览器多线程实现方式


只要理解了上图就说明理解了浏览器多线程工作的方式(这里不能说成js多线程)

总结来说:js引擎主要是通过一个队列来存放要执行的任务。只不过我们平时操作的时候我们很少会让一个js函数执行很长的时间,从造成线程堵塞,让我们误以为js是支持多线程的。这其中的队列是核心。

与android多线程对比,加强理解

  1. 与android中操作图片的下载是一样的。在android的主视图是一个主线程,在这个主线程中我们是不允许使用http连接的,因为http连接如果事件过长,那么会造成屏幕操作的卡死,用户体验很差。这是我们就要新开一个线程去完成http请求并且下载大量图片。
  2. 在这个新开的下载图片的线程中,handler(其实是视图主线程的handler,并不是looper这一线程的handler)先负责向looper拥有的message队列中放message,然后在looper要求的时候去处理message。这里的looper就相当于这里的js引擎,他们都有自己拥有的一个消息队列,并且他们这些队列中的消息都是由其他线程给的。
  3. 他们有一个消息就处理一个消息,只关注眼前,根本不关心自己还有多少任务要做,心真大。

附录:
Ajax工作原理 - Eric Sun - 博客园
这篇文章对同步和异步解释的比较详细

浏览器的多线程机制(转) - SolHe - 博客园.zip

2017年9月15日 上午8:59

android的两个封装

adapter系统原始封装

  1. 使用默认的视图
  2. 隐藏的内容
    1. Holder的视图(这里用传参的方式传入了)
    2. 数据与视图的对应(以前通过视图set方法来手动设值)
      1. 这种方式需要严格的遵守人家的编码格式
      2. 如果人家有格式转换类,使用格式转换类进行转换

AsyncTask封装

从整体上看两个步骤

  1. 获取数据
  2. 处理数据
  3. 他隐藏的内容
    1. 与主线程进行通信你都看不见

对代理模式的改进

  1. 加方法
  2. 加缓存

其他:
android四大组件 友盟杯

2017年9月14日 上午8:24

错误一

The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this app

  1. 关于包路径的:
    1. 在我使用jstl-1.2.jar这个包时,从build path上选中我在桌面上的jar包。同时我在jsp页面也添加了下面两句话。在eclipse中没有提示我报错。但是当我放在服务器上运行的时候,出现了这个错误。
      1
      2
      <%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
      <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
    2. 原因我不知道,网上说是没有导包,但我的确是导入了。我现在猜测是由于这个包eclipse没有把我从桌面上导入的包加入到项目中
    3. 解决
      1. 我将 jstl-1.2.jar拷到web-inf_lib_中,这样就能保证一定会部署到服务器上

错误二

  1. 我在添加记住账户名功能时,功能逻辑上没啥问题,但是在最后一步中,我通过getCookies获取的cookies,取到后将cookie中包含的账户名输出出来,但是结果始终是不对。
  2. 我当时的解决方式是:从网上重找了一个代码,不去琢磨我哪错了
  3. 现在意识到了我哪错了:我和人家的代码对比,少了一个判断if(c[i].getName().equals("manager"))。错误的原因是我认为浏览器中就一个cookie,因为我就给他设置了一个,但是我忘记了还有其它一个cookie会自动,或者框架中会设置。少了这个判断,永远取到的都是最后一个cookie。
  4. 参考:servlet方式通过Cookie记住登录时的用户名和密码 - 映日残阳 - 博客园
  5. 完整代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //el表达式
    String names="";
    String pwd="";
    //取出Cookie
    Cookie [] c=request.getCookies();
    for(int i=0;i<c.length;i++){
    if(c[i].getName().equals("manager")){
    //存着数据
    names=c[i].getValue();

    //再一次的存起来(备用)
    request.setAttribute("xingming",names);
    }
    }

错误三:

出现这个错误真的是该打,有脑子没脑子
连servlet的基本执行过程都反应不过来。
下面是错误的:

下面是正确的: