javaweb总结1.0

来源:互联网 发布:linux socket udp监听 编辑:程序博客网 时间:2024/06/06 00:56

JavaWeb总结



1.Html

1)概念:Hyper Text Markup Language超文本标记语言--》页面的骨架,大致的框架---》标签

2)基本标签:字体标签,格式化标签,图片标签,列表标签,超链接标签,表格标签,快标签,表单标签
块级:<div></div>行级:<span></span>
表单:把用户输入的数据提交到后台服务器,是前台页面跟服务器之间的桥梁,是web程序的入口
input表单项标签
type属性:button,checkbox,file(附件框),text,submit,radio,password,reset(重置),hidden(隐藏域)
select下拉列表项标(name属性)--》option子标签组合使用(value属性,selected属性)--》提交过去
textarea文本域
携带的参数格式:?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3

3)内网路径:绝对路径:从盘符开始
      相对路径:./表示同一级目录../表示上一级目录
  外网路径:http://开头

4)get/post请求区别:
1)get请求参数显示在地址栏,而post请求数据在请求体里
2)get请求数据不安全,post相对安全
3)get只适合携带少量数据,post适合大量数据,因此文件上传使用post


2.css

1)概念:Cascading style sheets层叠样式表---》style样式---》美化页面

2)常用的选择器:
元素选择器:将元素标签作为选择器名称;
class选择器:.pClass{}
id选择器:#pId{}
后代选择器(div a{}):某个标签的直接或者间接的子元素
子元素选择器(div>a{}):某个标签的直接的子元素
组合选择器(div,span,p{}):将多个选择器使用逗号连接,都有相同的样式

3)样式的引入:
1、行内样式表:直接在标签的style属性中写样式;
2、页面样式表:将样式写在一组<style></style>标签中
3、外部样式表:需要定义一个css文件,然后使用link标签引入  <link href=""/>


3.javascript

1)概念:一种网络的脚本语言,不能独立运行,必须嵌入其他语言中执行--》浏览器解析执行,不需要编译---》前端大脑,灵魂


2)组成部分:
1.ecmascript:定义javascript的基本语法
1)正则对象:直接量方式/^表达式$/-->使用对象的test(string)方法进行验证,true则表示符合规则
2)数组对象:最常用方式var str = [1,2,3];但长度是可变的,类似java里的集合
方法:join():把数组所有元素放入一个字符串,通过指定的分隔符进行分割,如str.join(",")即表示将数组用逗号拼接成字符串
     reverse():将数组里元素顺序颠倒过来
3)全局函数:
eval(string):将string字符串当成javascript语句执行解析出来
encodeURI(string):编码
decodeURI(string):解码
4)使用js定义一个函数:
function 函数名(){
//函数体


}
var 函数名=function(){
//函数体
}
5)使用js声明对象:
var Person={
"username":"zs",
"password":"123456"
}
2.dom:document object model,文档对象模型,操作浏览器-->dom树(document,element,attribute,text)
1、获取元素对象:document.getElementById(id)   document.getElementsByName(name)  
document.getElementsByClassName(class)  document.getElementsByTagName(标签名)
2、获取属性值以及设置属性值;
document.getElementById(id).value;
document.getElementById(id).value="";
3、操作样式:
document.getElementById(id).style.color="red";
document.getElementById(id).style.fontSize="20px"
4、获取以及修改内容体:
document.getElementById(id).innnerHTML;
document.getElementById(id).innnerHTML="";
5、其他操作:
创建元素:document.createElement("tr");
添加元素:父元素.appendChild(子元素);
移除元素:父元素.removeChild(子元素);

3.bom:browser object model,浏览器对象模型,操作浏览器
1)window.onload=function(){};alert();confirm();
2)location.href=""  //页面跳转
3)一次性定时器和循环定时器(setinterval() settimeout());




4.监听器和过滤器:

监听器:
1、创建类实现对应的接口listener--》随着web应用的启用只初始化一次,随web应用的停止而销毁
2、主要作用:做一些初始化的内容添加工作,设置一些基本内容,并监听程序内一些操作的执行
3、在web.xml中配置监听(绑定/解绑   活化/钝化不需要)

