【java初学】过滤器,ServletContext和JSP

过滤器,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和HttpServletResponse
         因为目前情况下从前端页面到后台Tomcat服务器基于的网络传输协议是Http协议
        */
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        /*
        获取Tomcat服务器版本号
            ServletContext是Servlet上下文对象,也是当前整个项目的全局对象
         */
        String serverInfo = req.getServletContext().getServerInfo();

        // 判断Tomcat8和Tomcat9服务器软件
        if (serverInfo.startsWith("Apache Tomcat/8") || serverInfo.startsWith("Apache Tomcat/9")) {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
        }

        // 放行符合要求的Request和Response对象
        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内容
applicationServletContext对象,是整个WEB项目域对象
sessionHttpSession,服务器保存的Session信息,同时也是一个域对象
requestHttpServletRequet对象,也是一个域对象
pageContext表示当前整个JSP页面的域对象
pagethis关键字
responseHttpServletResponse响应对象
outJspWriter==> 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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值