jsp 使用了impot还是导不出_javaweb09-JSP

通过学习how2j上的知识记的笔记

JSP

通过Servlet进行整个网站的开发是可以的,不过在servlet中输出html代码,特别是复杂的html代码,会很繁琐。

如果能够直接使用html代码,并在html中写java代码就好了,JSP就可以实现这个功能。

一、Hello JSP

1、新建jsp文件

新建一个动态javaweb项目,命名为JSP,导入servlet-api.jar,然后在web-INF下新建一个NewFile.jsp,写进以下代码

<%@page contentType

然后运行这个动态项目,输入网址http://localhost:8080/JSP/NewFile.jsp,可以看到以下界面

ecf230298f75b09ae4ef7d5d159e7c14.png

2、代码解释

<%@page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" import="java.util.*"%>

<%@page是JSP的指令

contentType="text/html;charset=UTF-8"就相当于response.setContentType("text/html;charset=UTF-8");也就是通知浏览器以UTF-8进行中文解码。

pageEncoding="UTF-8"是jsp的参数,表示如果jsp文件中出现了中文,那这些中文使用UTF-8进行编码。

import="java.util.*"表示jsp文件中调用的java代码需要依赖哪些包,如果需要多个包,中间要用逗号隔开。

<%=new Date().toLocaleString()%>输入当前时间,相当于在servlet中使用response.getWriter().println(new Date().toLocalString());

二、JSP页面元素

1、静态内容,也就是html、css、JavaScript等内容

2、指令<%@ %>,中间是内容,比如<%@page import="java.util.*"%>

3、表达式<%= %>,用于输出一段html

4、<% %>,中间可以写任何java代码

5、声明<%! %>,用来声明任何字段和方法,但不建议这么做。

6、动作<jsp:include page="Filename">,在jsp页面中包含另一个页面

7、注释<%-- --%>

8、<% %>和<%= %>间的关系

比如同样是在网页上输出hell jsp,两种方法的实现不同

<%out.println("hello jsp");%> <%="hello jsp"%>

9、for循环等一些语法练习

<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%--注释:两种输出方式 --%>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>

<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>

<%--for循环输出,只是在控制台上显示--%>
<%
for (String word:words){
	System.out.println(word);
}
%>

<%--for循环输出,网页上显示 --%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>

<%--把words中的内容显示在一个表格中 --%>
<%--先定义表格边框属性 --%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
	<td>
		<%=word %>
	</td>
</tr>
<%} %>
</table>


</body>
</html>

118de13cdb2c81bb04e5ff99f83dc8b5.png

三、jsp include

每个网页下面都有版权声明等信息,而且还很长,比如【Copyright © 2019 w3cschool.cn All Rights Reserved. 】,如果有一万个网页,都是使用的这个版权声明,那么在写每个网页的时候,都需要加上这句版权声明,一旦后续版权声明需要更改,一万个网页都挨个需要更改,维护成本很高。

但是,如果把版权声明弄成一个jsp,直接在网页中include这个jsp,那个只需要更改一次版权声明的jsp其他一万个网页中的内容就全部更改了。

1、建立版权声明的jsp 在动态web项目JSP的WebContent下新建footer.jsp,且写入版权声明代码

<hr>
<p style="text-align:center">copyright@2016
</p>

2、在NewFile.jsp中包含footer.jsp

<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%--注释:两种输出方式 --%>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>

<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>

<%--for循环输出,只是在控制台上显示--%>
<%
for (String word:words){
	System.out.println(word);
}
%>

<%--for循环输出,网页上显示 --%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>

<%--把words中的内容显示在一个表格中 --%>
<%--先定义表格边框属性 --%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
	<td>
		<%=word %>
	</td>
</tr>
<%} %>
</table>

<%@include file="footer.jsp" %>
<jsp:include page="footer.jsp"/>


</body>
</html>

运行项目输入网址http://localhost:8080/JSP/NewFile.jsp,可以看到如下图

2f738e0929f68233622e4644c24dd7d5.png

在程序中可以看到,include有两种方式,分别是指令方式和动作方式

<%@include file="footer.jsp" %> <jsp:include page="footer.jsp"/>

3、指令方式和动作方式区别

jsp执行过程中会转换成*_jsp.java文件

指令方式会把footer.jsp的内容插入到NewFile.jsp中,最后只形成一个NewFile_jsp.java文件

动作方式会形成两个单独的.java文件NewFile_jsp.java和footer_jsp.java,NewFile_jsp.java会在服务器端访问footer_jsp.java,然后把返回的结果嵌入到响应中

