同样可以参考菜鸟笔记。

JSP标签

JSP除了包括以"<%"开头的JSP标记,还包括以"<jsp:"开头的JSP标签。实际上,前者的每种标记都有后者的替代。例如:

  • Java程序片段又可以写成:<jsp:scriptlet>代码片段</jsp:scriptlet>

  • JSP声明又可以写成:<jsp:declaration>代码片段</jsp:declaration>

  • JSP表达式又可以写成:<jsp:expression>JAVA表达式</jsp:expression>

  • 甚至JSP指令都被JSP标签替代了:

    • Page指令:<jsp:directive.page attribute="value" />

    • Include指令:<jsp:directive.include file="相对url地址" />

    • Taglib指令:<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

直观是直观,可以搞两种表示宝宝记不住啊!

JSP动作元素

JSP动作元素就是一组以"<jsp:"开头的JSP标签,在请求处理阶段起作用,可以动态地做一些事情。下面是标准的动作元素:

语法 描述
jsp:include 在页面被请求的时候引入一个文件。
jsp:useBean 寻找或者实例化一个JavaBean。
jsp:setProperty 设置JavaBean的属性。
jsp:getProperty 输出某个JavaBean的属性。
jsp:forward 把请求转到一个新的页面。
jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记。
jsp:element 定义动态XML元素
jsp:attribute 设置动态定义的XML元素属性。
jsp:body 设置动态定义的XML元素内容。
jsp:text 在JSP页面和文档中使用写入文本的模板

具体的解释在下面讲解。

包含

也许你会注意到,前面介绍了JSP指令中的Include指令,表示包含一个文件;后面的JSP动作元素又有一个jsp:include动作,这两者有什么区别?区别就是,Include指令用于静态包含,而include标签用于动态包含

  • 静态包含:在编译源JSP时,把包含的目标文件的所有内容融合进来,然后编译JSP文件。

  • 动态包含:把<jsp:include指令编译成JspRuntimeLibrary.include(request, response, "target.jsp", ...)。执行到这个方法时,再去编译target.jsp,把它编译成独立的Servlet类,然后调用它的service()方法。最后再继续执行源文件的后续代码。

示例:主JSP文件代码如下:

main.jsp is including content.jsp.
<% int var=1; request.setAttribute("username","Tom");
%>
<%@ include file="content.jsp" %> <p>main.jsp is doing something else.

content.jsp文件:

<p>
Output from content.jsp:
<br>
var=<%=var %>
<br>
username=<%=request.getAttribute("username") %>

访问main.jsp会有正常的响应。如果改为动态包含,则浏览器会显示异常:content.jsp的编译有问题,因为var没有被定义。

访问JavaBean

JavaBean我的理解就是一种domain class,特点是有个无参构造函数,以及每个属性都有get和set方法封装。JSP中使用Bean,就可以使HTML与Java代码分离,让JavaBean负责事务处理,可以分离界面与业务,也能够重用业务代码。

下面是一个标准的Bean:

package com.runoob.main;public class TestBean {private String message = "菜鸟教程";public String getMessage() {return(message);}public void setMessage(String message) {this.message = message;}
}

JSP中操作Bean主要用到三个动作元素:

  • <jsp:useBean>. 通过id属性指定变量名,class属性指定Bean的类名,scope属性指定JavaBean对象的存放范围(可选page(默认)、request、session、application)。
    这行代码: <jsp:useBean id="test" class="com.runoob.main.TestBean" /> 实际的处理流程如下:

    • 定义一个名为test的局部变量。

    • 尝试从默认的page范围内读取名为"test"的属性,并赋给test。

    • 如果"test"属性不存在,就通过TestBean类的默认构造方法创建一个对象,并把它存放在page范围内,属性名为"test"。

    也就是等价于以下代码:

    TestBean test = null;
    test = (TestBean) pageContext.getAttribute("test");
    if (test == null) {test = new TestBean();pageContext.setAttribute("test", test);
    }
  • <jsp:getProperty><jsp:setProperty>. 通过前面的id来定位Bean。

最后用一个示例来说明用法:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Bean示例</title>
</head>
<body><h2>Jsp 使用 JavaBean 实例</h2>
<jsp:useBean id="test" class="com.runoob.main.TestBean" /><jsp:setProperty name="test" property="message" value="菜鸟教程..." /><p>输出信息....</p><jsp:getProperty name="test" property="message" /></body>
</html>

过滤器

Web组件常常会做一些相同的工作。比如都要检查客户的IP地址是否在黑名单中。过滤器(Filter)就是为了解决重复编写相同操作代码而产生的,可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。

  • 在服务器的响应发送回客户端之前,处理这些响应。

过滤器接口javax.servlet.Filter定义了三个方法:

方法 描述
void doFilter (ServletRequest, ServletResponse, FilterChain) 完成实际的过滤操作。FilterChain用于访问后续过滤器或Web组件。
void init(FilterConfig filterConfig) Web应用程序启动时,容器会创建Filter的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能。
void destroy() Servlet容器在销毁过滤器实例前调用该方法,释放其占用的资源。

