纸上谈JSP
Updated:
WEB-INF 目录结构
- WEB-INF :安全目录
- 即客户端无法访问,只有服务端可以访问的目录
- web.xml :项目部署文件(即配置文件)
- 默认的欢迎界面为 index.jsp,但也可以设定为其他 :
- 修改后重启一下Tomcat服务器,就可以应用啦
- 默认的欢迎界面为 index.jsp,但也可以设定为其他 :
- classes 文件夹 :
- 存放 *.class 文件,即编译生成的字节码文件
- lib 文件夹 :
- 存放项目所需要的jar包(如连接数据库的jar包)
JSP基础语法
- JSP页面元素构成 :
- 直接放张图好了
- 直接放张图好了
- JSP指令元素 :
- page指令
- 通常位于JSP页面顶端
- 用一个页面中可以有多个page指令
- include指令
- 可将外部文件嵌入当前JSP文件中
- 同时解析这个页面中的JSP语句
- taglib指令
- 主要用于自定义标签
- 在jsp页面中启用定制行为
- page指令
page指令语法 :
基本语法 :
1
2<% @page 属性1="属性值" 属性2="属性值1,属性值2"...
属性n="属性值n" %>常见属性及其默认值 :
- language(默认值java):
指定JSP页面所使用的脚本语言 - import(无默认值):
通过该属性来引用脚本语言中使用到的类文件 - contentType(默认为text/html;ISO-8859-1):
用来指定JSP页面所采用的编码方式
- language(默认值java):
jsp中的注释 :
HTML的注释 :
1
<!--html注释--> //客户端可见
JSP的注释 :
1
<%--JSP注释--%> //客户端不可见
JSP脚本注释 :
1
2//单行注释
/*多行注释*/
JSP脚本
基本语法 :
1
<% Java代码 %>
用于实现各种脚本逻辑
1
2
3
4<%
String s = "假装有逻辑";
out.println(s);
%>
JSP声明
基本语法 :
1
<%! Java代码 %>
用于变量或方法的声明 :
1
2
3
4
5
6<%!
String s = "张三";
int add(int x, int y){
return x + y;
}
%>
JSP表达式
基本语法 :
1
<%= 变量或表达式 %> //注意表达式不以分号结束
就比如说,调用上面声明的 :
1
2你好呀 <b> <%= s %> <b> 小朋友~ <br>
你知道 1 + 1 = <%= add(1,1) %> 不?
JSP页面的生命周期
- 还是放张图好了 :
- 然后再放张图 嘿嘿 :
- 最后做个练习题叭!
答案是什么呢是什么呢?jspInit()嘛?居!然!不是哦!
那么答案是什么呢!答案是 –> 构造方法!为什么呢?
因为要先把JSP文件转化为一个Servlet嘛,然后Servlet是个类,所以初始化的时候要先执行它的构造函数 嗷呜
- 还是放张图好了 :
JSP内置对象
即由web容器创建的,不用new就能直接用的一组对象
- JSP的九大内置对象
- 依惯例放张图,绿色里面是不常用的 :
- 依惯例放张图,绿色里面是不常用的 :
out对象
- 基础描述 :
- JspWriter类的实例
- 用于向客户端输出内容
out对象的常用方法 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//向客户端打印字符串
void println();
//清除缓存区的内容(若在flush之后调用会抛出异常)
void clear();
//清除缓存区的内容(若在flush之后调用不会抛出异常)
void clearBuffer();
//将缓冲区内容输出到客户端
void flush();
//返回缓冲区的字节数大小,若不设缓冲区则返回0
int getBufferSize();
//返回缓冲区还剩多少字节数可用
int getRemaining();
//返回缓冲区满时是否自动清空还是抛出异常
boolean isAutoFlush();
//关闭输出流
void close();最后,什么是缓冲区?还是放图叭
- 基础描述 :
request对象
- 基础描述 :
- HttpServletRequest类的实例
- 用于封装客户端的请求信息
- 在完成客户端的请求前一直有效
- request对象的常用方法 :
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//返回name指定参数的参数值
String getParameter(String name);
//返回包含参数name的所有值的数组
String[] getParameterValues(String name);
//为该请求中的属性设值
void setAttribute(String,Object);
//获取某一属性的属性值
Object getAttribute(String name);
//得到请求体的MIME类型
//(比如 application/x-www-form-urlencoded)
String getContentType();
//返回请求用的协议类型及版本号
//(比如 HTTP/1.1)
String String getProtocol();
//返回接受请求的服务器的主机名
String getServerName();
//返回服务器接受此请求用的端口号
int getServerPort();
//返回字符编码方式
String getCharacterEncoding();
//设置请求的字符编码方式
void setCharacterEncoding();
//返回请求体的长度(单位为字节数)
int getContentLength();
//返回发送此请求的客户端的IP地址
String getRemoteAddr();
//返回发出该请求的真实物理路径
String getRealPath(String path);
//返回上下文路径(即项目所在根目录)
//(比如 /DemoJsp)
String getContextPath();
- 基础描述 :
response对象
- 基础描述 :
- HttpServletResponse类的实例
- 包含了响应客户请求的有关信息
- 但在JSP中很少直接用到
- 具有页面作用域,即访问一个页面时,该页面内的response对象只对本次访问有效,其他页面的response对象对当前页面无效
response对象的常用方法 :
1
2
3
4
5
6
7
8//返回是用何种字符编码进行响应的
String getCharacterEncoding();
//设置响应的MIME类型
void setContentType(String type);
//返回一个可以向客户端输出字符的对象
PrintWriter getWriter();
//重定向客户端的请求
void sendRedirect(String location);response.getWriter()和out.println()的区别 :
- 前者获取的输出流对象总是先于后者打印
- 可以在out输出后调用flush清空缓存,然后使用response的输出流,就可以让它在后面显示了
- 基础描述 :
- 请求转发和请求重定向的区别
- 请求重定向 :
- 客户端行为
- response.sendRedirect();
- 相当于两次请求
- 不保存前一次的请求对象
- 地址栏的URL发生改变
- 请求转发 :
- 服务器行为
- request.getRequestDispatcher().forward(request,response);
- 相当于一次请求
- 保存请求对象
- 地址栏的URL不改变
- 请求重定向 :
session对象
- 基础描述 :
- 表示客户端和服务端的一次会话
- 保存在服务器的内存中,和用户一一对应
- Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览该网站所花费的时间;所以说session实际上是一个特定的时间概念(?)
- session对象的常用方法 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14//返回session的创建时间
long getCreationTime();
//返回session创建时,JSP引擎为它设置的唯一ID号
String getId();
//为session设置属性并赋值
Object setAttribute(String name,Object value);
//获取session中某一属性的值;若无则返回null
Object getAttribute(String name);
//以字符数组的形式返回该session中所有属性
String[] getValueNames();
//返回该session的最大存活时间(单位:秒)
//该session过期后会重新连接并生成新的session
//相当于一个新的会话
int getMaxInactiveInterval();
- 基础描述 :
session的生命周期
- 生命周期的三个阶段 :
- 创建、活动、销毁
- 创建 :
- 当客户端第一次访问某个JSP或Servlet时,服务器会为当前会话创建一个sessionId,每次向客户端发送请求时,都会将此sessionId携带过去,服务器会对此id进行校验
- 活动 :
- 某次会话中通过超链接打开的新页面
–> 属于同一次会话 - 当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源
–> 属于同一会话 - 本次会话的所有页面都关闭后再重新访问
–> 创建新的会话(注意原有会话依然存在,旧的id仍保存在服务端,只是再没有客户端会携带它然后交予服务端校验)
- 某次会话中通过超链接打开的新页面
- 销毁 :
- 调用session.invalidate()方法
- 或该session过期(超时)
- 或服务器重新启动
- 生命周期的三个阶段 :
application对象
- 基础描述 :
- ServletContext类的实例
- 实现了用户间数据的共享,可存放全局变量
- 在用户的前后连接或不同用户之间的连接中,只要服务器未中途重启,操作的均是同一个application
- 开始于服务器的启动,终止于服务器的关闭
- application对象的常用方法 :
1
2
3
4
5
6
7
8
9//为该application设置属性并赋值
void setAttribute(String name, Object value);
//获取application中某一属性的值;若无则返回null
Object getAttribute(String name);
//以枚举的形式返回该application中的所有属性
Enumeration getAttributeNames();
//返回JSP的引擎名及版本号
//比如 Apache Tomcat/7.0.26
String getServerInfo();
- 基础描述 :
page对象
- 基础描述 :
- java.lang.Object类的实例
- 指向当前JSP页面本事
- 可以理解为类中的this指针
- page对象的常用方法 :
1
2
3String methods = "就是Object类里面的那些方法啦";
String plus = "毕竟是它的实例嘛";
System.out.println(method + "," + plus);
- 基础描述 :
JavaBeans
即遵循了某种设计原则的Java类
- JavaBeans的设计原则
- 公有类
- 无参的公有构造方法
- 私有属性
- getter && setter
JSP中JavaBeans的使用方法
- 使用普通方法创建JavaBeans :
- 直接在 <% 脚本 %> 里面new就好了
- 跟Java里的使用一样一样的
- 记得用 <% page import=”” %> 导入它
使用useBean实例化JavaBeans对象 :
- 话不多说了直接放代码吧
1
2
3
4<jsp:useBean id="myUser" class="com.po.Users"/>
<h1>使用useBean创建JavaBea实例<h1/>
用户名 :<%= myUser.getUserName() %><br>
密码 :<%= myUser.getPassword() %><br>
- 话不多说了直接放代码吧
通过setProperty设置属性 :
给已实例化的Bean对象的属性赋值,共四种形式
1
2
3
4
5
6
7
8<!-- 与表单相关联,根据表单名的完全匹配 -->
<jsp:setProperty name="JavaBean实例名" property="*"/>
<!-- 与表单相关联,根据表单名的部分匹配 -->
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名"/>
<!-- 与表单无关,为JavaBean属性手动设值 -->
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" value="该属性的值"/>
<!-- 与request参数相关联,通过URL传参赋值 -->
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" param="request对象中的参数名"/>最后的最后还是要放张图
- 通过getProperty获取属性值 :
- 还是直接上图吧 嘤
- 还是直接上图吧 嘤
- 使用普通方法创建JavaBeans :
- JavaBean的四个作用域范围
注:使用useBeans的scope属性可以指定其作用范围- 四个作用域及对应的JavaBean对象获取方法 :
- page :仅在当前页面有效
- request :可通过HttpRequest.getAttribute()获取
- session :可通过HttpSession.getAttribute()获取
- application :通过application.getAttribute()获取
- 注意当作用域为request时,需要使用请求转发来跳转;否则相当于请求了两次,得不到原request中保存的信息
- 四个作用域及对应的JavaBean对象获取方法 :
JSP状态管理
- http协议的无状态性
- 无状态是指,当浏览器发送请求给服务器,服务器就响应客户端请求;但是,当同一个浏览器再次发送请求给该服务器的时候,服务器并不知道它既是刚才那个浏览器
- 所以,如果我们想让服务器记得我们的浏览器,顺便把我们的用户状态给保存了,该要怎么做呢?
- 保存用户状态的两个机制
- session :相当于直接给服务端一个小笔记本,用来记录每个客户端对应的的请求信息
- cookie :相当于让浏览器在每次请求的时候都带上一小段特定信息表明身份,这样服务器就知道每个请求是由哪个客户端发出的了
JSP页面中创建与使用cookie
Cookie的创建、写入、与读取 :
1
2
3
4
5
6//创建Cookie对象
Cookie myCookie = new Cookie(String key,Object value);
//写入Cookie对象
response.addCookie(myCookie);
//读取Cookie对象
Cookie[] cookies = request.getCookes();cookie对象的常见方法 :
1
2
3
4
5
6
7
8
9
10//设置cookie的有效期(单位:秒)
void setMaxAge(int expiry);
//对已创建的cookie进行赋值
void setValue(String value);
//获取cookie的名称
String getName();
//获取cookie的值
String getValue();
//获取cookie的有效期(单位:秒)
int getMaxAge();
session和cookie的对比
- 就不列举了直接放图吧
- 就不列举了直接放图吧
JSP中的指令与动作元素
- include指令
- 语法 :
- <%@ include file=”URL” %>
- 用途 :
- 简单来说,就是使一个页面包含另一个页面的内容
- 语法 :
- include动作
- 语法 :
- <jsp:include page=”URL” flush=”true|false”/>
- 属性 :
- page :要包含的页面
- flush :被包含的页面是否从缓冲区读入
- 语法 :
- include指令与include动作的区别
- 本质比较 :
- include指令 :包含的是代码
- include动作 :包含的是运行结果
- 其他比较 :
- 如图如图 :
- 如图如图 :
- 最后放个问题 :
以及关于这个问题感觉看上去还挺靠谱的一个答案 :
- 本质比较 :
- forward动作
- 语法 :
- <jsp:forward page=”URL”/>
- 等同于 :
- request.getRequestDispatcher(“/URL”).forward(request,response);
- 也就是说等同于请求转发啦
- 语法 :
- param动作
- 语法 :
- <jsp:param name=”参数名” value=”参数值”/>
- 备注 :
- 常常与 < jsp:forward > 一起使用,作为其的子标签,用来在请求转发时传递参数(或添加新的参数)
- 子标签和传参的概念都很好理解这里就不放示例了
- 语法 :
最后的最后
- 我们的纸上谈JSP到此结束 撒花٩(๑>◡<๑)۶
- 接下来让我们期待与纸上谈系列之二 –>
- 纸上谈Servlet mua!( • ̀ω•́ )✧