JAVA WEB 笔记2

一、jsp的页面元素:


a.脚本Scriptlet
i.
<% 局部变量、java语句 %>
ii.
<%! 全局变量、定义方法 %>
iii.
<%=输出表达式 %>

一般而言,修改web.xml、配置文件、java 需要重启tomcat服务
但是如果修改 Jsp\html\css\js,不需要重启

注意,out.println()不能回车;要想回车: “
”,即out.print() <%= %> 可以直接解析html代码

b.指令
page指令 <%@ page ….%> page指令的属性: language:jsp页面使用的脚本语言 import:导入类 pageEncoding:jsp文件自身编码 jsp ->java contentType:浏览器解析jsp的编码 <%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″ import=”java.util.Date” %>

c.注释
html注释 可以被客户 通过浏览器查看源码 所观察到
java注释// //
jsp注释<%– –%>

二、JSP九大内置对象(自带的,不需要new 也能使用的对象)


①pageContext JSP页面容器
②request 请求对象
③session 会话对象
④application 全局对象

⑤response 响应对象

⑥config 配置对象(服务器配置信息)
⑦out 输出对象,向客户端输出内容
⑧page 当前JSP页面对象(相当于java中的this)
⑨exception 异常对象

四种范围对象(小->大)
pageContext JSP页面容器 (page对象); 当前页面有效
request 请求对象 同一次请求有效
session 会话对象 同一次会话有效
application 全局对象 全局有效(整个项目有效)

以上4个对象共有的方法:
Object getAttribute(String name) :根据属性名,或者属性值
void setAttribute(String name,Object obj) :设置属性值(新增,修改)
setAttribute(“a”,”b”);//如果a对象之前不存在,则新建一个a对象;
如果a之前已经存在,则将a的值改为b
void removeAttribute(String name): 根据属性名,删除对象

a.
pageContext 当前页面有效 (页面挑战后无效)
b.
request 同一次请求有效;其他请求无效 (请求转发后有效; 重定向后无效)
c.
session 同一次会话有效 (无论怎么跳转,都有效;关闭/切换浏览器后无效 ; 从登陆->退出 之间全部有效)
d.
application 全局变量; 整个项目运行期间都有效(切换浏览器仍然有效); 关闭服务、其他项目无效
->多个项目共享、重启后仍然有效:JNDI
①以上的4个范围对象,通过setAttribute()复制,通过 getAttribute()取值;
②以上范围对象,尽量使用最小的范围。因为对象的范围越大,造成的性能损耗越大。

  1. out:输出对象,向客户端输出内容
  2. request:请求对象:存储“客户端向服务端发送的请求信息”
    2.1 request对象的常见方法:
    String getParameter(String name): 根据请求的字段名key(input标签的name属性值),返回字段值value(input标签的value属性值)
    String[] getParameterValues(String name): 根据请求的字段名key,返回多个字段值value(checkbox)
    void setCharacterEncoding(“编码格式utf-8”):设置请求编码 (tomcat7以前默认iso-8859-1,tomcat8以后改为utf-8)
    getRequestDispatcher(“b.jsp”).forword(request,reponse); :请求转发的方式跳转页面 A->B
    ServletContext getServerContext():获取项目的ServletContext对象

示例:
注册
register.jsp , show.jsp

get提交方式: method“get”和地址栏、超链接()请求方式 默认都属于get提交方式

2.2 get与post请求方式的区别:
a. get方式在地址栏显示请求信息(但是地址栏能够容纳的信息有限,4-5KB;如果请求数据存在大文件,图片等 会出现地址栏无法容纳全部的数据而出错);post不会显示
b.文件上传文件操作,必须是post
推荐使用post

2.3 统一请求的编码 request
get方式请求 如果出现乱码,解决:
a.统一每一个变量的编码(不推荐)
new String(旧编码,新编码);
name=new String(name.getBytes(“iso-8859-1″),”utf-8”);
b.修改server.xml,一次性的更改tomcat默认get提交方式的编码(utf-8)
建议使用tomcat时,首先在serve.xml中统一get方式的编码

