什么是Servlet
Servlet是一个基于Java技术的动态网页技术,运行在服务器端,由Servlet容器管理,用于生成动态的内容,是JSP的前身。
Servlet是平台独立的、符合特定规范的Java类,编写一个Servlet实际上就是按照Servlet规范编写一个Java类。
Servlet不是由用户或程序员直接调用,而是由容器(Tomcat)管理,没有main()方法。
Servlet和jsp的关系
所有的JSP都要先翻译成Servlet,然后编译成class,最后执行。JSP本质上就是一个Servlet。
JSP的执行过程
.jsp--翻译-->.java(Servlet)--编译-->.class---->执行
Servlet的生命周期
Servlet是一个单实例,多线程的程序
【1】类加载
【2】实例化(离不开反射)
【3】初始化(离不开反射)
【4】服务请求(service)(离不开反射)
【5】销毁操作(离不开反射)
类加载的时机
【1】默认的情况是第一次访问servlet的时候进行类加载
【2】<load-on-startup>0</load-on-startup>(当启动服务器时候加载),数字越小加载的实际越往前
Get方式和Post提交方式的区别
【1】get数据的传输是不安全的,post数据传递更加安全
【2】get方式数据传递有大小限制,post传递数据没有限制
【3】get传输的数据速度比较快,post比较慢
乱码处理
此处的乱码指的是前台页面数据的乱码。乱码分为两种(get和post)
【post方式处理】
request.setCharacterEncoding("utf-8");
【get方式处理】
方式1:
byte[] bytes = str.getBytes("iso-8859-1");
String cstr = new String(bytes, "utf-8");
方式2:
在servlet.xml中指定对应的服务器编码
URIEncoding = "utf-8"
JSP校验意义
【客户端验证】:使用JavaScript验证
好处:降低服务器端负担
不足:不安全,可以跳过,只能进行格式验证,无法进行业务验证(用户名是否已被占用)
【服务器端验证】:使用JSP验证
好处:安全,可以进行格式验证和业务验证
不足:增加了服务器端的负担
【建议】:同时进行服务器端和客户端验证
路径分类
【1】绝对路径(包括协议、IP地址、端口号、需要访问的地址)
范围:同一个服务器中所有的项目+局域网中服务器中的项目+外网服务器中的项目
【2】根路径(用“/”开始后面紧跟项目的名称+需要访问的路径)
范围:同一个服务器中所有的项目
“/”:当前的服务器
【3】相对路径
相对路径1:(相对于本身,../:返回上级,./:同级)
范围:同一个服务器中所有的项目
注意:如果有base标签,必须将其去掉
相对路径2:(相对于base标签)
范围:当前服务器中的当前项目的所有文件
转发与重定向
【转发】
1、转发是在服务器内部进行的跳转,转发过程没有产生新的请求
2、由于转发的整个过程没有产生新的请求,所以可以实现数据的传递
3、由于整个转发是服务器内部的跳转,所以url地址不会改变
【重定向】
1、重定向的过程产生了新的请求
2、由于整个过程产生了新的请求,所以重定向前后的数据不可以共享
3、重定向的过程对于浏览器来说是可知的,所以地址栏显示的是重定向之后的地址
方面 | 转发 | 重定向 |
---|---|---|
原理 | 一个请求的传递 | 产生新请求 |
语法实现 | forward() | sendRedirect() |
是否共享同一个请求 | 是 | 否 |
跳转后显示的url地址 | 跳转前的地址 | 跳转后的地址 |
跳转的范围 | 当前服务器的当前应用 | 所有服务器的所有应用 |
“/”路径的含义 | 当前应用 | 当前服务器 |
是否会导致重复提交 | 是 | 否 |
效率 | 高 | 低 |
是否经过过滤器 | 否(默认) | 是 |
JSP的内置对象
内部对象 | 所属类型 | 用途 |
---|---|---|
request | javax.servlet.HttpServletRequest | 包含了请求方的信息 |
response | javax.servlet.HttpServletResponse | 封装了对客户端的响应 |
out | javax.servlet.jsp.JspWriter | 响应信息流的标准输出 |
session | javax.servlet.Http.HttpSession | 在同一请求中所产生的session资料,目前只对Http协议有定义 |
application | javax.servlet.ServletContext | 提交安全信息 |
config | javax.servlet.ServletConfig | 提供配置信息 |
pageContext | javax.servlet.jsp.PageContext | 提供当前页面属性 |
page | javax.lang.Object | 同于java的this |
exception | javax.lang.Throwable | 异常处理 |
内置对象的介绍
response
当服务器创建request对象时会同时创建用于响应这个客户端的response对象
out对象
是JspWriter类的实例,不是PrintWriter的实例,用来在response对象中写入内容。JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过JspWriter增加了一些专为处理缓存而设计的方法,另外JspWriter类会抛出IOException异常。
最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作,可以在page指令中使用buffered='false'属性来轻松关闭缓存。
pageContext
PageContext类的实例,用来代表整个JSP页面,提供对JSP页面所有对象以及命名空间的访问。
四大作用域
page
当前页面,动态包含得不到,静态包含可以得到
request
当前请求,request=page+dispatcher转发+include包含
session
当前会话
结束条件:session.invalidate(),超过MaxInactiveInterval时间,关闭浏览器
application
当前应用程序
结束条件:重启服务器