4、传参问题

指令方式不存在传参问题,因为最后合并为了一个文件

但是动作方式存在一个访问的步骤,就涉及到了传参问题,

在NewFile的代码中修改一下

<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<%
for (String word:words){
	System.out.println(word);
}
%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
	<td>
		<%=word %>
	</td>
</tr>
<%} %>
</table>

<%@include file="footer.jsp" %>

<%--做出了修改的地方,在包含footer.jsp的同时传出一个参数9999999给footer.jsp --%>
<jsp:include page="footer.jsp">
	<jsp:param name="year" value="9999999"/>
</jsp:include>


</body>
</html>

并在footer.jsp中接收这个参数

<hr>
<p style="text-align:center">copyright@2016<%=request.getParameter("year")%>
</p>

最后运行输入网址http://localhost:8080/JSP/NewFile.jsp,显示如下,可以看到最下面一行多了9999999

e39cfaf8cf8baa57002fe227e1c0f619.png

四、jsp跳转

和Servlet的跳转一样,jsp跳转也分两种方式:服务端跳转、客户端跳转

1、客户端跳转(跳转后显示新网址)

新建一个jump.jsp并输入以下代码

<%
response.sendRedirect("NewFile.jsp");
%>

运行项目输入网址http://localhost:8080/JSP/jump.jsp,可以看到项目跳转到了NewFile.jsp,也可以使用火狐浏览器调试工具,可以看到返回代码是302,证明跳转到了NewFile.jsp

2、服务端跳转(跳转后网址显示不变)

修改jump.jsp程序为如下所示

<%
request.getRequestDispatcher("NewFile.jsp").forward(request, response);
%>

或者使用简化的代码

<jsp:forward page="hello.jsp"/>

JSP cookie

有的时候,我们会遇到这样的情况,输入一次账号密码,接下来一周或者一个月都不需要再次输入就能够登录,这是靠cookie实现的

1、什么是cookie

cookie是浏览器和服务器交互数据的方式,cookie由服务器创建,但是服务器并不保存这个cookie,而是在建立后发送给浏览器,交给浏览器保存在用户本地,下次访问网站的时候,就会把该cookie发送给服务器。

2、创建一个cookie

步骤为:

Cookie c=new Cookie("name","Gareen");创建一个cookie对象,名字是name,值是Gareen
c.setMaxAge(24*60*60);设定cookie保存的时间,单位是s,如果设置为0,那么网页关闭的时候这个cookie就被销毁
c.setPath("/");设置访问什么路径的时候提交cookie,如果是"/"则表示访问任何路径都会提交cookie
response.addCookie(c);通过response把这个cookie保存在本地浏览器中

下面进行实践,新建一个setCookie.jsp文件,写代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
    Cookie c = new Cookie("name", "Gareen");
    c.setMaxAge(60 * 24 * 60);
    c.setPath("/");
    response.addCookie(c);
%>
<%--用来跳转到获取cookie信息界面--%>
<a href="getCookie.jsp">跳转到获取cookie的页面</a>

运行项目,在火狐浏览器中输入网址http://localhost:8080/JSP/setCookie.jsp,可以在调试工具中看到

1aa66ce41bebeaaddfa6523ce23ac871.png

3、获取cookie中的信息

创建getCookie.jsp文件,

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>

<%
Cookie[] cookies = request.getCookies();
if(cookies!=null){
	for (int d=0;d<=cookies.length-1;d++){
		out.print(cookies[d].getName()+" "+cookies[d].getValue()+"<br>");
	}
}
%>

点击刚才页面上的【跳转到获取cookie的页面】,界面如下

92316e3d1f466e4061a5d0435d9e8c60.png

4、尝试建立多个cookie

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
    Cookie c = new Cookie("name", "Gareen");
    c.setMaxAge(60 * 24 * 60);
    c.setPath("/");
    response.addCookie(c);
    
    Cookie c2 = new Cookie("name2", "Gareen");
    c2.setMaxAge(60 * 24 * 60);
    c2.setPath("/");
    response.addCookie(c2);
    
    Cookie c3 = new Cookie("name3", "Gareen");
    c3.setMaxAge(60 * 24 * 60);
    c3.setPath("/");
    response.addCookie(c3);
%>
 
<a href="getCookie.jsp">跳转到获取cookie的页面</a>

现访问http://localhost:8080/JSP/setCookie.jsp,然后获取cookie信息,如

63359479d8e24a4d7423e15a0638b5f4.png