下面是一个IP过滤器的示例:

package mypack;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;public class IPFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 如果客户IP在黑名单里,就直接返回拒绝信息,不再调用后续组件if (!checkRemoteIP(request, response)) {return;}// 把请求转发给后续组件chain.doFilter(requestWrapper, response);}public void destroy() {}private boolean checkRemoteIP(ServletRequest request, ServletResponse response) {String addr = request.getRemoteAddr();if (addr.indexOf(ipblock) == 0) {response.setContentType("text/html;charset=UTF8");PrintWriter out = response.getWriter();out.println("<h1>对不起,你的IP地址有毒!</h1>");out.flush();return false;}return true;}
}

过滤器在web.xml中的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter><filter-name>IPFilter</filter-name><filter-class>mypack.IPFilter</filter-class><init-param><param-name>Site</param-name><param-value>参数值</param-value></init-param>
</filter>
<filter-mapping><filter-name>IPFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
...

也可以配置多个过滤器。如果它们指向的url一致,就是串联的关系,串联顺序就是<filter-mapping>出现的顺序。

Servlet与JSP学习笔记(五) JSP核心(下)相关推荐

  1. JSP学习笔记01 - JSP简介及运行环境配置

    一.什么是JSP 1.jsp简介 JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多 ...

  2. 【JSP学习笔记】JSP session对象的应用 模拟商城购物车

    前言: 下面贴出的实现代码核心部分摘抄了xiufeng大佬的代码 正文 session对象简介: session对象的主要用途也是保存信息,当用户第一次到达网站时,系统为其分配一个session.se ...

  3. Jsp学习笔记——第二天

    Jsp学习打卡 Jsp学习笔记---第二天 Jsp笔记 第二天 一. 复习 二. 动作元素(包含,转发) 1. 包含动作 [重点] 2. 转发动作 [了解] 三. 隐含对象(内置对象) 1. 概念 2 ...

  4. 【学习笔记】JSP学习笔记(上)

    我是灼灼,一只初学Java的大一金渐层. 向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄:追逐过王尔德.王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔:热爱文学的浪潮,白日梦到底却总在现实里清 ...

  5. Javaweb学习笔记(JSP标准标签库)

    Javaweb学习笔记(JSP标准标签库) JSTL入门 安装和测试JSTL JSTL中的Core标签库 < c:out>标签 标签 标签 < c:catch>标签 标签 标签 ...

  6. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  7. 哈工大操作系统学习笔记五——内核级线程实现

    哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...

  8. 华清远见fs4412开发板学习笔记(五)

    fs4412开发板学习笔记(五) 作业1: 输入10个整数,按从小到大的顺序输出(选择排序) 每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的 第一个数交换位置. 5 4 3 2 1 ...

  9. 【K210】K210学习笔记五——串口通信

    [K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...

  10. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

最新文章

  1. 分享几个 SpringBoot 实用的小技巧
  2. 【Linux】4_基本权限ACL的命令(setacl和getacl)
  3. android简单点餐系统_微信点餐和扫码点餐系统能为商家带来什么?
  4. MySQL的source命令不加分号和delimiter的使用
  5. OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)【转】
  6. poythoncode-实战4--读取文本文件,csv文件,存到系统中以大列表方式进行存储
  7. Python中的strip(),lstrip(),rstrip()的用法
  8. 易飞erp系统服务器怎么启动,如何使用易飞ERP系统
  9. 这台计算机上没有安装驱动程序,这台计算机上没有安装‘HP LaserJet Pro M402-403 PLC6'打印机驱动程序,如果不安装...
  10. 解析二分查找时间复杂度
  11. 5.里氏代换原则依赖倒置原则
  12. GLSL——绘制平面图形(二)
  13. 局域网如何共享文件?计算机1通过ip访问计算机2,拿取共享文件。
  14. 归并排序算法分析与实现
  15. C语言%p与%x的区别
  16. leetcode 169(简单)题解:给定一个大小为 *n* 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 *⌊ n/2 ⌋* 的元素。
  17. linux用户解锁pam_tally,Linux使用PAM锁定多次登陆失败的用户(含重置错误次数)...
  18. ubuntu 安装 canon ip1180 打印机(图片打印未解决)
  19. 3.EP4CE10F17的串口设计
  20. JS 制作简易计算机

热门文章

  1. hashMap死循环
  2. windows下的mongodb安装与配置
  3. ES5规范之Object增强
  4. laravel判断HTTP请求是否ajax
  5. MyEclipse连接MySQL时遇到的各种烦人事
  6. Group by优化
  7. 找到所有小于N的素数
  8. 戴尔服务:为企业转型导航
  9. 搜索(DFS)---好友关系的连通分量数目
  10. jQuery 插件 jSlider 图片轮播