如何深入学习JSP?JSP学习方法|教程

作者:袖梨 2022-11-14

YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.***w3.org/TR/REC-html40/loose.dtd">

YPE web-app>

常规JSP

JSP页面最终会由容器来生成Servlet类的,比如Tomcat容器生成JSP的Servlet类放在work目录里。因此在JSP里可以用很多简化的语法供容器使用,这篇就来整理一下。

JSP语法

scriptlet:
可以在里面写Java代码,如;
指令:
可以在页面转换时向容器给出特殊的指示;它有三个指令:page、include和taglib;而指令又有很多属性如import是page的属性:;
表达式:
表达式会成为out.println()或out.print()的参数,因此等价于;
声明:
是JSP转换成Servlet类的声明,因此可以声明类变量(静态变量)、实例变量、方法等;
注释:
就像Java代码中的注释一样,在把JSP转换成Servlet时会把注释去掉;

隐式对象

JSP的隐式对象不仅仅有out,还有一些其他的:

final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out;
final java.lang.Object page = this;
final javax.servlet.http.HttpServletRequest request;
final javax.servlet.http.HttpServletResponse response;

JSP生成的Servlet

在Tomcat的work目录里我们可以看到由JSP生成的Servlet类,该类继承org.apache.jasper.runtime.HttpJspBase,其中有以下三个方法

_jspInit()
_jspDestroy()
_jspService()

他们分别由父类的init()、destroy()和service()方法调用;前面都带有"_"号,表明我们不能去覆盖他们,下划线的意思是“不要碰我!”.如我用的是Tomcat7,在JSP中:

int i=5;
}%>

会报异常:

org.apache.jasper.JasperException: Unable to compile class for JSP:

初始化JSP

通常,我们会把初始化参数分配给单独的servlet或JSP页面。这个指定的servlet或者JSP页面通过ServletConfig的 getInitParameter方法来读取这些参数。但在某些情况下,需要提供系统范围内的初始化参数,任何servlet或者JSP页面可以通过 ServletContext的getInitParameter方法来读取这些初始化参数。但并不推荐这样做,通常是使用MVC架构,在C中非常合适。

为JSP配置初始化参数是在标记中增加一个元素

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.s***un.com/dtd/web-app_2_3.dtd" >


Archetype Created Web Application

qq
38602359


index

/index.jsp

email
[email protected]




而index.jsp




Hello World!












但输出

Hello World!
null
null
38602359
38602359

可见并为取到JSP的初始化参数,但如果我在web.xml设置就能取到


index
/index.jsp


这是为什么呢?没明白,先留着!

JSP属性

JSP比普通的Servlet多了一个作用域,共有4个作用域

如何深入学习JSP?JSP学习方法|教程

而pageContext的setAttribute和getAttribute都有重载,就多了一个int类型的作用域设置

public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;

只能取到相应的作用域的属性,但pageContext还有一个方法findAttribute,它从最严格的作用域查起,逐步转向不那么严格的作用域,也就是先在请求作用域查找,再查找会话作用域,最后查找应用作用域,只要在一个作用查到就停止。例如



Hello World!



pageContext:

session:

application:

request:

find:




输出

Hello World!
pageContext: null
session: null
application: null
request: kevin
find: kevin

page指令

page指令的属性有import、contentType、isThredSafe、Sessioin、buffer、autoflush、extends、info、errorpage、isErrorPage、language、pageEncoding等。格式:



import属性指定由Servlet导入的package。



isThreadSafe属性控制从JSP页中产生的Servlet是否将实现SingleThreadModel接口。isThreadSafe属性的使用采用以下两种格式之一,前者是缺省的:




session属性控制页面是否参与HTTP会话。
–缺省值true,表明页面将加入一个HTTPsession;
–设置为false,表明不会自动使用任何会话;
buffer属性指明JspWriter的缓冲区大小。buffer属性采用以下两种格式之一:




autoFlush属性配合输出缓冲区 buffer属性使用。控制输出缓冲区在装满时是否应该清除,或者当缓冲区溢出时是否应给出异常处理。
extends属性指定为JSP页生成的Servlet的超类。



info属性定义一个通过getServletInfo方法可以从Servlet中检索到的串。



isErrorpage属性指明当前页是否能充当其他JSP页面的错误页。缺省值为false。
errorpage属性指明如果抛出一个异常,而异常没有被捕获时,此错误处理所指向的URL。
contentType属性指明字符编码和JSP响应的MIME类型。contentType属性的缺省值为text/html ;charset属性的缺省值为 ISO-8859-1




pageEncoding属性定义了页的编码字符。除非指定page指令的contentType属性,否则缺省值为 ISO-8859-1。
language属性指定将要使用的程序设计语言。

无脚本JSP

使用scriptlet、表达式和声明不仅代码混了难以维护,而且不利于页面设计人员和服务器开发人员的分工合作,因此这里介绍EL(表达式语言)、标准动作和JSTL。

标准动作

JSP动作使用格式为:,利用XML语法格式的标记来控制Servlet引擎的行为。这些jsp标签动作元素是在用户请求阶段执行的,这些标准动作元素是内置在jsp文件中的,所以可以直接使用。有以下动作元素

//定义jsp页面使用一个JavaBean实例;
//设置一个JavaBean中的属性值;
//从JavaBean中获取一个属性值;
//在JSP页面包含一个外在文件;
//清空缓冲区把到达的请求转发另一个页面进行处理;

相关文章

精彩推荐