JSP Session

一个服务器,有很多用户访问,每一个用户访问服务器,就会在服务器上建立一个Session,用来存放一个用户从打开浏览器到关闭浏览器的所有操作。

1、新建一个session

新建setSession.jsp文件,内部写入程序,其中session.setAttribute("name","teemo")负责新建一个session,这个session的name是teemo

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
   session.setAttribute("name", "teemo");
%>
 
<a href="getSession.jsp">跳转到获取session的页面</a>

2、获取session的参数

新建getSession.jsp写入代码,其中session.getSession("name")负责获取数据。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
    String name = (String)session.getAttribute("name");
%>
 
session中的name: <%=name%>

输入网址http://localhost:8080/JSP/setSession.jsp,点击【跳转到获取session的页面】,可见获取到了刚才新建的session的name如下

ac76cba834fe1411fa739f1a79e476bc.png

3、Session和Cookie关系

一个服务器上,有多个用户使用自己的浏览器访问服务器,那怎么知道每个用户对应服务器上的哪个session呢,这就用到了cookie,cookie是session的钥匙。

4、如果浏览器禁用了cookie怎么办

有些浏览器禁用了cookie,那么怎么使用session呢?

如果没有cookie,那么服务器就不能获取到jsessionid,那么每次访问服务器,服务器都会新建一个session对象。

f779c404b27b879982fc3dbc85525cda.png

为了解决这个问题,可以在setSession.jsp中用<a href="<%=response.encodeURL("getSession.jsp")%>">跳转到获取session的页面替换掉跳转到获取session的页面

这是因为response.encodeURL()方法会把getSession.jsp这个URL转换成getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8,这样就有了一个jsessionid,提交这个jsessionid到服务器就可以找到对应的session,和session相关的功能就能正常工作了

5、session的有效期

登录一个网站后,短时间内不用重复登录,但是一段时间后仍旧会要求重新登录,这是因为服务端的session一段时间后失效了,这个时间在tomcat中默认为30分钟。可以打开tomcatconfweb.xml文件查看,也可以在文件中修改。

f46d7ec1e6d2fb9fef3dd7ae9e9576ba.png

JSP作用域

JSP有4个作用域,分别是:

pageContext 当前页面
requestContext 一次请求
sessionContext 当前会话
applicationContext 全局,所有用户共享

JSP隐式对象

JSP共有9个隐式对象request、response、out、pageContext、session、application、page、config、exception

其中有些很熟悉了,

request代表请求 response代表响应 out代表输出 pageContext代表当前页面作用域 session代表会话作用域 application代表全局作用域

1、page表示当前对象

page就代表了this

新建test.jsp,输入代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
      
page:<%=page%>
<br>
this:<%=this%>

输入网址http://localhost:8080/JSP/test.jsp,可以看到显示如下:

258c3811acc47dd015dbdfcf3e0bfe19.png

2、config可以获取一些在web.xml中初始化的参数

分为两个步骤:

1)在web.xml配置一些信息,才能在jsp中获取到信息
2)通过config.getInitParameter("database-ip")获取配置信息

新建一个web.xml,并添加以下信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
 
	<servlet>
	    <!-- 把 testconfig.jsp配置为一个 servlet -->
	    <servlet-name>test</servlet-name>
	    <jsp-file>/test.jsp</jsp-file>
	    <!-- 配置初始化参数 -->
	    <init-param>
	        <param-name>database-ip</param-name>
	        <param-value>127.0.0.1</param-value>
	    </init-param>
	</servlet>
<!-- 将路径 test映射到test.jsp -->
	<servlet-mapping>
    	<servlet-name>test</servlet-name>
    	<url-pattern>/test</url-pattern>
	</servlet-mapping>
    
 
</web-app>

这样的话,在test.jsp中就可以获取到初始化参数。test.jsp中程序如下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
      
database-ip:<%=config.getInitParameter("database-ip")%>

输入网址http://localhost:8080/JSP/test,可以获得初始化参数如下:

5caed856f9b544fa349bf418ffcc1a09.png

注意这里的网址后面没有.jsp,如果输入网址http://localhost:8080/JSP/test.jsp是获取不到初始化参数的,如下

dff5d5d4427d35faceb13721bd8f6dcb.png

3、exception

表示异常

新建一个try.jsp和catch.jsp,在try.jsp中写入程序:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="catch.jsp"%>

<% int [] a = new int[10]; a[20]=5; %>

