JSP

一、JSP的实现原理

JSP中包含HTML和Java代码。

JSP不能直接运行,当把JSP放到tomcat容器中,第一次访问该JSP时,会先把JSP转换(转译)成Java(Servlet)源代码,然后编译成字节码,最后才运行。

过程:JSP---->(转换、转译)—>(Servlet)源代码------->(编译)------>字节码---------> (运行)

如果想看到JSP转换之后的源代码和编译之后的字节码,需要去tomcat的work目录下查看。

注意:JSP页面报错是通过tomcat爆出的,会显示servlet中的错误行号,注意识别。

二、JSP的页面组成
2.1 Java脚本

脚本是指直接在JSP页面中写Java代码,语法:

<%

​ Java代码;

%>

<%
    String str = "hello, world";
	out.println(str);
%>

注意:这些代码会生成在servlet的service方法中。

2.2 声明

声明是指在JSP定义一个属性变量或者定义一个方法。语法:

<%!

变量定义或方法定义;

%>

<%! 
	public String test(){
		return "<h1>Java2002</h1>";
	}
%>
        
<%! String str1 = "hello, Java";%>

注意:声明的变量是当前servlet的属性,声明的方法是当前的servlet的方法。而不是在service方法中。

2.3 表达式

表达式是指在页面上直接简化输出数据的方式。语法:

<%=

​ 变量

%>

<h1><%=str1%></h1>

注意:变量后面不能有分号。这些代码会生成在servlet的service方法中。

2.4 JSP页面注释

JSP注释<%-- 注释内容 --%>

HTML注释

JSP注释不会被编译,更不会发送到客户端。但是HTML注释,会被out.print()方式发送到客户端。

2.5 指令

指令是指在JSP页面进行设置等操作。通常有page、include、taglib指令

page指令

page指令是对页面进行设置。

contentType、language、pageEncoding、import、session。

isErrorPage设置为true时,指定当前页面为错误页面。在错误页面上可以通过exception来得到错误信息。

errorPage设置当前页面如果出错后会跳转到哪个页面(错误页面)。

include指令

表示包含一个页面(JSP、HTML、文件)到当前页面。

属于静态包含。在编译时就会将包含的页面于当前页面组成一个新的源代码进行编译,再运行。语法:

<%@ include file=“index2.jsp”%>

jsp的include动作属于动态包含。会分别编译多个文件,在运行的时候使用include方法将其他页面包含到一起运行。语法:

<jsp:include page=“index2.jsp”></jsp:include>

taglib指令

该指令的作用是用来引入一个标签库到当前页面。语法:

<%@ taglib uri=“标签库的路径” prefix=“前缀”%>

#####2.6 JSP动作

JSP动作指在JSP运行期间的命令。

include动作

见上面include指令。

useBean动作

useBean、setProperty、getProperty一般一起使用。

useBean相当于创建对象并设置到某个作用域

setProperty给对象的某个属性赋值

getProperty获取某个作用域内的某个对象的某个属性的值并显示在页面上

<jsp:useBean id="book1" class="com.qf.day13.entity.Books" scope="session"></jsp:useBean>
<jsp:setProperty name="book1" property="name" value="MySQL从精通到遗忘"></jsp:setProperty>
<jsp:getProperty name="book1" property="name"></jsp:getProperty>

forward动作

forward动作相当于请求转发,在转发过程中,如果需要传递参数到下一个页面,可以使用param动作,下一个页面要接收此参数,可以使用request.getParameter()方法。

<jsp:forward page="index2.jsp">
    <jsp:param name="username" value="zhangsan"></jsp:param>
</jsp:forward>
<%-- index2.jsp --%>
<body>
    <h1>index2</h1>
    <h2><%=request.getParameter("username")%></h2>
</body>
2.7内置对象

内置对象也叫隐式对象,是指在JSP页面上不用定义就可以使用的对象。通常有9个。

作用域对象由小到大:pageContext、request、session、application。

注意:pageContext范围为当前页面。使用getAttribute获取当前范围内的值,findAttribute()方法会在所有的作用域中由小到大查找。

