- 第三方库&第三方平台
lllaa
1.AFNetworking、MJRefresh、SDWebImage、Masonry、MJExtensionMBProgressHUDYYText、YYModel2.友盟分享极光推送神策TalkingData数盟可信ID能帮助APP公司在不同场景下确认设备唯一性,识别修改设备及复用、虚拟机刷量等行为,可以反作弊、防刷单,并通过数字联盟生成的设备ID和客户账户体系的关联,实时有效识别小号恶意注册等
- 深入理解 synchronized 锁
与你久处不厌
Javajava
文章目录一、实现原理对象头Monitor二、synchronized优化1.锁的状态2.锁的升级一、实现原理Java中的每一个对象都可以作为锁。具体表现为以下3种形式。对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。代码块同步:使用monitorenter和monitorexit指令实现。方法同步:使用另
- 单例模式的设计与实现
寒士obj
Java单例模式java
文章目录一、不安全的单例模式二、线程安全的单例模式1.同步方法2.静态内部类3.枚举:最安全的实现方式单例模式可能是我们在开发中用得最多的设计模式之一,但要在多线程环境下正确实现单例模式却不是那么简单。今天我们就来看看如何正确地实现线程安全的单例模式。一、不安全的单例模式在单线程环境下,实现单例模式很简单,但在多线程环境下就不安全了,可能会出现多个线程同时创建实例的情况,这就违背了单例模式的初衷。
- 单例模式7种实现
小李飞飞砖
单例模式java开发语言
单例模式7种实现1.懒汉式(线程不安全)2.懒汉式(线程安全,同步方法)3.懒汉式(线程安全,双重校验锁)4.饿汉式(线程安全)5.静态内部类方式(线程安全)6.枚举方式(本质上是最好的单例实现方式)1.懒汉式(线程不安全)publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSing
- Java面试题及答案最全总结
隔壁老王的代码
java开发语言
最近很多同学在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:多线程、JVM、Spring、MySQL、Redis、Dubbo…等内容,希望对找工作的同学有所帮助。文末有题目答案~Java多线程面试题并发编程三要素?同步方法和同步块哪个是更好的选择?谈谈原子性?哪些使用到了?谈谈可见性?哪些使用到了?谈谈有序性?举一个例子?什么是线程池?线程池有哪些创建方式?
- ios AFNetworking 网络请求框架集成教程
xq9527--
androidios手游sdkiosapp开发ios
前言各位同学大家好,今天是2021年大年初二,我在这里个大家拜个年祝大家在新一年里心想事成万事如意,打上王者各种超神,哈哈哈废话讲完我们正式说下我们今天要讲的是iOS里面AFNetworking网络请求框架的集成,我们正式开始。准备工作安装xcode这个大家可以自己去appstore搜索下载安装即可####和其他语言的对比######安卓在安卓里面我是集成在项目里面的build.gradle里面然
- 多线程安全:核心解决方案全解析
代码的余温
安全java多线程
在多线程环境下保证共享变量的线程安全,需解决原子性、可见性、有序性三大问题。以下是核心解决方案及适用场景:一、同步锁机制(互斥访问)synchronized关键字原理:通过JVM监视器锁(Monitor)确保同一时间仅一个线程访问临界区。示例:publicclassCounter{privateintcount=0;publicsynchronizedvoidincrement(){//同步方法c
- synchronized与Lock深度对比
凉冰不加冰
Java学习java
Java并发编程:synchronized与Lock深度对比基本概念1.1synchronizedsynchronized是Java内置的关键字,属于JVM层面的锁机制。它通过对象监视器(Monitor)实现同步,具有自动获取和释放锁的特性。//同步方法publicsynchronizedvoidsyncMethod(){//代码}//同步代码块publicvoidmethod(){synchro
- LangChain【7】之工具创建和错误处理策略
缘友一世
AgentlangchainAgent开源
文章目录一LangChain自定义工具概述二创建自定义工具的三种方法2.1方法一:@tool装饰器2.1.1同步方法案例2.1.2工具描述方式1:传参2.1.3工具描述方式2:文档字符串2.2方法二:StructuredTool类2.2.1StructuredTool创建自定义工具2.2.2StructuredTool配置信息2.3方法三:BaseTool类三异步工具的实现四工具错误处理策略一La
- TypeScript 定义同步方法
showmethetime
typescriptubuntujavascript
在TypeScript中定义同步方法是一个常见的需求,尤其是在处理不涉及异步操作的情况下。本文将详细介绍如何在TypeScript中定义和使用同步方法,包括代码示例和详细解释。一、定义同步方法在TypeScript中,定义同步方法与JavaScript类似,只是我们可以利用TypeScript的类型系统来提高代码的安全性和可读性。示例一:简单的同步方法我们从一个简单的示例开始,定义一个计算两个数之
- C#中的async与await
UltimateLove
C#
在.NET4.5或者说C#5.0中引入了两个新的关键字:async与await;都说这两个关键字简化了异步编程,那么我们来看看他们到底什么如何工作的~异步与等待异步方法通常会包括一个或者多个await关键字,但是缺少await关键字并不会导致编译器错误;如果异步方法未使用await关键字标记悬挂点,不管异步修饰符如何,那么该异步方法将作为同步方法执行;但编译器将会发出一个警告(warning)。如
- 【Node】Node.Js--fs文件系统模块
时清云
nodenode.jsnode的fs文件系统模块fs文件系统模块fs
文件包含文件形式和目录形式1.获取文件信息状态fs.stat()异步方法fs.stat(path,callback),path表示文件路径;callback是指回调函数,有两个参数:(err,stats),其中stats是fs.stat的实例;fs.statsync()同步方法fs.statsync(path),只接收一个path变量,fs.statSync(path)其实是一个fs.stats的
- C# 中的锁
她说彩礼65万
C#基础知识点c#开发语言
在C#中,实现线程同步和锁定有多种方式。以下是一些常见的锁机制及其详细介绍:1.lock关键字描述:这是最简单且常用的同步方法。lock实际上是对Monitor.Enter和Monitor.Exit的封装,确保即使发生异常也会正确释放锁。使用场景:适用于需要保护共享资源不被多个线程同时访问的场合。示例代码:privatereadonlyobjectlockObject=newobject();pu
- HashMap、Hashtable 和 ConcurrentHashMap
LJianK1
java开发语言
HashMap、Hashtable和ConcurrentHashMap的主要特性进行对比,整理成表格形式,方便你更直观地了解它们的区别:表格复制特性HashMapHashtableConcurrentHashMap线程安全否(单线程安全)是(通过同步方法)是(通过锁分段或CAS)允许键为null是否是(从Java8开始)允许值为null是否是(从Java8开始)锁机制无(单线程性能高)全表锁(每次
- java异步方法转同步_推荐在Java中将同步方法转换为异步方法的更好方法
深刻如此
java异步方法转同步
一个类中有一些同步运行的方法。我希望它们异步运行,第一个想法是包装它,并使用switch枚举确定应调用哪个函数。但是对于每个调用的方法,我都需要包装器类中有一个新方法和一个新的枚举。看起来像这样:publicclassQueuedShowimplementsInterfaceShowAlert,Runnable{privateClassAction{Stringparam1;publicstati
- java将异步方法改为同步方法
小明的爱好
androidjavaandroid
自己新浪博客转移第一种:使用CountDownLatch使用CountDownLatch可以实现同步,它好比计数器,在实例CountDownLatch对象的时候传入数字,每使用一次.countDown()方法计数减1,当数字减到0时,.await()方法后的代码将可以执行,未到0之前将一直阻塞等待。publicstaticsynchronizedint query() throws Interru
- [C#] async和await(腾讯元宝)
阿月浑子2021
C#c#开发语言
在C#中,async和await主要用于编写非阻塞异步代码,提升程序的响应性和资源利用率。执行I/O密集型操作,比如文件读写、网络请求或者数据库访问。这些操作通常会等待外部资源,使用异步可以释放线程池线程,提高应用程序的响应性。比如说,如果一个Web服务器处理很多请求,同步方法会导致线程被阻塞,而异步可以让线程处理其他请求,提升吞吐量。还有UI应用程序,比如WPF或WinForms,长时间运行的任
- C#中的Invoke 和InvokeAsync
BaeSuzyyy
c#开发语言经验分享.netcore
在C#中,Invoke和InvokeAsync是用于异步操作的常见方法,它们通常用于与UI线程进行交互(特别是在WindowsForms或WPF应用中),或者用于处理需要跨线程执行的任务。虽然这两个方法都用于线程间调用,但它们的本质和使用方式有所不同。Invoke和InvokeAsync对比InvokeInvoke是一个同步方法,通常用于跨线程调用。它通常出现在UI线程中,用于从其他线程(如后台线
- Linux 系统时间同步
箭头大人
Linuxlinux运维服务器
Linux系统时间同步目录1查看时间…31.1查看命令…32ntp时间同步方法…42.1安装ntp的server端…42.2客户端操作…53chronyd时间同步方法…63.1.chronyd…63.2.安装chronyd…3/101查看时间1.1查看命令1、查看系统时间[root@centos7-64tmp]#dateTueJul2720:32:02CST20212、修改系统时间date-s“2
- Java设计模式——单例模式
爱吃土豆的程序员
Java设计模式单例模式java设计模式
目录引言1.饿汉式(静态常量)2.懒汉式(非线程安全)3.懒汉式(线程安全,同步方法)4.双重检查锁定5.静态内部类6.枚举结论引言单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。本文将详细介绍六种不同的单例模式实现方法,并通过具体的Java代码示例来展示它们的原理及优缺点。1.饿汉式(静态常量)这种方法在类加载时就完成了初始化,因此避免了线程同步问题,但可能会浪
- Java多线程同步方法wait与notify/notifyAll机制实现方式
DKPT
#Java知识点java学习笔记开发语言面试
一、基本机制与使用条件方法定义与作用wait():当前线程释放锁并进入等待池(WaitSet),等待被其他线程唤醒。notify():唤醒等待池中一个随机线程,使其进入锁池(LockQueue),重新竞争锁。notifyAll():唤醒等待池中所有线程,均进入锁池竞争锁。使用要求必须在同步代码块或方法中调用,否则抛出IllegalMonitorStateException。调用者必须是当前同步块的
- Vue3父子组件数据同步方法
BillKu
vue.jsjavascript前端
在Vue3中,当子组件需要修改父组件传递的数据副本并同步更新时,可以通过以下步骤实现:方法1:使用v-model和计算属性(实时同步)父组件:vueimport{ref}from'vue';constparentData=ref(initialValue);子组件:vueimport{computed}from'vue';constprops=defineProps(['modelValue'])
- 详解 synchronized 关键字【通俗易懂】
在努力的韩小豪
javajavaSE多线程并发编程线程安全同步机制锁
一、前言synchronized关键字是Java实现线程同步的核心机制。用于解决多线程环境下的资源竞争问题,保证线程安全。二、关键作用1.同步方法publicclassCounter{privateintcount=0;//同步方法(实例方法)publicsynchronizedvoidincrement(){count++;}//同步静态方法publicstaticsynchronizedvoi
- Uniapp 中缓存操作指南
尔嵘
《Uniapp-Vue3-TS实战开发:从入门到精通》uni-app
在Uniapp中,你可以使用三种方式操作缓存:同步方法、异步方法和Vuex持久化存储。以下是详细的设置、获取和清除缓存的方法:1.同步方法设置缓存uni.setStorageSync('key','value');//示例uni.setStorageSync('token','abc123');获取缓存constvalue=uni.getStorageSync('key');//示例constto
- 域名 → IP 的解析全过程
依旧风轻
iOSNetworkiOSSQIDNSURLSession
Question使用iOS的网络库(比如AFNetwoking,URLSession,Alamofire)进行请求时,域名具体是怎样被解析为IP地址的?Answer一次常见的URLSession/AFNetworking/Alamofire请求,域名→IP的解析全过程拆成自顶向下6个环节,如下1►应用层:你写的网络库只是“填表”AF.request("https://api.example.com
- 优先级继承协议(Priority Inheritance Protocols)
EmbSW_Guru_Wx
操作系统人工智能开发语言操作系统任务同步优先级翻转优先级继承
本篇文章主要以分享为主,想深入了解Linux的可以访问(Linux-Console.net)自行理解学习。在单个CPU上,许多进程可以在支持多任务的操作系统下同时运行。同步策略用于组织对共享资源的访问。另一方面,当高优先级活动被持有共享资源的低优先级进程阻塞时,就会发生优先级翻转。下面将介绍一种用于解决优先级翻转问题的同步方法——优先级继承协议(PIP)。使用优先级继承协议(PIP),解决了优先级
- Java多线程-多线程面试题整理
骆驼整理说
Java基础多线程线程池线程安全并发编程
目录线程安全什么是线程安全如何解决线程安全问题线程的生命周期线程阻塞问题线程饥饿问题活锁多线程线程和进程多线程的上下文切换并发与并行同步方法和同步块单例模式的线程安全性Synchronized关键字和Lock区别Synchronized关键字和Volatile关键字区别Synchronized锁升级过程ReentrantLock与synchronizedSynchronized的实现原理sleep
- 设计模式之单例模式
沉梦听雨.
#设计模式单例模式设计模式
单例模式单列模式有哪几种?一共有8种:加粗字体代表推荐使用,注意使用饿汉式时需确保会使用到实例,否则可能会造成内存浪费饿汉式-两种饿汉式(静态常量)饿汉式(静态代码块)懒汉式-三种懒汉式(线程不安全)懒汉式(线程安全,同步方法)懒汉式(线程安全,同步代码块)双重检查静态内部类枚举1、饿汉式(静态常量)(可用)步骤如下构造器私有化(防止new)类的内部创建对象向外暴露一个静态的公共方法。getIns
- UWB 多传感器通信的纳秒无线位置和时钟同步方法
TD程序员
UWB技术人工智能网络物联网
一、简介PNT系统在我们的技术社会中发挥着非常重要的作用。特别是在需要高精度的应用中,缺乏满足合适应用需求的解决方案。现有的PNT系统基本上依赖于全球卫星导航系统及相关的增强系统、导航系统和授时系统。全球导航卫星系统(GNSS)是基于卫星的定位、导航和授时(PNT)系统,是最常见和最广泛使用的PNT服务类型。GNSS覆盖面广、精度高、成本相对较低,广泛应用于电力电子、定位、节点协同工作等领域。然而
- 第98节 使用首选项存储数据
川石课堂软件测试
华为鸿蒙鸿蒙系统harmonyos华为云
在HarmonyOS中,ArkTS语言提供了一种便捷的方式来管理应用的偏好设置(preferences),这些设置通常用于存储应用的配置信息、用户偏好等轻量级数据。preferences.getPreferencesSync是一个同步方法,用于从偏好设置中检索数据。下面,我将通过一个详细的示例来展示如何在ArkTS中使用preferences.getPreferencesSync方法。示例背景假设
- java杨辉三角
3213213333332132
java基础
package com.algorithm;
/**
* @Description 杨辉三角
* @author FuJianyong
* 2015-1-22上午10:10:59
*/
public class YangHui {
public static void main(String[] args) {
//初始化二维数组长度
int[][] y
- 《大话重构》之大布局的辛酸历史
白糖_
重构
《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。
背景
公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中
- 电驴链接在线视频播放源码
dubinwei
源码电驴播放器视频ed2k
本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网:
http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。
项目源码:
http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。
项目源码依赖于两个库项目,库项目一链接:
http://git.oschina.
- Javascript中函数的toString()方法
周凡杨
JavaScriptjstoStringfunctionobject
简述
The toString() method returns a string representing the source code of the function.
简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。
句法
function.
- struts处理自定义异常
g21121
struts
很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。
非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。
此处我们用的是非运行时异常,首先定义一个异常LoginException:
/**
* 类描述:登录相
- Linux中find常见用法示例
510888780
linux
Linux中find常见用法示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
- SpringMVC的各种参数绑定方式
Harry642
springMVC绑定表单
1. 基本数据类型(以int为例,其他类似):
Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
}
表单代码:
<form action="saysth.do" method="post&q
- Java 获取Oracle ROWID
aijuans
javaoracle
A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row.
The oracle.sql.ROWID class i
- java获取方法的参数名
antlove
javajdkparametermethodreflect
reflect.ClassInformationUtil.java
package reflect;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAtt
- JAVA正则表达式匹配 查找 替换 提取操作
百合不是茶
java正则表达式替换提取查找
正则表达式的查找;主要是用到String类中的split();
String str;
str.split();方法中传入按照什么规则截取,返回一个String数组
常见的截取规则:
str.split("\\.")按照.来截取
str.
- Java中equals()与hashCode()方法详解
bijian1013
javasetequals()hashCode()
一.equals()方法详解
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I
- 精通Oracle10编程SQL(4)使用SQL语句
bijian1013
oracle数据库plsql
--工资级别表
create table SALGRADE
(
GRADE NUMBER(10),
LOSAL NUMBER(10,2),
HISAL NUMBER(10,2)
)
insert into SALGRADE values(1,0,100);
insert into SALGRADE values(2,100,200);
inser
- 【Nginx二】Nginx作为静态文件HTTP服务器
bit1129
HTTP服务器
Nginx作为静态文件HTTP服务器
在本地系统中创建/data/www目录,存放html文件(包括index.html)
创建/data/images目录,存放imags图片
在主配置文件中添加http指令
http {
server {
listen 80;
server_name
- kafka获得最新partition offset
blackproof
kafkapartitionoffset最新
kafka获得partition下标,需要用到kafka的simpleconsumer
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.
- centos 7安装docker两种方式
ronin47
第一种是采用yum 方式
yum install -y docker
 
- java-60-在O(1)时间删除链表结点
bylijinnan
java
public class DeleteNode_O1_Time {
/**
* Q 60 在O(1)时间删除链表结点
* 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点
*
* Assume the list is:
* head->...->nodeToDelete->mNode->nNode->..
- nginx利用proxy_cache来缓存文件
cfyme
cache
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for ma
- [JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题
comsci
嵌入式
假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:
string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"
定义一个0整数c,然后用这个整数c去
- 如何集成支付宝官方文档
dai_lm
android
官方文档下载地址
https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash
集成的必要条件
1. 需要有自己的Server接收支付宝的消息
2. 需要先制作app,然后提交支付宝审核,通过后才能集成
调试的时候估计会真的扣款,请注意
- 应该在什么时候使用Hadoop
datamachine
hadoop
原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html
存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。
--------------------------------------------万能的分割线--------------------------------
有人问我,“你在大数据和Hado
- 在GridView中对于有外键的字段使用关联模型进行搜索和排序
dcj3sjt126com
yii
在GridView中使用关联模型进行搜索和排序
首先我们有两个模型它们直接有关联:
class Author extends CActiveRecord {
...
}
class Post extends CActiveRecord {
...
function relations() {
return array(
'
- 使用NSString 的格式化大全
dcj3sjt126com
Objective-C
格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c
- 使用activeX插件对象object滚动有重影
蕃薯耀
activeX插件滚动有重影
使用activeX插件对象object滚动有重影 <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#
- SpringMVC4零配置
hanqunfeng
springmvc4
基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。
项目说明如下:
1.db.sql是项目中用到的表,数据库使用的是oracle11g
2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动;
3.默认项目为零配置启动,如果需要更改启动方式,请
- 《开源框架那点事儿16》:缓存相关代码的演变
j2eetop
开源框架
问题引入
上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。
该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。
当然去看相关实现代代码的时候,大致是下面的样子。
[java]
view plain
copy
print
?
public vo
- AngularJS浅析
kvhur
JavaScript
概念
AngularJS is a structural framework for dynamic web apps.
了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm
Directive
扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间
- 架构师之jdk的bug排查(一)---------------split的点号陷阱
nannan408
split
1.前言.
jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.ou
- 如何对10亿数据量级的mongoDB作高效的全表扫描
quentinXXZ
mongodb
本文链接:
http://quentinXXZ.iteye.com/blog/2149440
一、正常情况下,不应该有这种需求
首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。
说一下,
- C语言算法之水仙花数
qiufeihu
c算法
/**
* 水仙花数
*/
#include <stdio.h>
#define N 10
int main()
{
int x,y,z;
for(x=1;x<=N;x++)
for(y=0;y<=N;y++)
for(z=0;z<=N;z++)
if(x*100+y*10+z == x*x*x
- JSP指令
wyzuomumu
jsp
jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %>
常用的三种指令: page,include,taglib
page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%>
include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include