1.Servlet
1.什么是servlet?
servlet是运行在web服务器上的代码片段,用于处理用户的http请求,是Sun公司定义的javaee组件规范
1.1Servlet的特点?(与html的区别)
Servlet产生的响应内容是由代码动态生成的,不同用户请求同一个Servlet,得到的响应内容可能是不同的
2.为什么要用servlet?
可以简化web服务器端的开发,将复杂的网络通信细节封装在webservlet中,开发者仅需要提供servlet,就可以完成服务器端开发
3.什么时候用servlet
web服务器处理http协议,使用servlet可以更简单高效
4.如何开发一个servlet
1.前提是需要安装一个 WebServer
tomcat:是apache基金会维护的一个高效,开源,免费的WebServer
2.创建一个servlet,实现servlet接口/继承HttpServlet
在service方法中添加具体的逻辑
在web.xml中servlet
什么是应答状态码?
是http协议规定的,对一次响应状态进行描述的数字代码 常见:
200:本次响应正常
304/307:使用本地缓存的资源
404:用户请求的内容找不到
500:请求的内容找到了,执行代码时出现异常
2. 为什么用应答状态码?
更通用,也更高效
Http协议的请求方式
Http协议规定了8种请求方式,最常用的是2种,get和post
- 为什么要规定多种请求方式?
根据用户请求服务器的目的不同,划分成不同的方式,采用对应的方式可以更高效
2)get请求
代表用户从服务器获取数据(下载),是最为常用的请求方式
1. 以下几种情况,默认使用get请求:
1. 在浏览器地址栏输入一个url时
2. 表单(form)的默认提交方式
3. 是超链接(<a>标签)的默认请求方式
2. get请求的特点:
1. 请求参数会被拼接到url后面,显示在浏览器的地址栏上
1. 安全性比较低
2. 浏览器对地址栏中的内容的长度有限制,一般在2kb
3)post请求
代表用户向服务器提交(上传)数据
1. POST请求的特点:
1. 请求参数不会拼接在url后面,而是放在请求实体中
1. 安全性相对高一些
1. 注意,http协议不会对请求实体中的数据进行解密
2. 浏览器对请求实体中数据的长度没有限制,理论上多长都可以
- get和post如何选择?
- 用户从服务器获取数据时,使用GET
- 用户向服务器提交数据时,使用POST
- 所有涉及密码的表单,都必须使用POST
- GET请求可以提交数据,但是长度有限制,约2KB
Servlet API
String username = request.getParameter(“username”);
获取请求参数
- response.getWriter().write(“响应内容”);
响应内容 - request.setCharacterEncoding(“UTF-8”);
设置请求字符集 - response.setContentType(“text/html;charset=utf-8”);
通知浏览器使用utf-8对响应内容进行解码tomcat读取到这段代码会自动使用utf-8进行编码 - response.sendRedirect(“url”)
重定向原理:
302响应状态码+location的响应头
特点
- 一共是2次请求,2次响应
- 地址栏会发生变化,显示的是第二次请求的地址
- 重定向既可以定向到当前服务器内部的资源,也可以定向到其它的网站
- 服务器内部资源: listUser
- 其它网站的资源: http://www.tmooc.cn
- request.setAttribute(String name,Object,value);
向request中的一个列表中存入数据 - request.getAttribute(String name,Object,value);
向request中的一个列表中取出数据 - RequestDispatcher rd=request.getRequestDispatcher("/login.jsp");
获取请求转发器 - rd.forward(request, response);
转发请求
转发请求
是指Servlet对一个请求进行初步的处理,然后交给另一个组件(Servlet,JSP,Html)来生成响应内容
一般情况下,都是Servlet对请求进行处理,然后交给JSP来生成响应内容
充分利用不同组件的特点,发挥组件的优势,让组件配合工作,提高开发的效率
请求转发的特点
- 一次请求,一次响应
- 地址栏不会发生改变
- 转发经过的所有组件使用的是同一个request对象,因此可以使用request来共享数据
- 请求转发的目的地只能是当前项目中的组件,不能是其他项目或网站的内容
转发与重定向的区别
servlet生命周期
-
创建
-
初始化
-
就绪
-
销毁
1)创建
-
默认情况:
- 当用户第一次请求一个Servlet映射的url时,Web服务器会找到该Servlet的class文件,加载并实例化
- 后续用户多次请求同一个url,服务器会直接调用刚才实例化的那个Servlet来响应用户请求
- 因此,整个服务期间,同一个Servlet,仅存在一个实例
-
特殊情况:
- 可以在配置一个Servlet时,添加一个标签
- 1
- 如果一个Servlet配置的这个标签,且其值大于等于0,name服务器启动时,就会加载和实例化该Servlet
- 值越小,越优先加载和实例化
- 对于非常常用且加载和实例化比较耗时的Servlet,可以配置这个标签
- 可以在配置一个Servlet时,添加一个标签
ServletConfig
-
获取ServletConfig对象
- getServletConfig()
-
从config中获取参数的值
- config.getInitParameter(name);
-
在web.xml中配置
-
注意:
- 一个Servlet对应一个ServletConfig
- 一个ServletConfig中仅包含一个Servlet在web.xml中的配置信息
ServletContext: Servlet上下文
当服务器启动后,会逐个加载配置的Web项目,每加载完一个Web项目,会马上创建一个ServletContext对象,唯一代表该Web项目
- 基本功能
1)在整个项目内部实现数据共享
API:-
获取ServletContext
ServletContext sc=getServletContext(); -
存值/取值
sc.setAttribute(String name,Object value);
sc.getAttribute(String name);
sc.removeAttribute(String name);
-
2)对比request,Session,ServletContext
- ServletContext只有一个,不适合保存多个用户不同的变量,因为会彼此覆盖
- Session可以跨请求保存一个用户的会话状态
- request可以在一次请求内部实现数据共享
- 遇到共享数据的需求时,如何考虑?
- 该数据是大家用同一个,还是每个人不同的?同一个-ServletContext
- 该数据是否要跨请求共享? 跨请求 - Session
3)读取web.xml中配置的初始化参数
-
可以在web.xml中配置一个项目通用的初始化参数
encode
utf-8
-
可以通过ServletContext对象,直接获取该初始化参数
String value=sc.getInitParameter(String name);
-
优势:
- 不论Servlet还是Filter,还是JSP,都可以直接访问相同的ServletContext,进而获取 该初始化参数的值
- 只需要配置一次,就可以实现整个项目的共享
4)ServletContext的生命周期(了解)
创建:服务器启动后,加载完一个项目,就创建一个ServletContext
活多久:和当前项目活的一样久
销毁:服务器关闭或当前项目被移出容器,ServletContext会被销毁