JSP第七篇【简单标签、应用、DynamicAttribute接口】(二)

简介: 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_BODY,EVAL_BODY等等的变量代表着什么,在什么方法中使用。这样实在是太麻烦了!

自定义标签的应用

既然我们学了简单标签,我们就用简单标签来做开发吧!

防盗链

在讲解request对象的时候,我们讲解过怎么实现防盗链的功能。现在我们使用标签来进行防盗链

模拟下场景:1.jsp页面是海贼王资源,2.jsp页面提示非法盗链,index1.jsp是我的首页。别人想要看我的海贼王资源,就必须通过我的首页点进去看,否则就是非法盗链!

  • 标签处理器的代码
 @Override
    public void doTag() throws JspException, IOException {
        //如果想要做成更加灵活的,就把站点设置和资源设置成标签属性传递进来!
        //等会我们要获取得到request对象,需要使用到JspContext的子类PageContext
        PageContext pageContext = (PageContext) this.getJspContext();
        //获取request对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) pageContext.getRequest();
        //获取到referer
        String referer = httpServletRequest.getHeader("Referer");
        //获取到response对象,等会如果是非法盗链,就重定向别的页面上
        HttpServletResponse httpServletResponse = (HttpServletResponse) pageContext.getResponse();
        //非法盗链!
        if (referer == null || !referer.startsWith("http://localhost:8080/zhongfucheng")) {
            //2.jsp提示了非法盗链!
            httpServletResponse.sendRedirect("/zhongfucheng/2.jsp");
            //不执行页面下面的内容了,保护页面
            throw new SkipPageException();
        }
    }

1.jsp代码:

 <zhongfucheng:Referer/>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    海贼王最新资源
    </body>
    </html>

index1.jsp代码

 <h1>这是首页!</h1>
    <a href="${pageContext.request.contextPath}/1.jsp"> 海贼王最新资源</a>

2.jsp代码

 <body>
    你是非法盗链的!!!!!!
    </body>

第一次我是直接访问1.jsp,Referer是为空的,所以是非法盗链。第二次我是通过从首页点进去看的,所以可以访问1.jsp。效果图:0.gif

if标签

在JSTL中,我们已经使用过了<c:if/>标签了,现在我们学习了自定义标签,可以开发类似于JSTL的if标签了!

既然是if标签,那么就需要编写带属性和带标签体的标签(需要判断是true还是false呀!,通过判断是否为真值来决定是否执行标签体的内容)

  • 标签处理器代码
   public class Demo1 extends SimpleTagSupport {
        //定义一个Boolean类型的变量
        boolean test ;
        @Override
        public void doTag() throws JspException, IOException {
            //获取到代表标签体内容的对象
            JspFragment jspFragment = this.getJspBody();
            //如果为真值才执行标签体的内容
            if (test == true) {
                jspFragment.invoke(null);
            }
        }
        public boolean isTest() {
            return test;
        }
        public void setTest(boolean test) {
            this.test = test;
        }
    }

tld文件的代码

  <tag>
        <name>if</name>
        <tag-class> tag.Demo1</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

本来就没有user这个域对象属性,所以user就是为null42.jpg

  • 将user改成不为null,浏览器就没有输出了

43.jpg

forEach标签

forEach标签最基本的功能:遍历集合、数组

  • 首先,我先写一个可以遍历List集合的标签,可能我们会这样设计
public class Demo2 extends SimpleTagSupport {
    //遍历的是List集合,于是标签的属性就为List
    private List items;
    //遍历出来的对象就用Object存着,因为我们不知道List集合保存的是什么元素
    private Object var;
    @Override
    public void doTag() throws JspException, IOException {
        //获取到迭代器
        Iterator iterator = items.iterator();
        //遍历集合
        while (iterator.hasNext()) {
            //获取到集合的元素
            var = iterator.next();
            //.....var属性代表的就是集合的元素,现在问题来了,好像在标签体内无法获取到这个对象....
            //做到这里完成不下去了....
        }
    }
    public void setItems(List items) {
        this.items = items;
    }
    public void setVar(Object var) {
        this.var = var;
    }
}

上面的思路是正常的,但是做不下去!我们换一个思路呗。上面的问题主要是在标签体获取不到被遍历出来的对象

