发表于: 2016-09-22 10:06:49
1 2358
今天完成的事情:理解并掌握JSP九大内置对象,为什么要学这个,因为我感觉这个是接下来要学习的session/token/cookie的基础,先把这个搞懂接下来事半功倍。对于在面试过程中会遇到的mysql问题,练习了一下应用内连接/左连接/右连接实现多表查询。复习了一下IO流的知识(真正进入内存来操纵数据,在二进制中看清数据存储的本来形态,比较直观的例子是Java对象的序列化和反序列化,虽然现在看起来还没什么用)。
收获:
JSP内置对象是Web容器创建的一组对象,不使用new关键字就可以使用。
Jsp九大对象:
out
request
response
session
application
Page
pageContext
exception
config
1. out对象
缓冲区,Buffer,就是内存的一块区域用来保存临时数据。
out对象是JspWriter类的实例,是向客户端输出内容常用的对象。
2. request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
3. response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。
· sendRedirect(java.lang.String location) 重定向客户端的请求
4. Session对象
什么是Session:
session表示客户端与服务器的一次会话;
Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览网站所花费的时间;
在服务器的内存中保存着不同用户的session,一个用户对应一个session;
从上述定义中可以看到,session实际是一个特定的时间概念。
session对象
session对象是一个JSP内置对象。
session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种方法知道这是一个客户,就需要session对象。
session对象是HttpSession类的实例。
5. session的生命周期
1.创建阶段:
当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务器发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
2.活动阶段:
①某次会话当中通过超链接打开的新页面属于同一次会话。
②只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
③除非本次会话的所有页面都关闭后再重新访问某个Jsp或者servlet将会创建新的会话。
注意:原有会话还存在,只是这个旧的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验。
3.销毁阶段:三种方式
①调用了session.invalidate()方法。
②Session过期(超时)。
③服务器重新启动。
6. application对象
application对象实现了用户间数据的共享,可存放全局变量。
application开始于服务器的启动,终止于服务器的关闭。
在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
服务器的启动和关闭决定了application对象的生命。
application对象是ServletContext类的实例。
7. page对象
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例。
8. pageContext对象和config对象
pageContext对象
pageContext对象提供了对JSP页面中所有对象及名字空间的访问。
pageContext对象可以访问到本页面的session,也可以取本页所在的application对象的任意某一属性值。
pageContext对象相当于页面中所有功能的集大成者。
config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。
9. exception对象
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,够则无法编译。它实际上是java.lang.Throwable的对象。
表单提交有两种方式:get与post
1. get: 以【明文】方式通过URL提交数据,数据在URL中可以看到。提交数据最多不超过【2KB】。安全性较低但效率比post方式高。适合提交数据量不大,且安全要求不高的数据,比如:搜索、查询等功能。
2. post: 将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息,如:注册、修改、上传等功能。
请求重定向与请求转发的区别
请求重定向:客户端行为,服务端responce.sendRedirect("xx.jsp") 从本质上讲等于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
请求转发(√):服务器行为,request.getRequestDispatcher("xx.jsp").forward(request,response);从本质是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
关于MySQL多表查询
场景:已知有两个数据表,Stu表存id和name,Scores表存学生id及各科目成绩信息(每个学生的各科成绩是单独的记录,如下)。要求输出A科目成绩>B科目成绩的学生信息。
这个问题麻烦就麻烦在,学生表中某一个学生的各科成绩是作为不同的记录,如果同一个学生各科成绩都处于同一行作为一条记录存在,那么用一个最基础的Sql语句就可以解决。因此在这个场景中,我认为现在只能用学生表与其自身的连接来实现。
1. Stu表
CREATE TABLE IF NOT EXISTS Stu(
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL
);
2. Scores表
CREATE TABLE IF NOT EXISTS Scores(
id BIGINT UNSIGNED,
subject VARCHAR(30) NOT NULL,
score SMALLINT UNSIGNED NOT NULL
);
3. 实现查询
SELECT a.id, c.name, a.score AS Subject_A, b.score AS Subject_B FROM Scores AS a
LEFT JOIN Scores AS b ON a.id=b.id && a.subject="A" &&b.subject="B"
LEFT JOIN Stu AS c ON a.id=c.id
WHERE a.score>b.score;
接下来计划:完成对JSP基础的学习,实现“拦截器里通过Cookie中判断Token的有效性来判断用户是否登录”的功能。学习memcached。
评论