过滤器,ServletContext和JSP
1. 过滤器
1.1 放行原则
资源名:
/index
/user/orderDetail
/login/loginServlet
未登录情况下哪些资源可以放行
@WebFilter
\* 项目中所有资源限制
\资源名 限制指定资源名
\资源名\* 限制指定资源名下所有子资源
1.2 编码集过滤器
因为Tomcat服务器在不同的版本中,针对的编码集支持和请求方式支持有区别!!!
使用编码集前置操作,所有请求和响应都针对于目前的Tomcat服务器进行预处理操作。
package com.qfedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebFilter("/*")
public class AFilterEncoding implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String serverInfo = req.getServletContext().getServerInfo();
if (serverInfo.startsWith("Apache Tomcat/8") || serverInfo.startsWith("Apache Tomcat/9")) {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
}
chain.doFilter(req, resp);
}
@Override
public void destroy() {
}
}
2. ServletContext对象【重点】
2.1 ServletContext对象概述
全局对象
代表目前的整个WEB项目。
可以用于保存一定的全局配置文件!!!
在Tomcat服务器启动,加载对应WEB项目中就已经存在,是一个【单例对象】
对应在JSP中
Java Server Page 中 ServletContext ==> Application
2.2 获取ServletContext对象的方式
1. 通过HttpServletRequest获取对应ServletContext对象
ServletContext request.getServletContext();
2. 通过HttpSession对象获取ServletContext对象
ServletContext session.getServletContext();
3. 在 GenericServlet 中实现了getServletContext方法,也就意味着所有目前我们接触的Servlet对象中,都可以通过 this.getServletContext();
2.3 ServletContext对象作用
1. 获取项目真实路径
需要上传和下载文件时
getRealPath(String path);
2. 获取项目名
getContextPath();
3. 设置,获取,删除属性【全局容量】
setAttribute(String name, Object value);
getAttribute(String name);
removeAttribute(String name);
3. JSP 【重点,但是我不希望你以后的是JSP】
3.1 JSP概述
JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP ==> Servlet 程序
通过Tomcat服务器解析和编译之后,会生成对应的.class文件
index.jsp ==> index_jsp.class extends HttpServlet
JSP
JSP表达式
JSP指令
JSP标签
重点 EL表达式 + JSTL表达式 在JSP页面中没有任何的Java代码
3.2 第一个JSP代码
<%@ page import="java.util.ArrayList" %>
<%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 16:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%-- 注释不推荐使用 HTML注释,采用JSP注释可以避免没有必要的错误和异常 --%>
<h1>JSP页面</h1>
<%
ArrayList<String> list = new ArrayList<>();
list.add("测试1");
list.add("测试2");
list.add("测试3");
list.add("测试4");
list.add("测试5");
for (String s : list) {
out.append("<h1>" + s + "</h1>");
}
%>
</body>
</html>
3.3 JSP ==> Java文件 ==> .class文件
JSP文件通过Tomcat解析可以得到对应的Java文件
test.jsp ==> test_jsp.java
生成的原码中存在以下一行代码
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
HttpJspBase ==> Apache原码中是继承 extends HttpServlet
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage
JSP就是就是融合了HTML JS CSS的一个Java Servlet程序
生成的临时文件路径
C:\Users\53431\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_41_Day41_WEB_GL\work\Catalina\localhost\Day41\org\apache\jsp
3.4 JSP脚本
3.4.1 普通脚本
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 16:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>01-script</title>
</head>
<body>
<%-- <% Java代码 %> --%>
<%
HashMap<String, String> map = new HashMap<>();
map.put("锤石", "XXXXX");
map.put("维鲁斯", "惩戒之箭");
System.out.println(map);
out.append(map.toString());
%>
</body>
</html>
3.4.2 声明脚本
<%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 16:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>声明脚本</title>
</head>
<body>
<%-- <%! 数据类型声明 方法声明 %> --%>
<%! int i = 10; %>
<%! double num = 10.5; %>
<%!
public void test(int i) {
System.out.println("方法声明:" + i);
}
%>
<%
System.out.println(i);
out.append(i + "");
System.out.println(num);
out.append(num + "");
test(10);
%>
</body>
</html>
3.4.3 输出脚本
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 17:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>输出脚本</title>
</head>
<body>
<%--<%=%>--%>
<%!
int i = 10;
%>
<%
ArrayList<String> list = new ArrayList<>();
list.add("昊狗");
list.add("狗昊");
list.add("昊狗狗");
list.add("狗昊昊");
list.add("昊昊狗狗");
%>
<%-- 输出脚本 ==> out.append(内容) --%>
<h1><%=i%>
</h1>
<h1><%=list.get(0)%>
</h1>
<h1><%=list.get(1)%>
</h1>
<h1><%=list.get(2)%>
</h1>
<h1><%=list.get(3)%>
</h1>
<h1><%=list.get(4)%>
</h1>
</body>
</html>
3.5 JSP指令
3.5.1 Page指令
指令 | 功能 |
---|
contentType | 整个页面内容后期会考虑使用MIME格式 |
pageEncoding | 当前页面编码集 |
session | 默认为true,开始session对象,如果为false,关闭session |
isELIgnored | 当前页面是否支持EL表达式,默认支持 |
errorPage | 当前发送错误之后的指定错误页面 |
isErrorPage | 是否为错误页面,默认为false,如果为true,当时JSP页面可以使用exception对象 |
3.5.2 include指令
<%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 17:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>include页面</title>
</head>
<body>
<%@include file="02-header.jsp"%>
<h1>假装我是一张RTX3090</h1>
<%@include file="02-bot.jsp"%>
</body>
</html>
3.5.3 taglib指令
<%--
可以导入JSTL表达式
--%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 17:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- JSTL 表达式 --%>
<c:forEach begin="" step="" end="" items="" var=" " varStatus=""></c:forEach>
<c:choose>
<c:when test="">
</c:when>
</c:choose>
<c:if test=""></c:if>
</body>
</html>
3.6 内置对象
内置对象 | 对应的Servlet内容 |
---|
application | ServletContext对象,是整个WEB项目域对象 |
session | HttpSession,服务器保存的Session信息,同时也是一个域对象 |
request | HttpServletRequet对象,也是一个域对象 |
pageContext | 表示当前整个JSP页面的域对象 |
page | this关键字 |
response | HttpServletResponse响应对象 |
out | JspWriter==> PrintWriter通过HttpServletResponse对象获取向前端页面输出数据的类对象 |
exception | 异常对象,一般用于JSP错误页面使用,需要在page指定中,指定当前页面就是对应的错误页面,才可以使用。指定跳转对应404和500页面 |
3.7 四大域对象
核心方法:
setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
pageContext带有一定的特殊方法,SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.PAGE_SCOPE
PageContext.APPLICATION_SCOPE
<%--
Created by IntelliJ IDEA.
User: Anonymous
Date: 2020/9/8
Time: 20:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>02-域对象1</title>
</head>
<body>
<%
// application.setAttribute("msg", "路见不平一声吼");
// session.setAttribute("msg", "大哥没有男朋友");
// request.setAttribute("msg", "两只黄鹂鸣翠柳");
// pageContext.setAttribute("msg", "狗昊是个单身狗");
pageContext.setAttribute("msg", "翻车磊被罚了20块钱", PageContext.REQUEST_SCOPE);
%>
<h1><%=application.getAttribute("msg")%></h1>
<h1><%=session.getAttribute("msg")%></h1>
<h1><%=request.getAttribute("msg")%></h1>
<h1><%=pageContext.getAttribute("msg")%></h1>
</body>
</html>