很明显,执行代码会存在索引溢出错误,因此程序指定了一旦出现异常就交给catch.jsp处理

在catch.jsp中写入代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>

<%=exception%>

必须设置isErrorPage="true"才能使用exception

浏览器输入网址http://localhost:8080/JSP/try.jsp,输出界面如下,可以看到输出了索引越界异常。

13b143c4992266fc60217d63b66c661b.png

JSTL

全称JSP Standard Tag Library,使开发人员可以像使用HTML标签那样在JSP开发java功能,JSTL库有core、fmt、sql、i18n

1、导入jar包

新建一个动态web项目test,且新建jsp文件testjstl.jsp。为了在JSP中使用JSTL,需要以引入两个jar包,分别为jstl.jar和standard.jar,下载地址http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/,解压后把jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar 和 jstl.jar 文件拷贝到/WEB-INF/lib/下。

2、set、out、remove

在testjstl.jsp中输入代码,里面涉及到了一些EL表达式,后面会学习到,很简单:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="name" value="${'zhangsan'}" scope="request"/>
通过标签获取name:<c:out value="${name}"/><br>

<c:remove var="name" scope="request"/>
再次通过标签获取name:<c:out value="${name}"></c:out>

</body>
</html>

代码输入后文件可能报错javax.servlet.jsp.JspException cannot be resolved to a type。在网上找的解决方案是在你的项目中加入jsp-api.jar和servlet-api.jar包,这两个包来源于tomcat的libs目录中,但是会出现一个问题,项目打包发布的时候也会将这两个jar打包出去,这时候发布到tomcat中后tomcat可能启动失败,同时你的jar包可能和tomcat中的jar版本不一致等情况。

解决方式:右键你的项目--properties选择Targeted Runtimes,选择你的运行环境,我选择Apache Tomcat v7.0,Apply--OK。

运行后输入网址http://localhost:8080/test/testjstl.jsp结果如下:

3711dea1fc110ffc5ea848dfa04ab0aa.png

3、if else

JSTL通过<c:if test="">进行条件判断,但是JSTL中没有<c:else,所以常用办法是在<c:if的条件里面取反。

配合if使用的还有通过empty判断是否为空,empty可以判断对象是否为null、字符串长度是否为0、集合长度是否为0.

修改testjstl.jsp如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="hp" value="${10}" scope="request"/>

<c:if test="${hp<5}">
<p>这个英雄快要挂了</p>
</c:if>

<c:if test="${!(hp<5)}">
<p>这个英雄还可以抢救</p>
</c:if>

<%
pageContext.setAttribute("武器", null);
pageContext.setAttribute("遗言", "");
pageContext.setAttribute("物品栏", new ArrayList());
%>

<c:if test="${empty 武器}">
<p>没有携带武器</p>
</c:if>

<c:if test="${empty 遗言}">
<p>没有遗言</p>
</c:if>

<c:if test="${!empty 遗言}">
<p>你要好好活下去</p>
</c:if>

<c:if test="${empty 物品栏}">
<p>物品栏为空</p>
</c:if>

</body>
</html>

运行结果为:

80001dd920eca7ee4d2d62d0cea1ec38.png

4、choose标签

虽然JSTL没有提供else标签,但是提供了一个else功能的标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="hp" value="${10}" scope="request"/>

<c:choose>
	<c:when test="${hp<5}">
	这个英雄要挂了
	</c:when>
	
	<c:when test="${!(hp<5)}">
	这个英雄还可以抢救
	</c:when>
</c:choose>

</body>
</html>

ae62b9059aa10c3add7badca0081cd5b.png

5、forEach

JSP中可以使用for循环,但是可读性很差,如果使用JSTL的c:forEach标签可以改善可读性。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
List<String> heros = new ArrayList<String>();
heros.add("塔姆");
heros.add("艾克");
heros.add("巴德");
heros.add("雷克赛");
request.setAttribute("heros", heros);
%>
<%--
items="${heros}" 表示遍历的集合
var="hero" 表示把每一个集合中的元素放在hero上
varStatus="st" 表示遍历的状态 
 --%>
<c:forEach items="${heros}" var="hero" varStatus="st">
<c:out value="${hero}"></c:out>
</c:forEach>

</body>
</html>

遍历结果如下:

10207970b3940ece1aa83567a7cbe6ef.png

6、forTokens拆分字符串

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="heros" value="塔姆,艾克;巴德|雷克赛!卡莉丝塔" />
<c:forTokens items="${heros}" delims=":;|!" var="hero">
    <c:out value="${hero}" /> <br />
