Servlet
- 模板方法设计模式
- 请求类型
- 枚举
- Java注解(Annotation)
菜鸟教程:(https://www.runoob.com/w3cnote/java-annotation.html) - HTTP协议
模板方法设计模式
Tomcat源码
初始化调用
init(ServetlConfig config)
class GenericServlet(){
init(ServetlConfig config){
//通用的代码都已经执行了
//保存config到成员变量
init()
}
init(){
//空方法,给你自定义扩展
}
}
class CServlet extends GenericServlet(){
init(){
//重写
}
}
2.service(HttpServletRequest req,HttpServletResponse resp)
(1)一般重写,这个方法可以同是处理post和get请求
(2)也可分开写:
doPost() 只能处理post请求
doGet() 只能处理get请求
请求类型
post和get的区别:(https://blog.csdn.net/java123456111/article/details/123615314)
1、传送方式:get通过地址栏传输,post通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;
POST产生两个TCP数据包长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
GET与POST都有自己的语义,不能随便混用。
据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
案例:一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来。
拓展资料:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
1、Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url][http://www.mdm.com/test.asp?name=asd&password=sad/url],数据都会 直接显示在 url 上,就像用户点击一个链接一样;Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理
2、 Get 方式需要使用 Request.QueryString 来取得变量的值;而 Post 方式通过 Request.Form 来访问提交的内容
3、Get 方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 Post 方法好;而 Post 方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击,根据微软方面的说法,微软对用Request.Form() 可接收的最大数据有限制,IIS 4 中为 80 KB 字节,IIS 5 中为 100 KB 字节
建议:除非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法
4、Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题是,该页面如果刷新的时候,会弹出一个对话框。
建议:出于安全性考虑,建议最好使用 Post 提交数据
枚举
Java中的一种数据类型,和类,接口是一个层次的概念,限定用户给某个变量赋值,定义一个枚举,将可能的取值全部列出来,给这种类型的变量赋值的时候,只能使用定义枚举时列举的类型
定义枚举使用关键字: enum
public enum Gender {
male,female
}
public class MyTest01 {
public static void main(String[] args) {
String gender="男";
gender="女";
gender="aaa";
gender="123";
Gender gender2=Gender.male;
System.out.println(gender2);
gender2=Gender.female;
System.out.println(gender2);
DayOfWeek dayOfWeek=DayOfWeek.Tuesday;
}
}
注解
Java中的一种数据类型,和类,接口,枚举是一个层次的概念
注释:给程序员看,编译直接跳过
注解:给程序看的,替换配置文件,框架底层使用反射读取注解
定义注解使用关键字 @interface
定义注解:
public @interface Anno1 {
//注解中只有属性,一定要加()定义注解使用关键字
String name();
}
使用注解:
@Anno1(name="zs")
public class MyTest02 {
@Anno1(name="ls")
int age;
public static void main(String[] args) {
}
}
注解中属性可以使用的数据类型:
8种基本数据类型,String,枚举,Class,注解,以上类型的一维数组
public @interface MyAnno {
String name();
int age();
Gender gender();
Class clazz();
Anno1 anno1();
DayOfWeek[] days();
Class[] clazzs();
Anno1[] anno1s();
}
@Anno1(name="com.woniuxy.StudentDao")
public class MyTest02 {
@Anno1(name="ls")
int age;
@MyAnno(age = 1,name = "abc",gender = Gender.male,clazz = int.class,
anno1 = @Anno1(name="def"),days = {DayOfWeek.Monday,DayOfWeek.Wendday},
clazzs = {double.class,String.class},
anno1s = {@Anno1(name="123"),@Anno1(name="234")})
String test;
public static void main(String[] args) {
}
}
(1)注解的属性值是数组,赋值的时候,如果数组的元素只有一个值,{}可以省。
(2)value属性特权:属性的名字是value,赋值的时候可以不写属性名,直接写值。如果有其它属性,都不能省略名字
(3)属性值可以有默认值
public @interface Anno2 {
String value();
int test() default 1;
}
元数据 数据的数据 metaData
元注解 注解的注解 在注解上使用的注解
@Documented 自动生产文档注释 javadoc
@Target 限定注释可以使用的范围
@Retention 注解起作用的范围
注解可以替换配置文件,程序运行时通过反射可以读取注解的属性值
@Anno1(name="com.woniuxy.servelt.AServler")
public class MyTest04 {
public static void main(String[] args) throws Exception {
Class clazz=Class.forName("com.woniuxy.test01.MyTest04");
if(clazz.isAnnotationPresent(Anno1.class)) {
Anno1 anno1 = (Anno1) clazz.getAnnotation(Anno1.class);
System.out.println(anno1.name());
}else {
System.out.println("没有");
}
}
}
@WebServlet(value = "/AServlet",
initParams = { @WebInitParam(name = "a", value = "aaa"),
@WebInitParam(name = "b", value = "bbb") }, loadOnStartup = 1)
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
System.out.println("自定义初始化");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ASerevlet-service");
Enumeration<String> names = getServletConfig().getInitParameterNames();
String name;
while(names.hasMoreElements()) {
name=names.nextElement();
System.out.println(name+"---"+getServletConfig().getInitParameter(name));
}
}
}
注解替换配置文件
注解:
优点:简单
缺点:注解是写在源代码中的,上线以后修改配置,只有重写源代码,编译,打包,部署
以后能写注解的基本都是写注解,只有注解不能写的,或者和环境关系相关的参数 ,MyBatis框架也支持注解,注解功能有些不好用。