JSP学习

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.csdn.net/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 注释:

 //客户端可见

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相当于一次请求请求重定向,两次请求不属于一个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 页面中实例化或者在指定范围内使用javabean

    • setProperty 动作

      作用: 给已经实例化的Javabean 对象的属性赋值,一共有四种形式。

      (跟表单关联。自动匹配所有属性)

      (跟表单关联,通过property 来匹配表单上name的值。这里的name的值表示它是哪一个JavaBean实例进行匹配)

      (手工设置,属性的值等于value,跟表单无关)

      (跟request参数关联,可以通过url 获得propertyName的属性值)

    • getProperty 动作

      作用:获取指定Javabean 对象的属性值。

      使用代码:

      
      用户名: 

      密码:
Javabean 的四个作用域范围

使用useBeans的scope属性可以用来指定javabean 的作用范围

  • page 在当前页面有效
  • request 可以通过HttpRequest.getAttribute() 方法取得JavaBean 对象
  • session 可以通过HttpSession.getAttribute() 方法取得JavaBean 对象
  • application 可以通过 application.getAttribute() 方法取得JavaBean 对象

问题:useBean 的意思是拿到一个class类的实例,如果没有,则创建一个

https://blog.csdn.net/allway2/article/details/111018118

Model1 简介

JavaBean 的出现可以使jsp 页面中使用JavaBean 封装的数据或者调用JavaBean 的业务逻辑代码, 这样大大提升了程序的可维护性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAbKGFmC-1647329905251)(JSP%E5%AD%A6%E4%B9%A0.assets/1646705232203.png)]

jsp状态管理

http协议的无状态性

就是指浏览器二次发送请求时,服务器并不知道它就是第一次发送请求的那个浏览器。

保存用户状态的两大机制
  1. session

  2. 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 动作

语法:

page: 要包含的页面

flush: 被包含的页面是否从缓冲区读取

include指令 jsp:include动作
语法格式 <%@ include file="URL">

等同于: request.getRequestDispatcher("/url").forward(request, response);

param 动作

语法:

常常与 一起使用,作为其的子标签

附件:

案例:

你可能感兴趣的:(Java,eclipse,java,jsp)