</c:forTokens>

</body>
</html>

运行结果如下:

017ca98d82530b84565319c78bbe3820.png

7、fmt:formatNumber格式化数字

<fmt:formatNumber 表示要格式化的数字 minFractionDigits 小数点至少要有的位数 maxFractionDigits 小数点最多能有的位数

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="money" value="888.8" />
<c:set var="pi" value="3.1415926" />
最少两个小数点:
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<br>
最多两个小数点:
<fmt:formatNumber type="number" value="${pi}" maxFractionDigits="2" />
</body>
</html>

8、fmt:formatDate格式化日期

三种格式

<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Date now = new Date();
pageContext.setAttribute("now", now);
%>

完整日期:<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<br>
完整时间:<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<br>
常见格式:<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>

</body>
</html>

45314bcd28f59725dcb1d5d9cf04bbea.png

9、fn

fn标签提供各种实用功能,使用之前首先加入指令:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="name" value="hello jsp fajslkdj hiosdfgldsf"></c:set>

${fn:substring(name,5,25)}

</body>
</html>

ea636d58148b9ef6530f747a91ad40c2.png

EL表达式

使用EL表达式非常简单,但是由于不同的tomcat对EL是否支持是不一样的,因此要在页面上加上一句isELIgnored="false"

1、EL获取值 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="name" value="EL贼好用"></c:set> 通过JSTL方式获取:<c:out value="${name}"></c:out>

通过EL方式获取:${name} </body>

3767d39fca3e1a68df77ba2ef4c8c3ca.png

2、作用域优先级

EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性怎么办? EL会按照从高到低的优先级顺序获取:pageContext>request>session>application

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="name" value="EL贼好用"></c:set>
<c:set var="name" value="${'gareen-pageContext'}" scope="page" />
<c:set var="name" value="${'gareen-request'}" scope="request" />
<c:set var="name" value="${'gareen-session'}" scope="session" />
<c:set var="name" value="${'gareen-application'}" scope="application" />
  
4个作用域都有name,优先获取出来的是 : ${name}
</body>
</html>

3、javaBean

JavaBean的标准 1. 提供无参public的构造方法(默认提供) 2. 每个属性,都有public的getter和setter 3. 如果属性是boolean,那么就对应is和setter方法

package bean;
public class Hero {
    public int id;
    public String name;
    public float hp;
    public int damage;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getHp() {
        return hp;
    }
    public void setHp(float hp) {
        this.hp = hp;
    }
    public int getDamage() {
        return damage;
    }
    public void setDamage(int damage) {
        this.damage = damage;
    }
     
}

获取JavaBean的属性,只需要通过.符号操作就可以了。像这样 ${hero.name} ,就会自动调用getName方法了,如果属性是boolean类型,那么就会自动调用isXXX方法了。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" import="bean.*"%>
  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  
<%
    Hero hero =new Hero();
    hero.setName("盖伦");
    hero.setHp(616);
     
    request.setAttribute("hero", hero);
%>
  
英雄名字 : ${hero.name} <br>
英雄血量 : ${hero.hp}

4、 结合JSTL的<c:forEach

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"  import="java.util.*"%>
  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  
<%
    List<String> heros = new ArrayList<String>();
    heros.add("塔姆");
    heros.add("艾克");
    heros.add("巴德");
    heros.add("雷克赛");
    heros.add("卡莉丝塔");
    request.setAttribute("heros",heros);
%>

<%--jstl foreach迭代 --%>
<c:forEach items="${heros}" var="hero" varStatus="st">
	<c:out value="${hero}"></c:out>
</c:forEach>
<br>

<%-- 结合JSTL的<c:forEach  --%>
<c:forEach items="${heros}" var="hero" varStatus="st">
	${hero}
</c:forEach>

5、取参

可以在网址中赋值,比如输入网址http://localhost:8080/test/testjstl.jsp?name=abc

且程序如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
 
${param.name}

结果会显示abc

6、eq、ne、neq、gt、lt、gte等等

使用eq进行条件判断,大大简化了JSTL中的c:if和c:choose代码

例子中讲的是大于等于,除此之外的其他用法如下:
eq相等 ne、neq不相等,
gt大于, lt小于
gt大于, lt小于
gte、ge大于等于
lte、le 小于等于
not非 mod求模
is [not] div by是否能被某数整除
is [not] even是否为偶数
is [not] odd是否为奇

比如这样:${killNumber ge 10? "超神":"还没超神" }。表示剩余血量>=

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值