Javaweb06-Jsp技术

Jsp技术

一.Jsp的运行原理

**概述:**JSP是Java服务器页面,既可以写静态页面代码,也可以写动态页面代码

**特点:**跨平台性,业务代码相分离,组件重用,预编译

运行原理:

image-20240523172655455
  • 客户端发生请求到Jsp文件

  • Jsp容器将Jsp文件转换为Java源文件

  • 通过编译将其转换为.class文件,它就是一个Servlet

  • jspInit()初始化(整个生命周期只会执行一次)

    -> jspService()处理请求(通过多线程方法处理,由于转换编译第一次请求慢,之后会成为常驻内存快

    ->处理完请求,响应对象由Jsp容器接收,并返回客户端

    ->Jsp对象销毁前调用jspDestroy()

二.Jsp的基本语法

**基本构成:**HTML + Java + Jsp tab

1.Jsp脚本元素

  • Jsp scriptlets

Jsp scriptlets是Jsp中存放Java代码的片段,格式:

<% 代码(变量, 程序控制语句,Jsp内置对象) %>
//存放在jspService()中的逻辑处理
  • 声明标识

声明标识用于在整个Jsp中定义全局变量和方法,格式:

<%! 定义变量和方法等 %>

解释:

1.在声明方法中定义的变量是全局变量,是因为这相当于是在.class文件转换为servlet中的全局变量和方法,是不可以进行输出。的在Jsp scriptlets代码片段中定义的变量是相当于在jspService()方法中定义的方法,因此不可以定义方法,定义的变量也是局部变量

2.通过声明标识创建的变量和方法在当前JSP页面中有效,它的生命周期是从创建开始到服务器结束;代码片段创建的变量或方法,也是在当前JSP页面有效,但它的生命周期是页面关闭后就会被销毁。

  • Jsp表达式

用于向页面输出表达式,该表达式的最终结果将会转换为字符串,格式:

<%= expression =>

2.JSP注释

  • 同Java注释一样
//   /**/  /** */
  • 隐藏注释
<%-- 注释 --%>

网页源代码只显示出了HTML注释,而没有显示JSP的注释信息。这是因为Tomcat编译JSP文件时,会将HTML注释当成普通文本发送到客户端,而JSP页面中格式为“<%-- 注释信息 --%>”的内容则会被忽略,不会发送到客户端。

  • 动态注释:将HTML代码和<% Java代码 %>结合

3.Jsp指令

  • page指令:用来对页面的某些特征进行描述
<%@ page 属性名1="" 属性名2="" %>
属性名称取值范围描述
import包名,类名指定在JSP页面翻译成的Servlet源文件中导入的包或类。 可以声明多次,一个import可以导多个包,用逗号隔开。 默认导包java.lang;javax.servlet.;javax.servlet.jsp.; javax.servlet.http.*
languagejava指定JSP页面所用的脚本语言
sessiontrue/falsetrue:该Jsp有session内置对象
isErrorPagetrue/false指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,默认情况为false
errorPageJsp相对路径指定一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。
contentType指定当前JSP页面的MIME类型和字符编码
pageEncoding指定页面编码格式
  • include指令:在JSP页面中包含另一个JSP页面
<%@ include file="被包含文件的地址"%>

(1)被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。

(2)除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。

(3)file属性的设置值必须使用相对路径,这里的file属性指定的相对路径是相对于文件,不是相对于页面,一般不以“/”开头

(4)在应用include指令进行文件包含时建议在被包含页面中将,等标签删除。

  • taglib指令:通过taglib指令标识该页面中所使用的标签库
<%@ taglib prefix="指定标签的前缀" uri="标签的uri"%>

4.Jsp动态元素

  • 包含文件元素

**作用:**用于向当前页面引入其他的文件,被引入的文件可以是动态文件,也可以是静态文件

<jsp:include page="URL" flush="true/false"/>
//page:相对路径
//flush:是否将当前页面内容刷新到客户端,默认情况为falsh(同include指令一样)

include指令和jsp:include动态元素的区别

1.include指令中的file属性不可以为表达式,<jsp:include>可以
2.include指令是将被包含的文件原封不动的插入包含页,编译为一个java文件,使用<jsp:include>动作元素包含文件时,当该元素被执行时,程序会将请求转发到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页,继续执行后面的代码。
3.include指令存在变量冲突的问题
  • 请求转发元素

**作用:**可以将当前请求转发到其他Web资源

<jsp:forward page="相对路径"/>
//注意:标签要闭合

5.Jsp隐式对象

名称类型描述
outjavax.servlet.jsp.JspWriter用于页面输出
requestjavax.servlet.http.HttpServletRequest得到用户请求信息
responsejavax.servlet.http.HttpServletResponse服务器向客户端的回应信息
configjavax.servlet.ServletConfig服务器配置,可以取得初始化参数
sessionjavax.servlet.http.HttpSession用来保存用户的信息
applicationjavax.servlet.ServletContext所有用户的共享信息
pagejava.lang.Object指当前页面转换后的Servlet类的实例
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
exceptionjava.lang.Throwable表示JSP页面所发生的异常,在错误页中才起作用
  • out对象
image-20240616114618415

在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。如果想要通过out对象直接写入到Servlet可以使用page指令实现

<%@ page buffer="0kb" %>
  • pageContext对象

1.获得Jsp隐式对象

方法名功能描述
JspWriter getOut()用于获取out隐式对象
Object getPage()用于获取page隐式对象
ServletRequest getRequest()用于获取request隐式对象
ServletResponse getResponse()用于获取response隐式对象
HttpSession getSession()用于获取session隐式对象
Exception getException()用于获取exception隐式对象
ServletConfig getServletConfig()用于获取config隐式对象
ServletContext getServletContext()用于获取application隐式对象

2.域对象相关方法

方法名功能描述
void setAttribute(String name,Object value,int scope)用于设置pageContext对象的属性
Object getAttribute(String name,int scope)用于获取pageContext对象的属性
Object getAttribute(String name)用于获取scope范围为PAGE_SCOPE的属性
void removeAttribute(String name,int scope)用于删除指定范围内名称为name的属性
void removeAttribute(String name)用于删除所有范围内名称为name的属性
Object findAttribute(String name)用于从4个域对象中查找名称为name的属性(依次从page,request,session,application范围找,否则人返回null)
Enumeration getAttribute(int scope)获取某个范围的属性名
scope的作用范围:
pageContext.PAGE_SCOPE:表示页面范围。
pageContext.REQUEST_SCOPE:表示请求范围。
pageContext.SESSION_SCOPE:表示会话范围。
pageContext.APPLICATION_SCOPE:表示Web应用程序范围
  • exception对象

在JSP页面中,经常需要处理一些异常信息,处理异常信息可以通过exception对象实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。需要注意的是,exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage=“true”%>的页面。

三.EL表达式

1.EL表达式基本概念

  • EL表达式语法格式
${表达式}

作用:EL表达式用来获取域对象的值,如果域对象的值不存在的时候会返回空字符串,不会出现空指针异常

  • EL表达式的特点
1EL可以与JavaScript语句结合使用。
(2EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过“+”符号进行连接(如$ {number1+number2}),如果字符串不是数字的话,是不可以连接的会报错
(3EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
(4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
(5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
(6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
(7)在EL中,可以访问JSP的作用域(request、 session、 application 以及page)。
  • EL表达式中的变量就是域属性的名字
  • 点运算符:用来获取与属性的值
${user.name}
  • 方框运算符也可以获取域属性的值
${user["name"]}

注意下面情况只可以用方框运算符

1.如果属性名出现"-","?"等非字母和数字的符号
${user["My-name"]}    
2.如果要访问数组或集合中的元素
${user[index]}
  • empty运算符用于判断对象是否为null或为空
${empty empression}
  • 条件运算符
${A?B:C}
  • 在使用EL表达式时,没有数组下标越界,没有空指针异常,没有字符串拼接

2.EL隐式对象

  • pageContext对象

作用:获取JSP页面的隐式对象,可以使用EL中的pageContext隐式对象

隐式对象名称 返回值类型
pageContext对应于JSP页面中的pageContext对象pageContext
${pageContext.request.characterEncoding}
//相当于
pageContext.getRequest().getCharacterEncoding()
  • cookie对象

作用:获得客户端cookie信息

隐式对象名称 返回值类型
cookie用于获取使用者的cookie值,cookie的类型是MapMap<String, Cookie>
${cookie.cookie名字}<br/>
${cookie.cookie名字cookie名字.name}<br/>
${cookie.cookie名字.value}<br/>
  • initParam对象

作用:获得初始化参数的值

隐式对象名称 返回值类型
initParam表示一个保存了所有Web应用初始化参数的Map对象Map<String, String>
  • 四个域范围对象

作用:用来获取域属性和值

隐式对象名称 返回值类型
pageScope代表page域中用于保存属性的Map对象Map<String, Object>
requestScope代表request域中用于保存属性的Map对象Map<String, Object>
sessionScope代表session域中用于保存属性的Map对象Map<String, Object>
applicationScope代表application域中用于保存属性的Map对象Map<String, Object>
${pageScope.username}
${requestScope.username}
  • 获取参数对象
隐式对象名称 返回值类型
param表示一个保存了所有请求参数的Map对象Map<String, String>
paramValues表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String类型数组Map<String, String[]>
name:${param.name}<br/>
hobby1:${paramValues.hobby[0]}<br/>
hobby2:${paramValues.hobby[1]}<br/>
  • 获取请求头字段对象
隐式对象名称 返回值类型
header表示一个保存了所有http请求头字段的Map对象Map<String, String>
headerValues表示一个保存了所有http请求头字段的Map对象,返回String类型数组Map<String, String[]>
  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 JavaWeb 项目,使用 JSP 技术。 1. 创建一个名为 "HelloWorld" 的 JavaWeb 项目。 2. 在项目中创建一个名为 "index.jsp" 的文件,并添加以下代码: ```html <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <h1>Hello World!</h1> <p>Welcome to my JavaWeb project using JSP.</p> </body> </html> ``` 3. 在项目中创建一个名为 "HelloServlet" 的 Servlet 文件,并添加以下代码: ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; public HelloServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().println("<h1>Hello from Servlet!</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 4. 在 "index.jsp" 文件中添加以下代码,用于调用 "HelloServlet": ```html <a href="HelloServlet">Click here to call the Servlet!</a> ``` 5. 在浏览器中访问 "http://localhost:8080/HelloWorld/index.jsp",即可看到页面上显示 "Hello World!" 和 "Welcome to my JavaWeb project using JSP." 的文字,以及一个链接 "Click here to call the Servlet!"。点击链接后可以看到页面上显示 "Hello from Servlet!" 的文字。 这就是一个简单的 JavaWeb 项目,使用 JSP 技术

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值