它们都有setAttribute()、getAttribute()、removeAttribute()方法。

输入输出对象:request、response、out

servlet相对对象:config(配置)、page(this,Object类型)

错误对象:exception

注意:只有页面设置为错误页面(page指令中isErrorPage=true)时才可以使用

三、EL表达式

EL表达式全称expression language 表达式语言。

作用是用来获取 作用域内的对象。

语法:${scope.name}:

例如 : ${sessionScope.user.truename}获取session作用域中的user对象中的truename属性,相当于代码:

Users user = (Users)session.getAttribute(“user”);

out.print(user.getTruename());

如果不指定作用域,那么在4个作用域中由小到大查找。

当EL操作数组或集合使用,直接使用[下标],例如:${array[0]}

当EL操作map时,可以使用key的名称,例如:${map.name}

当EL操作对象的属性时,既可以使用点符号,也可以使用[],但是使用[]里面的属性名称必须加引号,单引号和双引号都可以。区别在于,如果[]里面的名称不加引号,表示是一个变量,会去作用域中获取该变量的值。

<%
String str = "username";
request.setAttribute("str", str);
%>
<li>欢迎您,${sessionScope.user[str]}</li>

注意:上面的代码处的[str]表示去request范围内找到str变量的值username,然后去取得user的username属性值显示。如果给str加上引号,则直接去调用user的getStr方法,会直接报错。

EL里面出现运算符时,需要注意

${1+2} 页面显示3

${“1” + 2}页面显示3

${‘1’ + 2}页面显示3

${a+2}表示在作用域里去找a变量的值转换成数字与2相加。

${“a” + 2}表示把字母a转换成数字与2相加(此处报错)

EL中双引号和单引号没区别,也没有拼接字符串一说,只会将两边转换成数字运算。

${5/2}页面显示2.5

${5/20 || 5-1 > 2} 也可以使用 or(||)、and(&&)、lt(<)、gt(>)、le(<=)、ge(>=)、not(!)、eq()之类的关键字

判断是否为空,可以使用empty关键字 ${not empty str}

EL如果要显示字符串,可以直接使用${“hello, world”}

如果要在页面上显示EL,可以把前面的符号用字符串的方式输出即可。例如:KaTeX parse error: Expected '}', got 'EOF' at end of input: {"{"}1+2}

在EL表达式中也有隐式对象,例如:sessionScope等。

四、JSTL

JSTL全称JSP标准标签库(Java Server Pages Standard Tag Library)。

一般与EL配合实现页面逻辑判断、循环、格式化、国际化、sql操作等操作。

分类有core库、fmt库、functions库、sql库、xml库。

使用时先需要两个步骤:

1.导入包。jstl-1.2.jar

2.在页面上使用taglib指令引入需要的标签库。例如:<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

core核心库

常见的用法有if条件标签:

一般用来单次判断。

<c:if test="${i >= 18}">
    <h1>该同学已经成年</h1>
</c:if>

分支判断,类似于if-elseif-else结构或者switch结构。

<c:choose>
    <c:when test="${i < 14}">
        该同学是儿童
    </c:when>
    <c:when test="${i < 18}">
        该同学是少年
    </c:when>
    <c:otherwise>
        该同学已经成年
    </c:otherwise>
</c:choose>

循环标签。

items:要循环的集合,一般从作用域中获取,所以要使用EL。注意

var:循环的每一项的临时变量名

begin:从哪一项开始循环

end:到哪一项循环结束

step:步长

varStatus:循环中的状态,可以获取下标等。

<c:forEach items="${arr}" var="num" begin="2" end="6" step="2" varStatus="s">
    <li>${s.index}--${num}</li>
</c:forEach>

out标签。

用于显示数据,与EL的作用基本相同,区别在于out标签默认不会执行HTML代码,而是以代码的形式显示在页面上。例如:

 <%
	String str = "<h1>hello, world</h1>";
	request.setAttribute("str", str);
%>

${str} // 显示一级标题
<c:out value="${str}"></c:out> //显示代码
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