Servlet与JSP学习笔记(五) JSP核心(下)
同样可以参考菜鸟笔记。
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核心(下)相关推荐
- JSP学习笔记01 - JSP简介及运行环境配置
一.什么是JSP 1.jsp简介 JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多 ...
- 【JSP学习笔记】JSP session对象的应用 模拟商城购物车
前言: 下面贴出的实现代码核心部分摘抄了xiufeng大佬的代码 正文 session对象简介: session对象的主要用途也是保存信息,当用户第一次到达网站时,系统为其分配一个session.se ...
- Jsp学习笔记——第二天
Jsp学习打卡 Jsp学习笔记---第二天 Jsp笔记 第二天 一. 复习 二. 动作元素(包含,转发) 1. 包含动作 [重点] 2. 转发动作 [了解] 三. 隐含对象(内置对象) 1. 概念 2 ...
- 【学习笔记】JSP学习笔记(上)
我是灼灼,一只初学Java的大一金渐层. 向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄:追逐过王尔德.王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔:热爱文学的浪潮,白日梦到底却总在现实里清 ...
- Javaweb学习笔记(JSP标准标签库)
Javaweb学习笔记(JSP标准标签库) JSTL入门 安装和测试JSTL JSTL中的Core标签库 < c:out>标签 标签 标签 < c:catch>标签 标签 标签 ...
- JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档
POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...
- 哈工大操作系统学习笔记五——内核级线程实现
哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...
- 华清远见fs4412开发板学习笔记(五)
fs4412开发板学习笔记(五) 作业1: 输入10个整数,按从小到大的顺序输出(选择排序) 每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的 第一个数交换位置. 5 4 3 2 1 ...
- 【K210】K210学习笔记五——串口通信
[K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
最新文章
- 分享几个 SpringBoot 实用的小技巧
- 【Linux】4_基本权限ACL的命令(setacl和getacl)
- android简单点餐系统_微信点餐和扫码点餐系统能为商家带来什么?
- MySQL的source命令不加分号和delimiter的使用
- OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)【转】
- poythoncode-实战4--读取文本文件,csv文件,存到系统中以大列表方式进行存储
- Python中的strip(),lstrip(),rstrip()的用法
- 易飞erp系统服务器怎么启动,如何使用易飞ERP系统
- 这台计算机上没有安装驱动程序,这台计算机上没有安装‘HP LaserJet Pro M402-403 PLC6'打印机驱动程序,如果不安装...
- 解析二分查找时间复杂度
- 5.里氏代换原则依赖倒置原则
- GLSL——绘制平面图形(二)
- 局域网如何共享文件?计算机1通过ip访问计算机2,拿取共享文件。
- 归并排序算法分析与实现
- C语言%p与%x的区别
- leetcode 169(简单)题解:给定一个大小为 *n* 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 *⌊ n/2 ⌋* 的元素。
- linux用户解锁pam_tally,Linux使用PAM锁定多次登陆失败的用户(含重置错误次数)...
- ubuntu 安装 canon ip1180 打印机(图片打印未解决)
- 3.EP4CE10F17的串口设计
- JS 制作简易计算机