1.JSP的指令
-
指令的作用:指导JSP的翻译引擎如何工作(指导当前的JSP翻译引擎如何翻译JSP文件。)
指令包括哪些呢?
-
include指令:包含指令,在JSP中完成静态包含,很少用了。
-
taglib指令:标签库指令,是jsp的一套外部标签(foreach,if等等)
-
page指令:设置jsp的一些属性,编码,格式等等
关于page指令当中都有哪些常用的属性呢?
1.<%@page session="true|false" %>
<%@page session=true%>代表启动session,默认启用, jsp本身就是一个servlet,会自己创建session在内的九大对象。设置为false的时候不能使用session
2.<%@page contentType="text/json" %>
用来设置格式,也可以同时设置字符集
<%@page contentType="text/json;charset=UTF-8" %>
3.<%@page pageEncoding="UTF-8" %>
用于专门的设置字符集
4.<%@page import="java.util.List, java.util.Date, java.util.ArrayList" %>
<%@page import="java.util.*" %>
import语句,导包。
5.<%@page errorPage="/error.jsp" %>
用于设置本jsp页面出错之后跳转到的页面
6.<%@page isErrorPage="true" %>
表示启用JSP九大内置对象之一:exception,默认不启动,启动之后可以使用该对象在jsp页面抛出异常。
7.<%@ page isELIgnored="true" %>用于忽略el表达式
JSP的九大内置对象
四个域:从小到大
-
jakarta.servlet.jsp.PageContext pageContext 页面作用域
-
jakarta.servlet.http.HttpServletRequest request 请求作用域
-
jakarta.servlet.http.HttpSession session 会话作用域
-
jakarta.servlet.ServletContext application 应用作用域
两个输出流
-
jakarta.servlet.jsp.JspWriter out (负责输出)
-
jakarta.servlet.http.HttpServletResponse response (负责响应)
三个其他
-
java.lang.Throwable exception
-
jakarta.servlet.ServletConfig config
-
java.lang.Object page (其实是this,当前的servlet对象)
2.EL表达式
从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。这就是EL表达式的功效。三大功效:
第一功效:从某个域中取数据。
第二功效:将取出的数据转成字符串。
第三功效:将字符串输出到浏览器。
使用方法
request.setAttribute("userObj", user);存放一个对象
${userObj}
等同于java代码:<%=request.getAttribute("userObj")%>
${"userObj"}会直接输出userobj这个字符串
${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
只要有get方法就可以使用,哪怕没有这个字段。一个点表示调用这个对象的get方法。
el表达式有四个域,不标明的时候优先从小范围中读取数据。
-
pageContext < request < session < application
EL表达式中有四个隐含的隐式的范围:
-
pageScope 对应的是 pageContext范围。
-
requestScope 对应的是 request范围。
-
sessionScope 对应的是 session范围。
-
applicationScope 对应的是 application范围。
EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。(看不见)
request.setAttribute("abc.def", "zhangsan");
${requestScope.abc.def} 这样是无法取值的。
应该这样:${requestScope["abc.def"]}
EL表达式,怎么从Map集合,数组和List集合中取数据
-
${map.key}
-
${数组[0]} 指的是String数组
-
${数组[1]}
-
${list[0]} ArryList
通过EL表达式获取应用的根和隐式对象
${pageContext.request.contextPath}
等同于代码<% pageContext.getRequest().getContextPath()%>
因为jsp的隐式对象中没有request,所以需要用pageContext来调用getrequest方法,然后在调用request对象本身有的getContextPath()方法来获取根路径
-
EL表达式中其他的隐式对象:
pageContext 获取根路径, ${pageContext.request.contextPath}
param 直接获取传递到jsp页面的值,就是request.getParameter(“username”)
${param.username}
paramValues,等价于request.getParameterValues()
initParam,获取配置信息this.getServletContext().getInitParameter(),直接获取配置信息
${initParam.name}
EL表达式的运算符
-
算术运算符
-
+、-、*、/、% 只能运算数字,字符串会强转数字,abc之类的出错
-
-
关系运算符
- == eq != > >= < <= 底层调用equals方法
-
逻辑运算符
- ! && || not and or
-
条件运算符
- ? :
-
取值运算符
-
[ ]和.
-
-
empty运算符
- empty运算符的结果是boolean类型
- ${empty param.username}
- ${not empty param.username}
- ${!empty param.password}
3.JSTL标签库
在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。然后将其“Add Lib...”
然后在页面中<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
就可以直接使用了
JSTL标签的原理
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
以上uri后面的路径实际上指向了一个xxx.tld文件。
tld文件实际上是一个xml配置文件。
在tld文件中描述了“标签”和“java类”之间的关系。
以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。
<tag>
<description>对该标签的描述</description>
<name>catch</name> 标签的名字
<tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class> 标签对应的java类。
<body-content>JSP</body-content> 标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式。
<attribute>
<description>
对这个属性的描述
</description>
<name>var</name> 属性名
<required>false</required> false表示该属性不是必须的。true表示该属性是必须的。
<rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。
</attribute>
</tag>
<c:catch var="">
JSP....
</c:catch>
几种常见的用法
<table>
<c:if test="${not empty list}">
<c:forEach items="${list}" var="user" varStatus="a">
<tr><td>
${a.count}:姓名:${user.name} //带序号的数据
${a.count}:性别:${user.sex}
${a.count}:学号:${user.sno}
</td></tr>
</c:forEach>
<c:forEach var="i" begin="1" end="10" step="1">
<tr><td>
输出:${i}</td></tr>//数字循环
</c:forEach>
</c:if>
<tr><td>
<c:choose>//if,else用法
<c:when test="${param.i<10}">
10
</c:when><c:when test="${param.i<20}">
20
</c:when><c:when test="${param.i<30}">
30
</c:when><c:when test="${param.i<40}">
40
</c:when>
</c:choose>
</td></tr>
<tr><td><a href="student/student.jsp">111111</a></td></tr>
</table>
Filter过滤器
-
Filter是过滤器。
-
Filter可以在Servlet这个目标程序执行之前添加代码。也可以在目标Servlet执行之后添加代码。之前之后都可以添加过滤规则。
-
一般情况下,都是在过滤器当中编写公共代码。
用法
-
第一步:编写一个Java类实现一个接口:jarkata.servlet.Filter。并且实现这个接口当中所有的方法。
-
init方法:在Filter对象第一次被创建之后调用,并且只调用一次。
-
doFilter方法:只要用户发送一次请求,则执行一次。发送N次请求,则执行N次。在这个方法中编写过滤规则。
-
destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。
-
第二步:在web.xml文件中对Filter进行配置。这个配置和Servlet很像。(@WebFilter({"*.do"})
可以使用web配置,也可以使用注解配置,web的配置和servlet很像,是filter和filtermapper
-
Servlet对象默认情况下,在服务器启动的时候是不会新建对象的。
-
Filter对象默认情况下,在服务器启动的时候会新建对象。
执行顺序
-
在web.xml文件中进行配置的时候,Filter的执行顺序是什么?
-
依靠filter-mapping标签的配置位置,越靠上优先级越高。
-
-
过滤器的调用顺序,遵循栈数据结构。
-
使用@WebFilter的时候,Filter的执行顺序是怎样的呢?
-
执行顺序是:比较Filter这个类名。
-
比如:FilterA和FilterB,则先执行FilterA。
-
比如:Filter1和Filter2,则先执行Filter1.
-
实例
//过滤器过滤路径的时候是过滤的跳转页面,也就是浏览器上可以访问的路径。不能使用servlet的路径。但是拦截的时候
//不被容许的servlet最后的跳转路径被拦截的时候里面的代码也不会执行
@WebFilter("/*")
public class File implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1= (HttpServletRequest) request;
String path=request1.getServletPath();
String pass= (String) request1.getSession().getAttribute("pass");
System.out.println("开始执行");
if ("/index.jsp".equals(path)||"pass".equals(pass)){
chain.doFilter(request,response);
System.out.println("请求路径是:" + path);
}else {
System.out.println("拦截了"+path);
}
System.out.println("执行结束");
}
@Override
public void destroy() {
}
}
Listener监听器
-
什么是监听器?
-
监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。
-
在Servlet中,所有的监听器接口都是以“Listener”结尾。
-
-
监听器有什么用?
-
监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。
-
特殊的时刻如果想执行这段代码,你需要想到使用对应的监听器。
-
-
Servlet规范中提供了哪些监听器?
-
jakarta.servlet包下:
-
ServletContextListener用于监听ServletContext对象的创建和销毁
-
ServletContextAttributeListener用于监听ServletContext域的添加修改删除
-
ServletRequestListener用于监听Request对象的创建和销毁
-
ServletRequestAttributeListener用于监听Request域的添加修改删除
-
-
jakarta.servlet.http包下:
-
HttpSessionListener用于监听session对象的创建和销毁
-
HttpSessionAttributeListener
-
该监听器需要使用@WebListener注解进行标注。
-
该监听器监听的是什么?是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。
-
-
HttpSessionBindingListener
-
该监听器不需要使用@WebListener进行标注。
-
假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。
-
假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。
-
-
HttpSessionIdListener
-
session的id发生改变的时候,监听器中的唯一一个方法就会被调用。
-
-
HttpSessionActivationListener
-
监听session对象的钝化和活化的。
-
钝化:session对象从内存存储到硬盘文件。
-
活化:从硬盘文件把session恢复到内存。
-
-
-
-
实现一个监听器的步骤:以ServletContextListener为例。
-
第一步:编写一个类实现ServletContextListener接口。并且实现里面的方法。
-
void contextInitialized(ServletContextEvent event) void contextDestroyed(ServletContextEvent event)
-
-
第二步:在web.xml文件中对ServletContextListener进行配置,如下:
-
<listener> <listener-class>com.bjpowernode.javaweb.listener.MyServletContextListener</listener-class> </listener>
-
当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener
-
-
-
注意:所有监听器中的方法都是不需要javaweb程序员调用的,由服务器来负责调用?什么时候被调用呢?
-
当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。
-