tomcat7(iso-8859-1)
tomcat8(utf-8)

post
request.setCharacterEncoding(“utf-8”);

  1. response:相应对象
    提供的方法:
    void addCookie(Cookie cookie);服务端向客户端增加cookie对象
    void sendRedirect(String location) throws IOException; :页面跳转的一种方式(重定向)
    void setContetType(String type):设置服务端响应的编码(设置服务端的contentType类型)

示例:登陆
login.jsp ->check.jsp->success.jsp

                请求转发            重定向

地址栏是否改变 不变(check.jsp) 改变(success.jsp)

是否保留第一次 保留 不保留 –四种范围对象
请求时的数据

请求的次数 1 2

跳转发生的位置 服务端 客户端发出的第二次跳转

转发、重定向:

转发:
张三(客户端) -> 【服务窗口 A(服务端)-> 服务端口 B 】
重定向:
张三(客户端) -> 服务窗口 A(服务端)-> 去找B
张三(客户端) -> 服务窗口 B(服务端)-> 结束

  1. session(服务端)
    Cookie(客户端,不是内置对象):Cookie是由服务端生成的,再发给客户端保存。
    相当于本地缓存的作用: 客户端(hello.mp4;zs/abc)->服务端(hello.mp4;zs/abc)
    作用:提高访问服务端的效率,但是安全性较差。

4.1
Cookie: name=value
javax.servlet.http.Cookie
public Cookie(String name,String value)
String getName():获取name
String getValue():获取value
void setMaxAge(int expiry);最大有效期(秒)

4.2 服务器准备Cookie:
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取cookie: request.getCookies();

a.服务端增加cookie:response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将全部的cookie拿到

通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为JSESSIONID的cookie

建议cookie只保存英文数字,否则需要进行编码、解码

4.3 使用Cookie实现,记住用户名功能

4.4 session:会话
a.浏览网站:开始-关闭
b.购物: 浏览、付款、退出
c.单子邮件:浏览、写邮件、退出
开始-结束

4.5 session机制:
客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息)
并且每一个session对象都会有一个唯一的sessionId(用于区分其他session);
服务端由会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务器sessionId的值;
然后服务端会在响应客户端的同时将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSION – sessionID)

客户端第二/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和session sessionid),说明此用户不是第一次访问,无需登录。

例子:
客户端 顾客(客户端)
服务端:存包处 – 商场(服务端)

顾客第一次存包:商场判断此人是否之前已经存过包(通过你手里是否有这里的钥匙)。
如果是新顾客(没钥匙),分配一个钥匙给该顾客;钥匙会和柜子一一对应;

第二/n次存包:商场判断此人是否之前已经存过包(通过你手里是否有这里的钥匙)。
如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙会和柜子自动一一对应。

session:
a.session存储在服务器
b.session是在同一个用户(客户)请求时共享
c.实现机制:第一次客户请求时产生一个sessionid并复制给cookie的jsessionid然后发给客户端,最终session的sessionid-cookie的jsessionid实现一一对应。

4.6 session方法:
String getId() :获取sessionId
boolean isNew() :判断是否是新用户(第一次访问)
void invalidate() :使session失效(退出登录、注销)

void setAttribute();
Object getAttribute();

void setMaxInactiveInterval(秒) :设置最大有效 非活动时间
int getMaxInactiveInterval(秒) :获取最大有效 非活动时间

示例:
登录
客户端在第一次请求服务端时,如果服务端发现此请求没有JSESSIONID,则会创建一个name=除了自己设置的Cookie对象外,还有一个name为JSESSIONID的cookie

Cookie:
a.不是内部对象,要使用必须new
b.但是,服务端会自动生成一个(服务端自动new一个cookie)name=JSESSIONID的cookie,并返回给客户端

4.7 cookie和session的区别:
session cookie
保存位置 服务端 客户端
安全性 较安全 较不安全
保存的内容 Object String

application 全局对象
String getContextPath() 虚拟路径
String getRealPath(String name): 绝对路径(虚拟路径 相对的绝对路径)

发表评论