过滤器:Filter
1、创建类实现Filter接口,init(),doFilter(),destroy()-->随着web应用的启用只初始化一次,直到销毁
2、主要目的:过滤字符编码,做一些业务逻辑判断如是否已经登陆,有没有权限
3、在web.xml中配置过滤器,拦截客户端请求,就可以统一设置编码,简化操作
<filter>
   <display-name>UserLoginFilter</display-name>
   <filter-name>UserLoginFilter</filter-name>
   <filter-class>com.itheima.web.filter.UserLoginFilter</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>UserLoginFilter</filter-name>
   <url-pattern>/views/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
 </filter-mapping>


拦截器:interceptor
1、是在面向切面编程中应用的,就是在service或者一个方法前或者方法后调用一个方法,基于java的反射机制动态代理
2、拦截器不实在web.xml中配置,而在比如struts.xml中配置

总结1:
1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,
或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,
如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常
用到的,一些骂人的话)。filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等.
2.监听器:这个东西在c/s模式里面经常用到,他会对特定的事件产生产生一个处理。监听在很多模式下用到。比如说观察者模式,就是一个监听来的。又
比如struts可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
3.java的拦截器 主要是用在插件上,扩展件上比如 hivernate spring struts2等 有点类似面向切片的技术,在用之前先要在配置文件即xml文件里声明一段的那个东西。


拦截器与过滤器的区别 : 
    1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
      2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 
      3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
      4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 
      5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

增强一个类的方法:
类的继承:需要有具体的增强对象和被增强对象,还要能继承如手机--》小米手机--》华为手机,需要不断的继承不断的增强
装饰者模式:增强者与被增强者实现同一个接口,增强者获得被增强者的引用,如手机厂--》生产华为手机--》生产小米手机,组合方式,性能更丰富
动态代理:用一个代理对象隐藏被增强的对象,更加灵活,面向切面编程。


5.Linux常用命令

