**
update date:
1. 2019-05-31;
2. 2019-07-07
一些可以优化的点:
**
1.if else 语句
1 .可以尝试写为 三元表达式
2. 需要 try catch finally 释放资源的情况,需要在释放资源前判断创建的对象是否为Null
3. 若存在 IO流 需求,可以用 if 校验读取写入是否为Null,以提高代码健壮性,提高效率,节约资源
存在迷惑的点:
**
1.接口:
**
- 接口成员:私有方法用来提取接口方法(默认方法,静态方法)的共性内容,提取的共性私有方法只能被默认方法调用,不能 被静态方法调用。要想被静态方法用,需要将私有方法修改为私有静态方法才可被调用,同时,默认方法也可调用该私有静态方法
**
2.异常:
**
- System.out.println(2/0); ArithmeticException //java.lang.ArithmeticException: / by zero //算术运算异常
- ClassNotFoundException //检查idea模块配置文件,检查类名
**
3. 多线程:
**
1.测试类中调用 线程对象的.start() ,线程启动并执行继承了Thread类的run(),若子类中没有重写run(),则控制台无输出。
public class Demo {
public static void main(String[] args) {
MyThread t = new MyThread();
t.run();
}
}
class MyThread extends Thread {
public void start() {
for(int i = 0; i < 10; i++) {
System.out.println("Value = " + i);
}
}
}
**
4. IO流:
**
1.
BufferedReader br = new BufferedReader(new FileReader("tempTest\\test.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("tempTest\\test1.txt"));
IO流写入和读取对象同时指向同一文件时,创建bw对象时就生成了新的空文本txt文件,br.reanLine()返回值为null
- TCP 上传文件给与反馈时,shutDownOutPutStream 与 shutDownInPutStream
- [ ]
- [ ]
5.MySQL语法注意:
分页的语法为:
SELECT * FROM 表名LIMIT offset, length;
offset是指偏移量,可以认为是跳过的记录数量,如果不写,默认值为0;
length是指需要查询的记录个数 如果要查询所有记录可以设置为 -1
MySQL中的隔离级别:
Read Uncommitted:读未提交,可能会引发脏读,不可重复读,幻读
Read Committed:读已提交,可以避免脏读,可能会引发不可重复读,幻读,是Oracle的默认隔离级别
Repeatable read: 可重复读,可以避免脏读,不可重复读,可能会引发幻读,是MySQL的默认隔离级别
Serializable:串行化 可以避免所有问题,但是效率较低
创建table的时候:
double(有效数字个数,小数点后几位)
CREATE TABLE temp(
score DOUBLE(3,2) //1.11,9.99 ps 10.00 11.1超过范围
)
修改列名称 类型
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名 modify 列名 新数据类型;
删除列
alter table 表名 drop 列名;
约束:
分页查询
1. 语法:limit 开始的索引,每页查询的条数;
2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
– 每页显示3条记录
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页
3. limit 是一个MySQL"方言"
查询选择,考虑是否存在null 需要显示全部内容时需要用 外连接
有连接先连接 再 WHERE GROUP BY …
CREATE TABLE Category(
cid INT,
cNAME VARCHAR(20)
)
SELECT * FROM Product
CREATE TABLE Product(
pid INT,
pNAME VARCHAR(20),
price INT,
cid INT
错误: SELECT cname,count(price) FROM category c , product p WHERE p.cid
= c.cid
GROUP BY cname HAVING price >= 50
原因:Having只作函数判断?
正确:
SELECT cname,COUNT(price) FROM category c , product p WHERE p.cid
= c.cid
AND price >=50 GROUP BY cname
SELECT cname,COUNT(price) FROM category c LEFT JOIN product p ON p.cid
= c.cid
WHERE price >=50 GROUP BY cname
JavaWeb
CSS: vertical 竖直的
vertical-align:middle 把此元素放置在父元素的中部。
盒子模型:控制布局
* margin:外边距
* padding:内边距
* 默认情况下内边距会影响整个盒子的大小
* box-sizing: border-box; 设置盒子的属性,让width和height就是最终盒子的大小
Script 调用方法小括号问题
JS function属性:
length:代表形参的个数
Array 数组:
js中没有集合。 js中数组 既是数组也是集合。因为js中的数组长度可变而且可以存储任意类型。
创建方式:
1: var arr = new Array(4,6,8,9); //[4,6,8,9]
2: var arr = new Array(5); //数组的长度是5
3: var arr = [4,6,8,9];
容器:
增:
1: var arr = [4,6,8,9];
arr[4] = 10; //[4,6,8,9,10]
2: 在最后面添加
var arr = [4,6,8,9];
arr.push(10,3,2,8); //[4,6,8,9,10,3,2,8]
3: 在最前面添加
var arr = [4,6,8,9];
arr.unshift(10,3,2,8); //[10,3,2,8,4,6,8,9]
删 :
1: 从最后删
var arr = [4,6,8,9];
arr.pop(); //[4,6,8]
2: 从前面删
var arr = [4,6,8,9];
arr.shift(); //[6,8,9]
3:使用 delete 关键字
删除任意位置上的元素, 但是那个位置还会保留。
var arr = [4,6,8,9];
delete arr[1]; //[4,,8,9]
改 :
var arr = [4,6,8,9];'
arr[1] =10;//[4,10,8,9]
查:
遍历
var arr = [4,6,8,9];
for (var i=0;i<arr.length ;i++ ){
// arr[i];
}
遍历:
arr.join("-");
定义表单 onsubmit事件定义在form上 若在form上绑定onsubmit事件 需要的是调用方法的返回值 如:
-
srcElement和target :最初触发事件的元素
-
currentTarget :目前事件触发到的元素
3.this:
①如果是采用匿名函数的方式绑定事件,this是绑定事件的那个元素
②如果是常用元素属性的方式去绑定this就不是元素了。
Servlet:
response响应头中的2个可简略的写法
1.
//获取流之前设置该流的默认编码
response.setCharacterEncoding(“utf-8”);
//告诉浏览器以什么字符集解码
response.setHeader(“content-type”, “text/html;charset=utf-8”);
response.setContentType("text/html;charset=utf-8");
2.
//1.设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//简单的重定向方法
response.sendRedirect("/day15/responseDemo2");
超链接下载思路:
1 request获取filename参数
2 通过ServletContext获取filename的realPath
3 通过IO流写入内存再通过response写入到客户端
4 获取MIME并设置响应头
1 response.setHeader(“content-type”,MIME)
2 response.setHeader(“content-disposition”,“attachment;filename=xxx”)
ps
response—下载文件中文名乱码问题
统一方案:
filename = URLEncoder.encode(filename, “UTF-8”);
response.setHeader(“Content-disposition”, “attachment;filename=” + filename);
FileInputStream需要手动关流
uri
%E8%A7%86%E9%A2%91.avi
视频.avi
UTF-8 一个汉字占3个字节,视频二个汉字共6个字节,共48位,URL编码为16进制,%E8%A7%86%E9%A2%91 每一个16进制数字占8位一个字节。
GBK 1个汉字占2个字节
JSP:
forEach中的a标签可以使用href="javascript:f(el表达式);"实现提交数据或跳转
location.href = “${pageContext.request.contextPath}/deleteUserByIdServlet?id=” + el表达式;
session:
session.invalidate()的用法
当浏览器第一次请求时,服务器创建一个session对象,同时生成一个sessionId,并在此次响应中将sessionId 以响应报文的方式传回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话。
关闭此浏览器窗口,其内存中的sessionId也就随之销毁。
session.invalidate()是将session设置为失效,一般在退出时使用,但要注意的是:session失效的同时 浏览器会立即创建一个新的session的,你第一个session已经失效了 所以调用它的getAttribute方法时候一定会抛出NullPointerException的
jsessionid只是tomcat中对session id的叫法,在其它容器里面,不一定就是叫jsessionid了
其次你编程的时候实现了添加cookie或者用的是session 这两者都会产生cookie cookie name 为JSESSIONID 应该是你用了session编程,它会在记录此窗口的临时cookie 放在内存中 只要你这个窗口不关掉 它的子窗口也可以得到这个cookie 并使用但你一旦关掉了这个窗口 这个cookie就消失了
黑马旅游网
1.BaseServlet的抽取
HttpServlet中的service()可以通过http协议 requset.getMethod()获得get/post等请求方式,
对其进行方法分配.可以通过对service()进行修改实现对不同servlet访问的分配
新建一个类去继承HttpServlet并在类中重写service();
在service()中通过 this class文件 反射 实现对不同servlet访问的分配
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri = req.getRequestURI();
//user/login
String method = uri.substring(uri.lastIndexOf("/") + 1);
try {
Method mth = this.getClass().getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
mth.invoke(this, req, resp);
} catch (Exception e) {
}
}
}
再新建一个类用来统一放置不同的servlet,参数HttpServletRequest request, HttpServletResponse response去继承BaseServlet 当网页请求servlet时
会先去访问父类的service() 在里面可以获得URI获得要执行方法的方法名,便可以在BaseServlet中对该类的方法进行调用,完成Servelt的整合
WebServlet("/user/*")
public class UserServlet extends BaseServlet {
/**
* 用户退出
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().invalidate();
response.sendRedirect(request.getContextPath() + "/login.html");
}
}
PS:访问方法/servlet的权限修饰符换为 public(推荐) 或在BaseServlet中进行暴力反射
2.异步展示数据
可以通过封装方法,传递参数的方式完成异步页面数据展示
//方法调用
$(function () {
var cid = getParameter("cid");
if (!cid) {
cid = 5;
}
load(cid);
});
//封装方法
function load(cid, currentPage) {
$.post("/travel/route/list", {cid: cid, currentPage: currentPage}, function (json) {
//分页 总计数
$("#page").html(
'<i></i> 共\n' +
'<span>' + json.totalPage + '</span>页<span>' + json.totalCount + '</span>条'
);
//分页链接
var str = '<li><a href="javascript:load(' + cid + ',' + 1 + ')">首页</a></li>';
//首页设置
if (json.currentPage == 1) {
str += '<li class="threeword"><a href="javascript:;">上一页</a></li>';
} else {
str += '<li class="threeword"><a href="javascript:load(' + cid + ',' + (json.currentPage - 1) + ')">上一页</a></li>';
}
//中间页码
for (var i = json.beginPage; i <= json.endPage; i++) {
if (i == json.currentPage) {
str += '<li class="curPage"><a href="javascript:;">' + i + '</a></li>';
} else {
str += '<li><a href="javascript:load(' + cid + ',' + i + ')">' + i + '</a></li>';
}
}
//末页设置
if (json.currentPage == json.totalPage) {
str += '<li class="threeword"><a href="javascript:;">下一页</a></li>';
} else {
str += '<li class="threeword"><a href="javascript:load(' + cid + ',' + (json.currentPage + 1) + ')">下一页</a></li>';
}
str += '<li class="threeword"><a href="javascript:load(' + cid + ',' + json.totalPage + ')">末页</a></li>';
$("#aaa").html(str);
//
$("#bt").html(json.rname);
var s = '';
var length = json.list.length;
for (var i = 0; i < length; i++) {
s += ' <li>\n' +
' <div class="img"><img width="299" src="' + json.list[i].rimage + '" alt=""></div>\n' +
' <div class="text1">\n' +
' <p class="wenzi">' + json.list[i].rname + '</p>\n' +
' <br/>\n' +
' <p>' + json.list[i].routeIntroduce + '</p>\n' +
' </div>\n' +
' <div class="price">\n' +
' <p class="price_num">\n' +
' <span>¥</span>\n' +
' <span>' + json.list[i].price + '</span>\n' +
' <span>起</span>\n' +
' </p>\n' +
' <p><a href="route_detail.html">查看详情</a></p>\n' +
' </div>\n' +
' </li>'
}
$("#nr").html(s);
$(".wenzi").css("fontSize", "16px");
}, "json")
}