Servlet基础

Servlet

  1. 模板方法设计模式
  2. 请求类型
  3. 枚举
  4. Java注解(Annotation)
    菜鸟教程:(https://www.runoob.com/w3cnote/java-annotation.html)
  5. 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框架也支持注解,注解功能有些不好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值