JSP学习
jsp是什么?
Java server pages。 Java 服务器端页面。 是在服务器端执行的
实现了在 Java 当中使用HTML 标签
技术特点:
Java平台, 安全性高, 适合开发大型的, 企业级的 Web应用程序
基础语法
jsp指令
page指令
通常位于jsp页面的顶端, 同一个页面可以有多个page 指令
<%@ page language="java" contentType="text/html; charset=utf-8"
%>
属性 | 作用 |
---|---|
language | 设置jsp执行的语言 |
import | 当前页面引入的库文件 |
contentType | 设置页面的编码格式 |
**pageEncoding=”UTF-8”**的作用是设置JSP编译成Servlet时使用的编码。
**contentType=”text/html;charset=UTF-8”**的作用是指定服务器响应给浏览器的编码。
表示的是HTML标签的编码 - [request](https://so.youkuaiyun.com/so/search?q=request&spm=1001.2101.3001.7020).setCharacterEncoding(“UTF-8”)的作用是设置对客户端请求和数据库取值时的编码 ,可以解决post请求的中文乱码问题 - 如何解决get请求传参的中文乱码问题修改tomcat配置的server.xml的URLEncoding
include指令
将一个外部文件嵌入到当前的 JSP 文件中, 同时解析这个页面的 JSP 语句
taglib指令
使用标签库定义新的自定义标签, 在JSP页面中启用定制行为
jsp注释
html 注释:
<!-- HTML注释 --> //客户端可见
jsp脚本注释:
<%-- html注释 --%> //客户端不可见
JSP脚本注释:
<%
// 单行注释
/* 多行注释 */
%>
jsp脚本
就是标签内置执行代码
语法:
<% Java代码 %>
jsp声明
在JSP页面中定义变量或者方法
语法:
<%! Java代码 %>
例子:
<%!
String s = '张三'; // 声明了一个字符串变量
int add(int x,int y) { // 声明了一个返回整形的函数
return x + y;
}
%>
jsp表达式
在jsp页面中执行的表达式
语法:
<% =表达式 %> // 表达式不以分号结束
jsp页面生命周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLURrhP4-1647329905250)(JSP%E5%AD%A6%E4%B9%A0.assets/1646197348574.png)]
jsp内置对象
jsp内置对象是Web 容器创建的一组对象, 不适用new关键字就可以使用内置对象。
缓冲区buffer
就是内存的一块区域用来保存临时数据
out对象
out对象是JspWriter类的实例,是向客户端输出内容的常用对象
常用方法如下:
- void println() 向客户端打印字符串
- void clear() 清除缓冲区内容,如果在 flush 之后调用会抛出异常
- void clearBuffer() 清除缓冲区内容,如果在flush之后调用不会抛出异常
- void flush() 将缓冲区内容输出到客户端,然后刷新缓冲区
- int getBufferSize() 返回缓冲区以字节数的大小, 如果不设缓冲区则为0
- int getRemaining() 返回缓冲区还剩余多少可用
- boolean isAutoFlush() 返回缓冲区满时, 是自动清空还是抛出异常
- void close() 关闭输出流
表单提交方式
表格table
th | td |
---|---|
表头 | 单元格 |
tr 是一行
colspan=”2“ 表示单元格横占几格
get
以明文的方式通过url提交数据, 数据在url中可以看到。
提交的数据最多不超过2kb。
安全性较低但效率比post方式高
post
将用户提交的信息封装在request header中。适合提交数据量大, 安全性高的用户数据。
request对象
客户端的请求信息被封装在request 对象中, 通过它才能了解到客户的需求, 然后做出响应。 它是HttpServletRequest类的实例。 request对象具有请求域, 即完成客户端的请求之前,该对象一直有效。就是每一次请求都是一个request实例。常用方法如下:
- String getParameter(String name) 返回name 项的值
- String[] getParameterValues(String name) 返回所有name项的数组
- void setAttribute(String,Object) 储存此请求中得属性
- object getAttribute(String name) 返回指定属性得属性值
- String getContentType() 得到请求体的MIME类型
- String getProtocol() 返回请求用的协议类型即版本号
- String getServerName() 返回接受请求的服务器主机名
- int getServerPort() 返回服务器接收此请求所用的端口号
- String getCharacterEncoding() 返回字符编码方式
- void setCharacterEncoding() 设置请求的字符编码方式
- int getContentLength() 返回请求体的长度,字节
- String getRemoveAddr() 返回发送此请求的客户端的IP地址
- String getRealPath(String path) 返回一条虚拟路径的真实路径
- String getContextPath() 返回上文路径
- getRequestDispatcher().forward(req, resp) 重定向
response对象
response对象包含了响应客户请求的有关信息。特使HttpServletResponse类的实例。response对象具有页面作用域。即每一个页面都是一个实例(response对象)
常用方法:
-
String getCharacterEcoding() 返回响应用的是何种字符编码
-
void setContentType(String type) 设置响应的MIME 类型
-
printWriter getWriter() 返回可以向客户端输出字符的一个对象
(与内置out对象的区别: 它的输出总是提前于out对象的输出)
-
sendRedirect(java.lang.String location) 重新定向客户端的需求
总结:每个页面都有自己的request 和response ,request 封装本页面被请求的信息,response 封装响应给别人的信息。
请求转发与请求重定向
请求重定向:客户端行为, response.sendRedirect(“url”), 从本质上来讲等同于两次请求,前一次的请求对象不会保存,地址栏的url地址会改变。
请求转发: 服务器行为, request.getRequestDispatcher(“url”).forward(request, response); 是一次请求, 转发后请求对象会保存,地址栏的url地址不会改变。
问:为什么有flush不能请求重定向?
response页面一旦调用一个flush()方法后,代表该response已经提交, 执行完毕,不能再使用
而请求重定向需要这个response 回复客户端。但是这个response 已经不能用了,所以会报错。
<a>
a相当于一次请求请求重定向,两次请求不属于一个request。两次回复也不属于一个response。
说明同一个网页有且仅有一个相同的request实例,一个response实例。这次requst 的生命周期等到response输出到前端时才算结束。
使用请求转发是共享request 和 response
session
什么是session?
session 表示客户端与服务器的一次会话。
只要有任何页面存在都会被视为是在同一个会话里面。
session对象
- session 对象是一个 JSP 内置对象
- session 对象在第一个JSP 页面被装载时自动创建,完成会话期管理
- session 对象时HttpSession 类的实例
常用方法:
- long getCreationTime(): 返回session 创建时间,毫秒级
- public String getId(): 返回session 创建时JSP 引擎为它设的唯一的 ID 号
- public Object setAttribute(String name, Object value): 使用指定名称将对象绑定到此对话
- public Object getAttribute(String name): 返回与此会话中的指定名称绑定在一起的对象, 如果没有对象绑定在该名称下, 则返回null
- String[] getValueNames(): 返回一个数组,包含此session 种所有的属性
- int getMaxInactiveInterval(): 返回session过期的时间
- int setMaxInactiveInterval(): 设置session的过期时间
session的生命周期
1.创建
当客户端第一次访问某个jsp 或者Servlet 时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验
2.活动
- 某次会话当中通过超链接打开新页面属于同义词会话
- 只要当前会话页面没有全部关闭, 重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
- 除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet 将会创建新的会话。
注意:关闭以后,其实原有会话还存在, 只是这个旧的SessionId还存在于服务端,只不过再也没有客户端携带它然后交予服务端校验。
3.销毁
Session 的销毁只有三种方式:
- 调用了session.invalidate() 方法
- Session 过期
- 服务器重新启动
application 对象
application 对象实现了用户间数据的共享,可存放全局变量
application 开始于服务器的启动, 终止于服务器的关闭
在任何地方对application 对象属性的操作,都将影响到其它用户对此的访问
application 对象时ServletContext类的实例
常用方法:
- public void setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话
- public Object getAttribute(String name) 返回此会话中的指定名称绑定在一起的对象
- Enumeration getAttributeNames 返回所有可用属性名的枚举
- String getServerInfo() 返回JSP(servlet)引擎名及版本号
page 对象
page 对象就是指当前JSP 页面本身,有点像类中的this 指针
page 对象是jaga.lang.Object 类的实例
常用方法:
- class getClass() 返回此Object的类
- int hashCode() 返回此Object的hash 码
- boolean equals(Object obj) 判断此Object是否与指定的Object 对象相等
- void copy(Object obj) 把此Object拷贝到指定的Object 对象中
- Object clone() 克隆此Object对象
- String toString() 把此Object对象转换为String类的对象
- void notify 唤醒一个等待的线程
- void notifyAll() 唤醒所有的等待线程
- void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒
- void wait() 使一个线程处于等待直到被唤醒
pageContext 对象
pageContext 对象提供了对JSP页面内所有的对象及名字空间的访问
pageContext 对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值
pageContext 对象相当于页面中所有功能的集大成者
pageContext对象是 pageContext类的实例
常用方法:
- JSPWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)
- HttpSession getSession() 返回当前页面中的HttpSession对象(session)
- Object getPage() 返回当前页中的page
- ServletRequest getRequest() 返回当前页的request
- ServlerResponse getResponse() 返回当前页的response
- void setAttribute(String name,Object attribute)设置属性和属性值
- Object getAttribute(String name,int scope) 在指定范围内取属性的值
- int getAttributeScope(String name) 返回某属性的作用范围
- void forward(String relativeUrlPath) 使当前页面重导到另一页面
- void include(String relativeUrlPath) 在当前位置包含另一文件,包括HTML内容都会显示
exception 对象
exception 对象是一个异常对象,当一个页面运行过程中发生了异常,就产生了该对象。
它是java.lang.Throwable的对象。
常用方法:
- String getMessage()返回描述异常的消息
- String toString() 返回关于异常的简短描述消息
- void printStackTrace() 显示异常及其栈轨迹
- Throwable FillInStackThrce() 重写异常的执行栈轨迹
注意:处理异常时,需要在头文件中指定处理异常的页面。而在处理异常页面的头文件中需要声明isErrorPage为true. 具体代码如下
异常页面:
errorPage="doexception.jsp"
处理异常页面:
isErrorPage="true"
Javabean
Javabeans 就是符合某种特定的规范的Java 类。
使用Javabeans 的好处是解决了代码重复编写,减少代码冗余,功能区分明确, 提高了代码的维护性。
设计原则
- 公有类
- 无参的公有构造方法
- 属性私有
- getter 和 setter 方法
Jsp动作元素
动作元素为请求处理阶段提供信息。动作元素遵循 XML 元素的语法,有一个包含元素名的开始标签,可以有属性、可选的内容、与开始标签匹配的结束标签。
在jsp页面中如何使用Javabeans
-
像使用普通的Java 类一样,创建javabean 实例。
先构造一个JavaBean的类,实例化
Users user = new Users();
用set方法创建数据 -
使用jsp 动作标签使用javabean。
-
useBean 动作
<jsp:useBean>
作用:在jsp 页面中实例化或者在指定范围内使用javabean
<jsp:useBean id="标识符" class="java类名" scope="作用范围 />"
-
setProperty 动作
<jsp:setProperty>
作用: 给已经实例化的Javabean 对象的属性赋值,一共有四种形式。
<jsp:setProperty name="JavaBean实例名" property="*" />
(跟表单关联。自动匹配所有属性)<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" />
(跟表单关联,通过property 来匹配表单上name的值。这里的name的值表示它是哪一个JavaBean实例进行匹配)<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" value="BeanValue" />
(手工设置,属性的值等于value,跟表单无关)<jsp:setProperty name="JavaBean实例名" property="propertyName" param="request对象中的参数名"/>
(跟request参数关联,可以通过url 获得propertyName的属性值) -
getProperty 动作
作用:获取指定Javabean 对象的属性值。
<jsp:getProperty name="JavaBean 实例名" property="属性名" />
使用代码:
<!-- 使用getProperty 方式来获取用户名和密码 --> 用户名: <jsp:getProperty property="username" name="myUsers"/><br><br> 密码: <jsp:getProperty property="password" name="myUsers"/>
-
Javabean 的四个作用域范围
使用useBeans的scope属性可以用来指定javabean 的作用范围
- page 在当前页面有效
- request 可以通过HttpRequest.getAttribute() 方法取得JavaBean 对象
- session 可以通过HttpSession.getAttribute() 方法取得JavaBean 对象
- application 可以通过 application.getAttribute() 方法取得JavaBean 对象
问题:useBean 的意思是拿到一个class类的实例,如果没有,则创建一个
https://blog.youkuaiyun.com/allway2/article/details/111018118
Model1 简介
JavaBean 的出现可以使jsp 页面中使用JavaBean 封装的数据或者调用JavaBean 的业务逻辑代码, 这样大大提升了程序的可维护性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAbKGFmC-1647329905251)(JSP%E5%AD%A6%E4%B9%A0.assets/1646705232203.png)]
jsp状态管理
http协议的无状态性
就是指浏览器二次发送请求时,服务器并不知道它就是第一次发送请求的那个浏览器。
保存用户状态的两大机制
-
session
-
cookie
中文名称为 ‘小甜饼’, 是web 服务器保存在客户端的一系列[数组]文本信息。
作用:
- 对特定对象的追踪
- 保存用户网页的浏览记录与习惯
- 简化登录
安全风险: 容易泄露用户信息
在jsp中创建与使用Cookie
创建cookie对象
Cookie newCookie = new Cookie(String key, Object value);
写入cookie
response.addCookie(newCookie);
读取Cookie 对象
Cookie[] cookies = request.getCookies();
常用方法:
- void setMaxAge(int expiry) 设置cookie 的有效期,以秒为单位
- void setValue(String value) 在cookie 创建后,对cookie进行赋值
- String getName() 获取cookie 的名称
- String getValue() 获取cookie 的值
- int getMaxAge() 获取cookie 的有效时间,以秒为单位
session 和 cookie的对比
session | cookie |
---|---|
在服务器端保存用户信息 | 在客户端保存用户信息 |
保存的是Object类型 | 保存的是String类型 |
随会话的结束而将其存储的数据销毁 | cookie可以长期(生存期限)保存在客户端 |
保存重要的信息 | 保存用户不重要用户信息 |
指令与动作
include 指令
语法:<%@ include file="URL">
include 动作
语法: <jsp:include page="URL" flush="true|false" />
page: 要包含的页面
flush: 被包含的页面是否从缓冲区读取
include指令 | jsp:include动作 | |
---|---|---|
语法格式 | <%@ include file="URL"> | <jsp:include page="URL" flush="true> |
发生作用的时间 | 页面编译期间 | 请求期间 |
包含的内容 | 文件的实际内容 | 页面的输出 |
转换成的Servlet | 主页面和包含页面转换为一个Servlet | 主页面和包含页面转化为独立的Servlet |
编译时间 | 较慢——资源必须被解析 | 较快 |
执行时间 | 稍快 | 较满——每次资源必须被解析 |
forward 动作
语法: <jsp:forward page="URL" />
等同于: request.getRequestDispatcher("/url").forward(request, response);
param 动作
语法: <jsp:param name="参数名" value="参数值">
常常与<jsp:forward>
一起使用,作为其的子标签
附件: