什么是servlet?
交互式处理客户端发送到服务器的请求,并完成操作相应。
动态响应网页
作用:
- 接收客户端请求,完成操作
- 动态生成网页
- 将包含操作结果的动态网页响应给客户端
servlet的体系结构 extends HttpServlet
两个父类 : HttpServletRequest , HttpServletResponse
两个父接口 : request, response
servlet的生命周期
前置条件:
tomcat 在启动时,检测web.xml和注解 ,是否有load-on-startup为0 或正数的servlet
如果有 : 调用getServletConfig() 找配置信息 getServletContext()找到具体包下的servlet。
如果没有 : 在请求的时候,调用getServletConfig() 找配置信息 getServletContext()找到具体包下的servlet
- new() 只执行一次:单例模式 容器:tomcat创建
- init() 初始化 给一些属性赋初始值 只执行一次。 【说明】创建结束后,把servlet对象存在Tomcat的内容空间中,成为servlet容器
- 调用service()方法 调用子类里的对应重写的doGet或doPost方法响应结果
- destory() 销毁: 当重启或关闭容器时,才调用销毁方法,只调用一次。servet运行在多线程环境中,非线程安全
servlet的配置方式
3.0之前 使用web.xml
<servlet> <servlet-name> <servlet-class>
<servlet-mapping> <servlet-name> <url-pattern>
3.0之后 使用注解
@WebServlet(name = "OrderServlet" ,value = "/orderServlet")
request常用方法:请求对象
- getParamenter("")
- setCharacterEncoding("UTF-8");
- getRequestDispatcher()
- setAttribute();
- getAttribute();
response常用方法: 响应对象
- setContentType();
- setHeader();
- setCharacterEncoding();
- sendRedirect();
转发与重定向区别:
重定向:作用在客户端,相当于客户端发出一个新的请求
地址栏会显示重定向之后的路径
重定向后的servlet无法获取之前servlet里的数据
因为在HTTP协议中,不同请求之间的数据不共享
get请求 doGet
转发:作用在服务器端,是一次请求内的跳转
地址栏不会感知变化
由于在一次请求内,servlet之间数据共享
和之前请求方式相同
Cookie
- 浏览器在访问服务器时,由web服务器在HTTP响应头中附带传送给浏览器的数据
- 如果web浏览器保存cookie,那么它以后每次访问该web服务器时,都应在HTTP请求头中将这个cookie回传给web服务器中。
- 一个cookie主要由标识该信息的名称、值组成
原理
创建cookie
//创建cookie
Cookie cookie = new Cookie("code",code);
cookie.setPath(""); //设置路径
cookie.setMaxAge(); // >0 有效期为秒,=0浏览器关闭,<0 内存存储,默认为-1
response。addCookie(cookie); //添加到response对象中,响应时发送给客户端
获取Cookie
//获取Cookie
Cookie cookie=resquest.getCookie();
//遍历
for(Cookie cookie01:cookie){
if(cookie01.getName().equal("code")){
code=cookie01.getValue();
break;
}
}
优点:
- 可配置到期规则
- 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对
- 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的
缺点:
- 大小受到限制:大多数浏览器对cookie的大小有4K、8K字节的限制。
- 用户配置为禁用:有些用户禁用了浏览器接收cookie的功能
- 风险:cookie有可能被篡改
Session:
定义:
- 用户记录用户的状态。session 指的是在一段时间内,每个客户端与web服务器的一连串相关的交互过程
- 在一个Session中,客户可能会多次请求访问同一个资源,也有可能访问各种不同的服务器资源
原理:
- 服务器会为每一次会话分配一个request对象
- 同一个浏览器发起的多次请求,同属于一次会话 session
- 首次使用session,服务器会自动创建session,并创建cookie存储sessionid发送回客户端
//获取session对象
Httpsession session=request.getSession();
//保存数据
setAtribute("key",value);
//获取数据
session.getAttribute("key");
Cookie 和 session的区别
- 存放内容:cookie只能字符串 session 任意类型
- 存放位置:cookie在客户端 session 在服务端
- 安全性:cookie不够安全,session 相对安全
- 时效cookie 默认即时失效 session 默认30分钟
简化servlet:设置BaseServlet,避免创建多个servlet,可以让新建的servlet继承BaseServlet,不需继承HttpServlet。
public class BaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取前端请求的方法的名字
String methodname=request.getParameter("method");
try {
//判断是否获取到方法名
if(methodname!=null) {
//利用反射机制,找到方法所在的类,调用对应的方法
//反射
Method method = this.getClass().getMethod(methodname, HttpServletRequest.class, HttpServletResponse.class);
if (method != null) {
//调用方法,方法返回的是视图名
//返回结果:是servlet子类中的方法的返回值,
// return "forward/redirect:login.jsp";
String url = (String) method.invoke(this, request, response);
if (url != null && url != "") {
//截取到有效路径 获取 forward:后面的内容
String pagePath = url.split(":")[1];
if (url.startsWith("forward:")) {
request.getRequestDispatcher(pagePath).forward(request, response);
} else if (url.startsWith("redirect:")) {
//重定向
response.sendRedirect(pagePath);
} else {
//响应AJAX数据
response.getWriter().print(url);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("没有调用的方法:"+e.getMessage());
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Get 和 post 区别
GET请求:
- GET提交的数据会存放在url中,以?分割url和传输数据,参数之间以&相连
- GET方式明文传递,数据量小,不安全
- 效率高,浏览器默认请求方式为GET请求
- 对应的Servlet的方法是doGet
POST请求:
- POST请求方法是把提交的数据存放在HTTP包的Body中
- 密文传递数据,数据量大,安全
- 效率相对美元GET高
- 对应的Servlet的方法是doPost
HTTP协议 三次握手 四次挥手
通信流程:
- 客户端与服务器建立连接 (三次握手)
- 客户端向服务器发送请求
- 服务器接受请求,并根据请求返回相应的文件作为应答
- 客户与服务器关闭连接(四次挥手)