我们这样做:把var定义成String类型的,如果遍历得到对象了,就设置PageContext的属性,var为关键字,对象为值。在标签体用EL表达式搜索以var为关键字的对象!每遍历出一个对象,就执行一次标签体!

  • 于是就有了以下的代码!
public class Demo1 extends SimpleTagSupport {
    //遍历的是List集合,定义List集合成员变量
    private List items;
    //以var为关键字存储到PageContext
    private String var;
    @Override
    public void doTag() throws JspException, IOException {
        //获取到集合的迭代器
        Iterator iterator = items.iterator();
        //获取到代表标签体内容的对象
        JspFragment jspFragment = this.getJspBody();
        //遍历集合
        while (iterator.hasNext()) {
            Object o = iterator.next();
            //把遍历出来的对象存储到page范围中,关键字为标签的属性var(在标签体中使用EL表达式${var},就能够获取到集合的对象了!)
            this.getJspContext().setAttribute(var, o);
            //每设置了一个属性,我就执行标签体
            jspFragment.invoke(null);
        }
    }
    public void setItems(List items) {
        this.items = items;
    }
    public void setVar(String var) {
        this.var = var;
    }
}
目录
相关文章
|
4月前
|
SQL XML Java
JSP 教程 之 JSP 标准标签库(JSTL) 4
**JSP的JSTL是用于简化Web开发的标签库,包括核心、格式化、SQL、XML和函数5个部分。SQL标签库允许与数据库交互,如设定数据源、执行查询和更新,以及处理参数。例如, `&lt;sql:setDataSource&gt;` 定义数据源, `&lt;sql:query&gt;` 执行查询。通过使用JSTL,开发者能更整洁地处理JSP页面。**
37 8
|
4月前
|
XML SQL Java
JSP 教程 之 JSP 标准标签库(JSTL) 1
JSP的JSTL是用于简化页面逻辑的标签库,涵盖核心、格式化、SQL、XML和函数五大类标签。要安装,下载Apache的JSTL包,将jar文件放入WEB-INF/lib,tld文件复制到WEB-INF,并在web.xml中配置相应的taglib信息。JSTL促进了JSP页面的清洁和结构化。
30 5
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
84 10
|
4月前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
60 7
|
4月前
|
前端开发 小程序 Java
深入解析Java Servlet与JSP:构建高效服务器端应用
【6月更文挑战第23天】Java Servlet和JSP是Web开发的关键技术,用于构建高效服务器端应用。Servlet处理HTTP请求,执行业务逻辑,而JSP专注于动态HTML生成。两者结合,借助MVC架构,实现逻辑与视图分离,提高代码可读性和性能。尽管有新框架出现,Servlet和JSP仍是许多项目的基础。
81 7
|
4月前
|
XML SQL Java
JSP 教程 之 JSP 标准标签库(JSTL) 6
**JSP JSTL 摘要:** JSTL是JSP的标签库,包含核心、格式化、SQL、XML和函数5类标签。它用于执行常见任务,如迭代、条件判断和XML操作。JSTL函数库提供字符串处理函数,如`contains()`, `endsWith()`, `escapeXml()`等,方便XML和HTML处理。通过`&lt;%@ taglib %&gt;`导入,如`fn:trim()`用于去除字符串两端空白。
30 5
|
4月前
|
Java 应用服务中间件 Android开发
完成你的自定义JSP Tag标签-Basic Coustom Tag
完成你的自定义JSP Tag标签-Basic Coustom Tag
26 0
|
5月前
|
前端开发 Java 数据库
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
|
5月前
|
SQL 前端开发 Java
JSP技术详解及其在Web开发中的应用
【1月更文挑战第2天】本文将对JSP(Java Server Pages)技术进行详细的介绍和分析。JSP是一种基于Java的服务器端编程技术,它允许开发者在HTML或XML等文档中直接嵌入Java代码片段,从而动态地生成Web页面内容。本文将首先阐述JSP的基本原理和工作机制,然后讨论其在Web开发中的各种应用场景,包括表单处理、数据库访问、会话管理等,并通过实例代码展示JSP的实际应用。最后,本文将对JSP的优缺点进行评述,并对未来的发展趋势进行展望。
675 10
|
5月前
|
Java
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
66 0