Warning : Trying to access array offset on value of type bool in
/www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/inc/theme_plus.php on line
286
一,JSP的底层原理
JSP的基本概念:JSP是一种动态模板引擎,相比较于静态模板引擎,它是静态代码和java代码段的组合体,它需要编译和代码解析
含义:JSP本质上是一个Servlet,它使用了Servlet的内置对象和处理逻辑,相比于Servlet ,JSP的主要功能是展示数据,而Servlet是处理业务逻辑
JSP的运行实现过程:① JSP文件 ---> ② Tomcat的Jasper引擎(JSP引擎)编译成.java文件 ---> ③ java编译器再把.java文件编译成.class字节码文件 ---> ④ JVM执行字节码文件 ---> ⑤ HTML网页文件
一,JSP的底层代码解析
JSP编译成java文件后的源码结构:以index.jsp为例
package org.apache.jsp;
//导入Servlet的一系列包
import javax.servlet.*a'a;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.*;
//类名和jsp的名称一致,它继承了HttpJspBase,实现了JspSourceDependent和JspSourceImports
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
//实例化JSP的Factory的工厂
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
//依赖源文件名列表
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
//依赖包的set集合
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
//依赖类的class的set集合
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
//el的表达式工厂
private volatile javax.el.ExpressionFactory _el_expressionfactory;
//tomcat的事务管理
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
//返回当前页有源依赖项的文件名列表(这是实现runtime.JspSourceDependent)后需要实现的方法
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
//获取PackageImports对象
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
//获取ClassImports对象
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
//获取_getExpressionFactory的el工厂
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
//获取tomcat的InstanceManger引擎对象
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
//_jsp的init初始化方法
public void _jspInit() {
}
//_jsp的销毁方法
public void _jspDestroy() {
}
//_jsp的Service的逻辑处理方法(所有的java代码和EL表达式,html代码都在这个方法中实现),形参request,response,exception
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
//六个局部变量
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
//分别是out和context,在try中会分别等于out和context
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
//为变量进行实例化,和页面基本属性进行定义
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
//打印jsp中的hmtl代码
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>$Title$</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" ");
out.write("\n");
out.write(" <h1>\n");
out.write(" <p>a = ");
out.print( a);
out.write("</p>\n");
out.write("\n");
out.write(" </h1>\n");
out.write(" </body>\n");
out.write("</html>\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
一,JSP的6个全局变量
javax.servlet.jsp.JspFactory _jspxFactory:public抽象类JspFactory扩展了java.lang.ObjectJspFactory是一个抽象类,它定义了许多在运行时JSP页面可用的工厂方法,用于创建“用于支持JSP实现的各种接口和类的creatinq实例”。一个符合要求的JSP引擎实现将在初始化期间实例化这个类的一个依赖于实现的子类,并通过静态setDefaultFactory()方法请求用这个类创建的实例,使其可被JSP实现类全局使用。
java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants:依赖源文件名列表。
java.util.Set<java.lang.String> _jspx_imports_packages:依赖包的set集合
java.util.Set<java.lang.String> _jspx_imports_classes:依赖类的set集合
javax.el.ExpressionFactory _el_expressionfactory:el表达式工厂
org.apache.tomcat.InstanceManager _jsp_instancemanager:tomcat的jsp事务引擎
1,JspFactory工厂类
工厂类的API:
static JspFactory
getDefaultFactory()
Returns the default factory for this implementation.
abstract JspEngineInfo
getEngineInfo ()
called to get implementation-specific information on the current JSP engine.
abstract PageContext
getPageContext (javax.servlet.Servlet servlet, javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, java.lang.String errorPageURL, boolean needsSession, int buffer, boolean autoflush)
obtains an instance of an implementation dependent javax.servlet.jsp.PageContext abstract class for the calling Servlet and currently pending request and response.
abstract void
releasePageContext (PageContext pc)
called to release a previously allocated PageContext object.
static void
setDefaultFactory (JspFactory deflt)
set the default factory for this implementation.
API:
getDefaultFactory:获取Factory默认工厂对象
getEngineInfo:获取当前JSP引擎的特定实现信息
getPageContext:获取PageContext对象
releasePageContext:释放当前的分配的PageContext对象
setDefaultFactory:设置工厂配置信息
二,jsp的九大内置对象
九大内置对象都在_jspservice方法中,内置对象大多是引入了Servlet中的对象
形参中的三个内置对象:
javax.servlet.http.HttpServletRequest request:Servlet的Request
javax.servlet.http.HttpServletResponse response:Servlet的response
javax.servlet.ServletException:Exception的异常处理对象
局部变量中的六个内置对象:
javax.servlet.jsp.PageContext pageContext:pagecontext是servlet第四大域,也能获取servlet重要对象
javax.servlet.http.HttpSession session:servlet的session对象
javax.servlet.ServletContext application:ServletContext对象
avax.servlet.ServletConfig config:ServletConfig获取servlet配置信息
javax.servlet.jsp.JspWriter out:Jspwriter打印流对象
java.lang.Object page:page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针
JSP中的四大域:
pagecontext:最小域,作用域为当前页面
httpservletrequest:作用域为当前请求的转发
httpservletsession:作用域为当前会话
httpservletcontext:当前应用服务器
一,pageContext
它继承了JspContext,pageContext本身也是一个域对象,但它的域范围太小只适用于当前页面
pageContext作用:
①提供域空间
②获取其他Servlet对象,如Session,Request,ServletConfig……
父类JspContext的方法:
本身方法:
getSession:获取HttpSession对象
getRequest:获取ServletRequest对象
getResponse:获取ServletResponse对象
……
二,session
HttpSession不多说
三,application
application其实是ServletContext对象,不多说因为它们都是Servlet中对象
四,ServletConfig
五,Out
out属于JspWriter
java.lang.Object
java.io.Writer
java.io.Writer
javax.servlet.jsp.JspWriter
javax.servlet.jsp.JspWriter
JspWriter本质上也是java的IO打印流
作用:主要负责将变量值或者其他值打印到页面上
二,JSP的操作
一,JSP的基本操作
一,jsp的注释
JSP注释注释格式:<%--注释内容--%>
其实jsp中也可以使用HTML注释,但他和JSP注释有区别
JSP注释和HTML注释的在JSPER引擎中的区别:HTML会被JSPER引擎编译打印,而JPS注释不会被引擎读取
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<!--哈哈哈-->
<%--jps注释--%>
</body>
</html>
在编译后的Java文件:
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>$Title$</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" <!--哈哈哈-->\n");//HTML注释被读取打印,而JPS注释没有被打印
out.write(" ");
out.write("\n");
out.write(" </body>\n");
out.write("</html>\n");
二,java普通代码段
JPS作为动态网页技术,可以在其中插入Java代码段
标签:<%java代码段%>
代码段的区别内容在编译时会被放入.java文件中_jspService方法中
注意事项:
①代码段中不能放入有权限修饰符和静态的变量(方法内的局部变量不支持权限修饰符)
②代码段内不能定义方法,类,接口等等方法内部不支持的代码段
③多个<%%>修饰的代码段会在同一个方法
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<!--哈哈哈-->
<%--jps注释--%>
<%int a=100;%>//声明一个局部变量
<% System.out.println(a); %>//在另一个<%%>输出之前的局部变量
</body>
</html>
编译后的java结果:
out.write(' ');
int a=100;//在_jspServlet中声明了a变量
out.write('\n');
out.write(' ');
out.write(' ');
System.out.println(a);//打印a值
三,Java声明代码段
Java声明代码段和普通代码段类似,当生成的位置不同,声明代码段声明在类中,普通代码段产生在_JspService
声明代码段和普通代码段的不同:
①声明代码段可以写权限修饰符和static的变量,它属于成员变量
②可以写方法和内部类
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<!--哈哈哈-->
<%--jps注释--%>
<%!int a=100;%>
<% System.out.println(a); %>//只能声明在方法
</body>
</html>
编译的java文件:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
static int a=100;//声明在类中
……
四,JSP的表达式语句块
表达式语句就是可以把内容打印到网页
格式:<%=变量%>
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%!static int a=100;%>
<h1>
<p>a= <%= a%></p><%--把a结果输出--%>
</h1>
</body>
</html>
网页结构:
java文件:
……
out.write("\n");
out.write(" <h1>\n");
out.write(" <p>a = ");
out.print( a);//底层是直接提供拼接一个print来打印值
out.write("</p>\n");
out.write(" </h1>\n");
……
二,JSP的指令
JSP指令的主要作用是为当前页面做一些基本属性的设置,为页面更简便的使用servlet和java基本语法的操作,提供基本的运行环境
JSP指令按照功能的不同分为三类:
1,page指令(页面指令):对页面进行定义和导包等操作
2,include指令(包含指令):对两jsp页面可以进行整合的指令
3,taglib指令(标签指令):taglib依赖核心标签库JSTL,对页面进行判断,循环操作
<%@ 指令名称 属性名=属性值……>
一,page指令
page主要作用是设置jsp页面的相关信息,如:Jsp的编码集,返回的文件类型,导入java jar包等……
一个Jsp页面可以设置多个page
page指令的格式:<%@ page 属性名=属性值 %>
page指令的常用属性:
①contentType:设置jsp页面的字符编码集和文本类,默认是的文本类型是Text/html,编码集是utf-8
底层:contentType的底层调用的是response.setContentType("text/html;charset=UTF-8")
②pageEncoding:设置字符编码集默认是utf-8,和contentType差不多但它不能设置文本类型,当它 默认是text/html
③import:在Jsp页面中掉用java类,这样在jsp的<%%>中就可以使用其中方法
底层:在编译成java代码后通过import 包路径
④errorPage:设置假如Jsp页面编译报错时要跳转的jsp页面
格式:<%@ page errorPage = “报错后调整的Jsp页面”%>
案例:
<%@ page contentType="text/xml;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@ page errorPage="erroe.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%System.out.println(0/0);%>
</body>
</html>
底层:重要代码,非全部
//JSP的Factory工厂
private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory();
//_jspService方法中的pageContext的成员变量
final javax.servlet.jsp.PageContext pageContext;
//通过jsp工厂(JspFactory)来获取pagecontext对象
pageContext = _jspxFactory.getPageContext(this, request, response,"erroe.jsp", true, 8192, true);//上面有我们设置的错误页面
⑤isErrorpage:声明当前页面是否为错误处理页面,默认为flase不声明
案例:
<%@ page contentType="text/xml;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@ page iserrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%exception.getMessage();%>
</body>
</html>
底层:
//在声明为错误处理页面时,会在_jspService方法中增加Throwable对象,来调用处理异常
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
⑥session:设置是否禁用session,默认是flase不禁用
底层:
//这是jsp通过jsp模板引擎编译后的_jspService方法中的局部变量session,禁用后就不再出现再文件中
javax.servlet.http.HttpSession session = null;
session = pageContext.getSession();
二,EL表达式
简介:
EL的出现主要是方便域中值的获取(以前是通过表达式语句块获取),当不能设置值
JSP2.0开始引入
EL表达式主要是从四大域中获取数据:
pagecontext
request
session
context
EL获取数据的两种写发:
域key.名称:通过.获取
域["名称"]:通过[" "]的形式
一,从四大域中获取数据的先后顺序
EL查找域值依次从小到大,查找数据
例:
<%
wqltest a = new wqltest();
a.setName("王清霖");
a.setAge(20);
session.setAttribute("h","session");
request.setAttribute("h","request");
application.setAttribute("h","application");
%>
${h}
页面输出是:request
二,EL获取Bean对象值
例:
实体类:
package com.WQL;
public class wqltest {
String name;
int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
jsp文件:
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%--导入项目下的包--%>
<%@page import="com.WQL.wqltest"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//实例化wqltest对象
wqltest a = new wqltest();
a.setName("王清霖");
a.setAge(20);
session.setAttribute("h",a);%>
<%--通过两种方法获取--%>
${h.name}
${h["age"]}
</body>
</html>
结果:
三,EL获取数组和List集合
JSP:
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%--导入项目下的包--%>
<%@page import="com.WQL.wqltest"%>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> a = new ArrayList<String>();
a.add("WQL");
a.add("FQ");
session.setAttribute("h",a);%>
${h.get(1)}
${h[1]}
</body>
</html>
结果:
四,EL获取Map集合
例:
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
HashMap<String,String> map = new HashMap<>();
map.put("name","FQ");
map.put("age","18");
session.setAttribute("map",map);
%>
${map.get("name")}
${map["age"]}
</body>
</html>
结果 :
五,EL的内置对象
在EL表达式中除了pageContext其他的全部是map类型
它的内置对象包含了之前说过的9中内置对象,还包括了
1,pageContext
主要功能是获取项目路径:pageContext.request.contextPath
2,param
获取当个参数值,假如是复选框它返回的是数组形式的数据,param就处理不了
例:
1,
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
//提交表单数据导WQL.jsp中
<form action="${pageContext.request.contextPath}/WQL.jsp" method="post">
name:<input type="text" name="name" value="hhhh">
xx: <input type="text" name="password" value="kk">
<input type="submit" value="提交">
</form>
2,
<%@page import="com.WQL.wqltest"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<html>
<head>
<title>Title</title>
</head>
<body>
//接收表单数据,获取其中的参数值
${param.name}
${param.password
}
${pageContext.request.contextPath}
</body>
</html>
结果:
3,ParamValue
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/WQL.jsp" method="post">
name:<input type="text" name="name" value="hhhh"><br>
xx: <input type="text" name="password" value="kk"><br>
爱好:<input type="checkbox" name="a" value="fff">
<input type="checkbox" name="a" value="ggg">
<input type="submit" value="提交">
</form>
<%@page import="com.WQL.wqltest"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${param.name}
${param.password}
${paramValues.a[0]}
${paramValues.a[1]}
</body>
</html>
结果:
4,initparam
获取web定义调度初始化参数
六,自定义标签函数
步骤:
写一个具体操作的class
在tld文件中注册函数
在jsp页面中导入函数
调用函数
重点:注册函数的文件信息,我们可以在Tomcat下找到一个jsp2-example-taglib.tld(一般在Tomcat的路径:apache-tomcat-9.0.37\webapps\examples\WEB-INF\jsp2)
在这个文件中复制文件的前缀:
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
例:自定义一个函数进行大小写转化
实体类:
package com.WQL;
public class ltdwql {
public String lower(String a){
String d=a.toLowerCase();
return d;
}
}
注册:定义my.tld文件
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!--定义标签库信息-->
<!--描述信息-->
<description>A tag library exercising SimpleTag handlers.</description>
<!--标签库版本-->
<tlib-version>1.0</tlib-version>
<!--定义标签库的名称-->
<short-name>mywql</short-name>
<!--url指定义-->
<uri>http://tomcat.apache.org/jsp/el/wql</uri>
<!--注册函数信息-->
<function>
<!--注册的函数名-->
<name>Tolower</name>
<!--实体类-->
<function-class>com.WQL.ltdwql</function-class>
<!--返回值类型 方法名 参数列表(注意:要写全限定类名)-->
<function-signature> java.long.String lower(java.long.String) </function-signature>
</function>
</taglib>
使用:
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%--导入库:url是自己定义的url地址 prefix是库名--%>
<%@ taglib prefix="mywql" uri="http://tomcat.apache.org/jsp/el/wql" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${mywql:Tolower("WQL")}
</body>
</html>
二,JSTL标签库
JSTL是由sun定义规范,apache负责实现的jsp标签库
作用:在jsp标签库中简化java代码的使用,提供jsp的使用效率
JSTL定义了五个常用的标签库:
核心标签库(core):
格式化标签库:主要用于日期,数字的格式化显示
EL函数库:定义了EL的很多函数
SQL操作标签库:完成SQL操作,现在已经被淘汰了,它耦合度高,性能低
XML操作标签库:完成XML操作,对于XML操作,也由java代码完成
JSTL的使用导包:JSTL依赖包下载
jstl包
standard包
注意:需要在web-inf的lib目录下,添加这两个jar包
一,核心标签库
1,c:set标签
功能:
定义变量
为bean对象和map集合赋值
属性:
var:定义变量名
value:要赋的值
scope:将在存放在那个域中
property:主要是为bean对和map集合赋值用到的,property说明是那个属性或者key需要赋值
target:变量和key-value在被存放在那个地方
var和scope主要是定义变量用的
property和target主要是赋值用的
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.WQL.wqltest" %>
<%@ page import="java.util.HashMap" %>
>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义变量--%>
<c:set var="as" value="WQL" scope="session"></c:set>
<%
wqltest a = new wqltest();
HashMap map = new HashMap();
session.setAttribute("wql",a);
session.setAttribute("wql1",map);
%>
<%--为bean对象赋值--%>
<c:set value="FQ" property="name" target="${sessionScope.wql}"/>
<%--为Map赋值--%>
<c:set value="WQL" property="name1" target="${sessionScope.wql1}"/>
变量a:${as}<br>
bean对象:${wql.name}<br>
Map:${wql1.get("name1")}<br>
</body>
</html>
结果:
2,c:removc
在域中删除某个变量
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FQ</title>
</head>
<body>
<%
session.setAttribute("name","WQL");
%>
${name}
<c:remove var="name" scope="session"/>
${name}
</body>
</html>
结果:
3,c:catch
捕获异常并放到一个一个变量中,最后保存在域中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FQ</title>
</head>
<body>
<c:catch var="sd">
<%
System.out.println(0/0);
%>
</c:catch>
${sd.message}
</body>
</html>
结果:
4,c:out
打印域值变量信息,与el表达式差不多,当它有一个好处就是设置默认值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FQ</title>
</head>
<body>
<%
session.setAttribute("name","wql");
%>
<c:out value="${nam}" default="FQ"/>
</body>
</html>
结果:
5,c:if
if判断语句,但他只是单分支,没有else语句
变量:
test:判断条件,为true就执行下面语句
var:定义一个变量,存储判断结果,不常用
scope:设置var定义变量存放的域,不常用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FQ</title>
</head>
<body>
<%
session.setAttribute("name","wql");
%>
<c:if test="${name=='wql'}" var="df" scope="session">
结果Boolean:${df}
执行成功
</c:if>
</body>
</html>
结果:
6,c:choose:
相当于java中swting,它没有属性但有两个子标签,前面的if只能单分支,当choose是多分支判断
子标签:
when:当条件满足时执行标签体语句 ,唯一属性:test
otherwise:当都不满足时执行它的标签体语句
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FQ</title>
</head>
<body>
<%
session.setAttribute("name","wql");
%>
<c:choose>
<c:when test="${name=='wql'}" >
when执行
</c:when>
<c:otherwise >
otherwise执行
</c:otherwise>
</c:choose>
</body>
</html>
结果:
7,c:forEach
java中的for循环
属性:
item:集合对象,通过EL表达式获取
var:定义接收集合单个对象的变量
begin:开始位置
end:结束位置
step:步长
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FQ</title>
</head>
<body>
<%
ArrayList<String> a = new ArrayList<>();
a.add("李四");
a.add("王五");
a.add("赵六");
a.add("曹七");
a.add("贺八");
session.setAttribute("list",a);
%>
<c:forEach items="${list}" var="wql" >
${wql} <br>
</c:forEach>
</body>
</html>
结果:
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109