Java学习中的一些问题

**
update date:
1. 2019-05-31;
2. 2019-07-07

一些可以优化的点:

**

1.if else 语句

1 .可以尝试写为 三元表达式
2. 需要 try catch finally 释放资源的情况,需要在释放资源前判断创建的对象是否为Null
3. 若存在 IO流 需求,可以用 if 校验读取写入是否为Null,以提高代码健壮性,提高效率,节约资源

存在迷惑的点:

**

1.接口:

**

  1. 接口成员:私有方法用来提取接口方法(默认方法,静态方法)的共性内容,提取的共性私有方法只能被默认方法调用,不能 被静态方法调用。要想被静态方法用,需要将私有方法修改为私有静态方法才可被调用,同时,默认方法也可调用该私有静态方法
    **

2.异常:

**

  1. System.out.println(2/0); ArithmeticException //java.lang.ArithmeticException: / by zero //算术运算异常
  2. 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
  1. 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事件 需要的是调用方法的返回值 如:

  1. srcElement和target :最初触发事件的元素

  2. 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>&yen;</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")
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值