service iptables stop关闭防火墙
natstat -ano 查看端口网络连接状态
ps -ef 查看所有进程使用情况
kill -9 进程id 杀掉进程
grep -r "close" /home/* | more  在home目录下所有文件中查找,包括close的文件,并分页输出。
vim 三种模式:命令模式、插入模式、编辑模式。使用ESC或i或:来切换模式。
/etc/profile     系统环境变量
R           读         数值表示为4
W           写         数值表示为2
X           可执行     数值表示为1
-rw-rw-r-- 一共十个字符,分成四段。
第一个字符"-"表示普通文件;这个位置还可能会出现"l"链接;"d"表示目录
第二三四个字符"rw-"表示当前所属用户的权限。   所以用数值表示为4+2=6
第五六七个字符"rw-"表示当前所属组的权限。      所以用数值表示为4+2=6
第八九十个字符"r--"表示其他用户权限。              所以用数值表示为2
所以操作此文件的权限用数值表示为662 
更改权限 sudo chmod [u所属用户  g所属组  o其他用户  a所有用户]  [+增加权限  -减少权限]  [r  w  x]   目录名
例如:有一个文件filename,权限为"-rw-r----x" ,将权限值改为"-rwxrw-r-x",用数值表示为765
sudo chmod u+x g+w o+r  filename
上面的例子可以用数值表示
sudo chmod 765 filename

6.jdbc操作:是一种用于执行sql语句的javaAPI,可以为多种数据库提供统一的访问或者说标准接口规范;

基础:
1)注册驱动:Class.forName("com.mysql.jdbc.Driver");
2)获取连接:Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名","username","password");
3)获取执行sql的statement对象:Statement statement=conn.createStatement();为了避免注入漏洞,preparestatement
4)执行查询:ResultSet rs=statement.executeQuery("select * from user");
5)遍历结果集
6)释放资源

高级:池相当于一个容器,装了JDBC与数据库之间的连接对象,这样是获取返还连接,而不是创建连接,而且连接池只初始化一次即可
c3p0和Druid连接池的使用:
创建连接池+配置连接池+从连接池中获取连接
ComboPooledDataSource dataSource=new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/javaweb_day08");
dataSource.setUser("root");
dataSource.setPassword("123456");
Connection conn=dataSource.getConnection();
也可以将连接池配置配置到xml文件中
后期是将连接池对象封装到JdbcUtils工具类中;
DbUtils工具类的使用:是一个工具类,封装了增删改查的操作,大大简化了jdbc编程
1、创建QueryRunner对象:QueryRunner runner=new QueryRunner(JdbcUtils.getDataSource());
2、调用query()或者update();
重点:使用BeanHandler和BeanListHandler来封装查询结果,要求javabean的属性要与表的字段一一对应,javabean必须要有空参构造;




7.tomcat&http

1)软件架构:
C/S架构:client/server--》qq
B/S架构:browser/server--》小游戏网页
2)tomcat的安装文件目录:
bin:命令文件
conf:tomcat配置文件
lib:tomcat所依赖的类库
logs:日志文件
temp:运行时产生的临时文件
webapps:发布的项目都会放在这个目录如项目ssm,web-if中classes类路径
work:jsp动态资源会被编译成java代码存放在这个目录


3)http协议:规定了浏览器和服务器之间的数据传输格式
主要特点:基于请求和响应来实现的,一个请求对应一个响应,必须先有请求后有响应

请求部分:
1.请求行:general,规定了请求方式request method和请求路径request url
2.请求头:request Headers,大部分以一个key一个value形式出现
重点请求头:referer:表示网页的来源,可以做网站统计工作
  user-agent:表示使用浏览器的类型
3.请求体:form data,只有post才有请求体,为post请求提交的参数

响应部分:
1.响应行:响应码status code和响应状态组成
常见的响应码有:200响应成功
      302需要进行重定向操作
      304使用了本地缓存
404请求资源找不到,不存在
500服务器内部错误,通常是业务代码出现错误
2.响应头:response headers大部分以一个key一个value形式出现
常见的响应头有:Location:重定向的路径
refresh:定时刷新
content-disposition:告诉浏览器提示用户下载该资源
3.响应体:告诉浏览器要显示的代码




8.Servlet、HttpServletRequest、HttpServletResponse、Cookie、HttpSession

1)servlet:是运行在web服务器中的小型java程序,接收客户端请求,并响应
执行流程(生命周期):继承Servlet,重写方法:init(servletConfig)--》service(request,response)-->destroy()
一般设置为启动时加载。在web.xml中配置


一般,我们继承HttpServlet,只需要重写doGet()和doPost()方法即可


2)ServletContext:
1.String path=servletContext.getRealPath("/") :获取的项目在服务器中的绝对路径
2.作为域对象存取值:
作用范围:整个web工程,当服务器启动的时候,就会为每个项目创建一个ServletContext对象,当服务器关闭或者项目被移出是才被销毁

3)HttpServletRequest:接收表单提交参数,处理乱码+request域对象存取值--》一次请求,发送请求时创建request,作出响应后销毁request
String username=request.getParameter("username");
post请求乱码:request.setCharacterEncoding("utf-8");
get请求乱码:username=new String(username.getBytes("iso-8859-1"),"utf-8")


4)HttpServletResponse:响应及乱码问题
response.getWriter().write("");
乱码:response.setContentType("text/html;charset=utf-8");
重定向:response.sendRedirect("");


5)会话技术:
1.一次会话:从打开浏览器开始访问网页到关闭浏览器结束称为一次会话


2.Cookie:属于客户端技术,将数据保存在浏览器的内存中,当使用浏览器访问我们网站的资源时,浏览器会通过请求头
将数据带给服务器,服务器通过响应头将Cookie响应给浏览器
1)浏览器保存cookie的大小和数量是有限的
2)默认时长一次会话(会话级别cookie保存浏览器,关闭即销毁),如果想延长时间,cookie.setMaxAge(),变为持久化的cookie,保存到硬盘。
Cookie[]cookies = request.getCookies();
Cookie cookie = new Cookie(name,value);


3.session:属于服务端技术,是web四大域对象之一,服务器为每个浏览器开辟一个独立的空间用来存值,该空间有一个唯一的id
,这样当客户下次使用浏览器访问web程序时,会将这个id去服务区找这块区域的数据。
作用范围:session是基于cookie的,默认有效时长是一次会话(多次请求)。
创建:服务器第一次调用getSession()方法
销毁:1)session过期,默认30min
     2)非正常关闭服务器
     3)手动session.invalidate()
HttpSession session = request.getSession();
session.setAttribute(name,value);

9.jsp,el表达式,jstl表达式

1.jsp:java server page,java服务器页面,一个简化的servlet,是在html中插入了java代码的文件,所以访问jsp需要不知道服务器,不同于html
2.请求转发与重定向的区别:
请求转发:一次请求一次响应,地址栏不会变化,路径不用携带工程名--》能将存到request域中的值斜带过去
重定向:两次请求两次响应,地址栏会发生改变,路径需要携带工程名--》无法继续携带
3.jsp九大内置对象:
request response application pageContext session常用
4.pageContext:表示jsp页面的上下文对象,域对象
作用范围:当前jsp页面
创建和销毁:每次访问jsp页面,离开jsp页面
5.EL表达式:${el表达式}用来jsp页面获取四大域对象中存的数据,执行运算,获取对象等等
常用:获取项目名称${pageContext.request.contextPath}
     获取指定cookie的value值:${cookie.key.value}
6.jstl:jsp标准标签库,是一个jsp标签集合
核心标签:c标签
格式化标签(国际化标签):fmt标签
sql标签:sql标签
。。。
一般jsp页面上使用el+jstl来替换java代码


10.jquery

1)页面加载完成执行:$(function(){函数})
2)dom对象和jquery对象之间的转换:
dom对象 转 jQuery对象  : var div=document.getElementById("d1")     var jDiv=$(div);
document.createElement("<option></option>")    $("<option></option>");
jQuery对象 转 dom对象  : var jDiv=$("#d1");   var div=jDiv.get(0)或者var div=jDiv[0];


3)jquery选择器:
$("#id")id选择器 $(".d1")类选择器
$("div")元素选择器 $("#d1,.d2")组合选择器
$("#d1 a")后代选择器$("#d1>a")子元素选择器
4)jquery对象常用方法:
$("").html("")获取设置标签内容体的所有内容
$("").text()获取标签中的文本
$("").each(function(index){}):遍历
$("").index():表示元素再集合中的索引
$("").val():获取表单元素的value值
$("").attr(""):获取或者设置某个属性值
$("").show():让元素显示出来
$("").hide():让元素隐藏起来
$("").serialize():将表单中的数据以提交表单的形式拼接成一个字符串name=..$name=..
当表单中出现了checkbox时,就会出现一个name对应多个值的情况,所以必须用一个插件完成表单数据提交
$("").serializeJson()


jquery对象又两种形式:$和$(selector),$表示全局的jQuery对象,$(selector)表示的是某个元素的jQuery对象
因此:$.ajax(),$.get(),$.post()函数属于全局函数。$(selector).html()   $(selector).val()函数是针对某个元素对象的函数。

5)jquery事件:jQuery事件允许绑定多个函数,且都有效果;javascript中如果事件绑定多个函数,
只有最后一次绑定的函数会触发。
$("btn").bind("click",function(){
});
$("btn").unbind("click");
$("").hover() $("").toggle()


6)ajax操作:
1.概念:通过后台域服务器进行少量数据交换,ajax可以使网页实现异步更新,即可以不重新加载整个
网页的情况下,对网页某部分进行更新
2.工作原理:核心对象XMLHttpRequest,调用器open(),setRequestHeader(),send()方法完成异步请求
3.$.ajax({
type:"post",
url:"";
data:"",
success:function(msg){...},
dataType:"json"
});
 $.post(url,data,function(data){},"json");
 $.get(url,data,function(data){},"json")
4.跨域:在我们的项目里面访问了不同服务器中的资源,只要访问前后两个资源的协议、主机名、端口号有一个不一致,那么就会出现跨域问题。
dataType:"jsonp"-->则在访问url后面添加参数?callback=?


11.Linux

1.目录结构:
bin:存放二进制执行文件
sbin:superuser即root才能访问的执行文件
etc:系统配置文件
usr:unix shared resources存放系统共享的资源
home:存放用户文件的根目录
root:超级用户目录
tmp:存放各种临时文件
dev:用于存放设备文件
2.常用命令:
cd ..切换到上一层目录
cd / 切换到系统根目录 
cd ~ 切换到用户主目录
ls llls -als --help
tail用于显示文件后几行的内容如tail -20 install.log查看日志文件后20行
cp a.txt b.txt  ?  将a.txt复制为b.txt文件
cp a.txt ../  ?    将a.txt文件复制到上一层目录中
rm删除 rm -f强制删除mv移动
tar –xvf xxx.tar       在当前目录里解压
grep查找文件里符合条件的字符串。
pwd显示当前所在目录
touch创建一个空文件


管道 | 其作用是将一个命令的输出用作另一个命令的输入
ls --help | more  分页查询帮助信息
ps 正在运行的某个进程的状态
ps –ef  查看所有进程
ps –ef | grep ssh 查找某一进程 kill 杀掉某一进程
kill 2868  杀掉2868编号的进程
kill -9 2868  强制杀死进程

su - u1 切换到u1用户,并且将环境也切换到u1用户的环境(推荐使用)
chmod 变更文件或目录的权限。
    chmod 755 a.txt 
  chmod u=rwx,g=rx,o=rx a.txt

ifconfig 查看(修改)ip地址(重启后无效)


service network status 查看网络服务的状态
service network stop 停止网络服务
service network start 启动网络服务
service network restart 重启网络服务
netstat –nltp 查看系统中网络进程的端口监听情况


service iptables status 查看防火墙状态
service iptables stop 关闭防火墙
service iptables start 启动防火墙


12.Redis

1).概念:它是Nosql技术阵营的一员,是一种日志型的key-value数据库,支持多种数据类型的存储来适应不同场景的需求,可以胜任缓存,队列系统的不同角色
具有如下特点:
1.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启即加载使用
2.支持丰富的数据类型存储,如string(字符串),set(集合),list(链表),hash(哈西类型),zset(有序集合)等等类型
3.支持数据的备份


优势: 1.性能极高,读写速度快
    2.丰富的数据类型
3.原子性
4.丰富的特性,可以设置存活时间,通知过期等等


2)常用操作:
string:set/get/mset/mget/append
list:lpush/lrange/llen
hash可以看成stringKey和StringValue的map容器,用来存储对象:
hset/hget/hmset/hmget
set(没有排序的字符串集合):
sadd/scard/sismember/smembers/spop/srem/smove/
sunion并集,unions(并集)、intersections(交集)和differences(差集)
sortedSet有排序的字符串集合:
keys * 获取所有匹配的key
EXPIRE key seconds 该命令为参数中指定的Key设定超时的秒数,在超过该时间后,Key被自动的删除。如果该Key在超时之前被修改,
与该键关联的超时将被移除。 
TTL key获取该键所剩的超时描述。
3)使用jedis操作redis
4)redis数据持久化:将内存存储和持久化存储相结合,可提供数据访问的高效性,又可保存数据存储的安全性
持久化机制: 1)RDB持久化:在指定的时间间隔内将内存中的数据集快照写入磁盘
2)AOF持久化:以日志形式记录服务器所处理的每一个写操作,然后服务器启动后读取该文件重新构建数据库,以保证启动后数据库中数据时完整的
3)同时应用rdb和aof

rdb快照方式:默认情况下,将数据集快照dump到dump.rdb文件中,可以通过redis.conif配置文件修改dump频率,即多少秒dump一次
aof日志文件方式(append only file):
appendfsync  always     #每次有数据修改发生时都会写入AOF文件
appendfsync  everysec  #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync  no         #从不同步。高效但是数据不会被持久化。
比较:
1)rdb数据备份和恢复非常方便,相比于aof,如果数据集很大,rdb启动效率会更高
2)但rdb一旦dump时出现宕机的现象,没来得及写入磁盘的数据将会丢失
3)aof可以带来更高的数据安全性,即数据持久性(可以随时同步)
4)aof读写操作采用append的方式,因此读写过程中,既是出现宕机现象,也不会破坏已经存在的内容
5)aof中如果日志过大,可以自动启用rewrite机制迅速瘦身
6)aof日志型格式清晰,易于理解,很容易用aof文件完成数据的重建
7)但aof文件通常大于rdb文件,运行效率往往慢于rdb


13.Nginx(engine x)

1.概念:是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
2.优点:通过负载均衡实现高并发访问问题解决
3.正向代理:local不能直接访问目标服务器,只能通过一个中间服务器代理proxy去访问目标服务器;
能够隐藏客户端,即服务器不知道是谁再访问;
 反向代理:代理服务器(仅仅一个空壳,没有资源)接受请求,再将请求转发给内部服务网络上的服务器(成千上万个);
能够隐藏服务端,客户端不知道真正访问的是那台服务器。
4.nginx常用命令:
关闭nginx需要在sbin目录下使用:./nginx -s stop 相当于找到nginx进程kill。
退出命令:./nginx -s quit等程序执行完毕后关闭,建议使用此命令。
重新加载配置文件:./nginx -s reload 可以不关闭nginx的情况下更新配置文件.
5.nginx配置:它的配置主要体现在nginx/conf/nginx.conf
对于nginx虚拟机配置主要可以从三个方面入手:
1.ip配置 server_name
2.域名配置 server_name
3.端口配置 listen
反向代理服务器配置:
upstream server_list{----反向代理服务器名称
----随机的访问以下两个服务器,tomcat集群
server localhost:8080 weight=10;---一个服务器
server localhost:8081 weight=20;---二个服务器
}
server{
listen 80; -----服务器监听端口
server_name localhost;---服务器名称
location/{ -----资源路径位置
root html;---根目录下html文件夹

proxy_pass http://server_list;---反向代理服务器地址

index index.html index.htm;--首页
}
}
nginx配置与负载均衡
简单的说就是将一台服务器的压力由多态服务器来承担,即实现集群,由weight来分配权重。
nginx&tomcat&redis实现session共享:
原理很简单,就是将session存储到redis,由redis统一管理,然后服务器要用session时直接从redis取出来既可;
需要用到RedisSessionManager等等jar包,还需要配置文件:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/>
  <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="192.168.19.128"
port="6379"
database="0"
maxInactiveInterval="60"
password="admin"
/>


14.svn

1.svn是Subversion的简称,是一个自由开源的版本控制系统。
就像一个普通的文件服务器,记录每一次文件和目录的修改情况,这样就可以借此将数据恢复到以前的版本,还可以查看数据的更改细节。
2.常见操作:
a.浏览仓库:repo-browser
b.检出下载下来checkout,点击进入后,需要设置从哪儿下载到哪儿
c.add
d.commit,将本地的文件提交到svn服务器,这样别人都可以下载更新了。
e.update:指用户后续从服务器上down代码,第一次down称为checkout,后面则称为update;
此外还可以回退到某一个版本update to revision...


15.注解annotation

3个基本内置注解:@Override实现或重写方法
@Deprecated用来表示过时的方法
@SuppressWarning用来取消警告
声明注解:@interface 注解名称
注解本质上就是一个interface,注解中可以有方法,我们管他教注解的属性public String show();
元注解:修饰注解的注解
常用的元注解:@Target元注解 表明我们自定义注解使用的位置
@Retention 元注解 表明我们自定义注解存放(保存)的位置:source源文件生效  classclass文件有效  runtime运行时有效
@Documented 元注解表明生成文档之后注解的信息会显示在文档中
@Inherited 元注解       表明 父类的类上的注解可以被子类继承,被标注的注解retention必须是runTime
自定义注解一定会使用@Target和@Retention元注解
自定义注解的使用:
举例:放在类上面,通过反射获取
Class clazz = JdbcUtils.class;
JdbcProperties jdbcProperties = clazz.getAnnotation(JdbcProperties.class);

//放在方法上面,通过反射获取
Method method = clazz.getDeclaredMethod("getConnection");
JdbcProperties jdbcProperties = method.getAnnotation(JdbcProperties.class);

jdbcProperties.driverClass();
jdbcProperties.url();
jdbcProperties.user();
jdbcProperties.password();