栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet(三)——ServletContext、过滤器、JSP

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet(三)——ServletContext、过滤器、JSP

Servlet(三)——ServletContext、过滤器、JSP 一、ServletContext 1、ServletContext 概述

2、 获取 ServletContext 对象

3、ServletContext 作用 a、 获取项目真实路径

b、获取项目上下文路径

c、全局容器

4、ServletContext 特点

5、以上代码

6、小案例——ServletContext 统计当前项目访问次数

7、作用域总结

二、过滤器 1、过滤器概念

2、过滤器作用

如果设置了过滤器,浏览器发送的所有请求会被过滤器拦截下来,在里面进行一些规则处理;过滤器可以设置很多个,最后到达 Servlet ,然后处理完请求再返回客户端。

3、编写过滤器——实现 Filter 接口


编写过滤器需要先实现 Filter 接口,接着要重写三个方法:


4、小案例——编写一个处理请求乱码的过滤器

以前编写 Servlet 的案例中,经常要处理编码格式,可以编写一个过滤器,每次要处理编码格式时,就调用该过滤器就行。

public class EncodingFilter implements Filter {
    //编码格式
    private String encoding = null;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //在这里读取 filter 的配置,读到编码格式
        //读取 init-param 中的配置参数
        encoding = filterConfig.getInitParameter("encoding");
        if (encoding == null) {
            //说明用户在 web.xml 中没有配置初始化参数
            encoding = "UTF-8";
        }
    }
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //为所有经过 filter 的请求设置编码格式
        servletRequest.setCharacterEncoding(encoding);  //  这里也可以写死 utf-8,就不用写上面那些了。

        //让请求继续向下走,如果不执行下面这行代码,这个请求就卡到这里了。(就是放行的意思)
        //只有继续往下走,才会到达 Servlet,不继续往下走,就不会到达 Servlet
        filterChain.doFilter(servletRequest, servletResponse);
    }
5、过滤器的配置

跟 Servlet 一样,有 xml 配置跟注解配置

a、xml 文件配置

b、注解配置


6、过滤器路径

7、小案例——过滤器实现登录校验

两个文件,一个做登录,一个做过滤:

登录:

@WebServlet(urlPatterns = "/doLogin")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在 doPost 中处理登录请求
        //提取用户传递来的登录参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("zhangsan".equals(username) && "123".equals(password)) {
            //登录成功
            //将用户登录成功的用户名保存到 session 中
            req.getSession().setAttribute("loginUser", username);
            //跳转到 index.html 页面
            resp.sendRedirect("/pf/index.html");
        } else {
            //登录失败
            //回到登录页面
            resp.sendRedirect("/pf/login.html");
        }
    }
}

过滤器:

@WebFilter(urlPatterns = "
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //将当前请求强转为 HttpServletRequest,HttpServletRequest 是 ServletRequest 的子类
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        //获取到当前 session 对象
        HttpSession session = req.getSession();
        //获取当前请求的 url 地址
        String requestURI = req.getRequestURI();
        if (requestURI.contains("/login.html") || requestURI.contains("/doLogin")) {
            //这些地址都不用拦截
            //所以请求直接继续向下走
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //这些地址是需要拦截判断的地址
            //获取当前登录的用户名
            Object loginUser = session.getAttribute("loginUser");
            if (loginUser == null) {
                //说明用户没有登录
                resp.sendRedirect("/pf/login.html");
            } else {
                //说明用户已经登录过了,请求继续向下走
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }

    @Override
    public void destroy() {

    }
}
8、getRequestURI 和 getRequestURL 的区别

9、过滤器链和优先级 a、过滤器链


b、过滤器优先级

三、JSP 1、引言

java开发方式:

现有问题:

2、JSP(Java Server Pages)概念和作用

简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页。

作用:替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)。

3、使用jsp

使用<%= %>标签编写Java代码在页面中打印当前系统时间。

jsp的使用方式跟 Servlet 一样:

4、查看jsp反编译的代码


本质上就是把 Java 和 HTML 代码混合在一起写。

5、jsp 和 Servlet 的区别和实现原理

区别:

实现原理:

6、jsp模板开发脚本(标签语言)

既然能把 Java 和 HTML 代码混合在一起写,肯定有区分两者的方法:

a、<% … %>——普通脚本

普通脚本可以使用所有Java语法,除了自定义方法(因为 jsp 页面编译之后,里面的内容会出现在 _jspService 中;而方法中不可以定义方法)。(注意:脚本与脚本之间不可嵌套,脚本与HTML标签不可嵌套。)

b、<%! … %>——声明脚本


注意:
1、声明脚本声明的变量是全局变量。
2、声明脚本的内容必须在普通脚本<% %>中调用。
3、如果声明脚本中的函数具有返回值,可以使用输出脚本调用<%= %>。

c、<%= … %>——输出脚本


注意:输出脚本可以输出带有返回值的函数,输出脚本中不能加分号 ;

7、小案例——九九乘法表

使用 jsp 写一个 九九乘法表的页面:


    <%
    //这里可以写 Java 代码
        for (int i = 1; i <= 9; i++) {
            //下面标签表示结束 Java 代码的书写,进入到 HTML 标签的书写中
            %>
        
            <%
                for (int j = 1; j <= i; j++) {
                    %>
                
            <%
                }
            %>
        
    <%
        }
    %>
<%=i%>*<%=j%>=<%=i*j%>
8、jsp 注释

JSP注释主要有两个作用:为脚本代码作注释以及HTML内容注释。

例子:

然后查看网页源代码:

再查看反编译之后的代码:

9、jsp 指令

a、page 指令

b、include 指令(静态引入,不建议)


变量冲突,比如A页面有 num 变量,引入B页面,B页面也有 num 变量,这就是变量冲突。

c、taglib 指令

10、动作标签

a、include(jsp:include——动态引入:建议)


b、useBean(一般不使用)


c、setProperty

d、getProperty

e、forward



f、param

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667485.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号