Servlet: Servlet接口
GenericServlet: Servlet接口的实现类
HttpServlet: http协议的Servlet实现类
ServletConfig: servlet配置信息
PrintWriter: 浏览器输出流
Cookie: 将信息保存到浏览器
三大域对象:
ServletRequest: 请求信息(通过请求转发和请求包含实现通信)(单次连接)
HttpSession: 用来会话跟踪的类(服务器端对象)
ServletContext: 实现多个Servlet对象的通信(与服务器同生共死)
ServletResponse: 响应信息接口
HttpServletResponse: http响应信息接口
ServletRequest: 请求信息接口
HttpServletRequest: http请求信息接口
AsyncContext: 异步上下文对象(3.0)
Servlet监听器(创建、销毁对象,更改对象中的属性时)
Filter:过滤器(截断请求,进行过滤)
Servlet
java用于开发动态web资源的技术
定义了所有servlet必须实现的方法
public void init(ServletConfig config):
创建后马上执行,并只执行一次,生命周期方法
public void service(ServletRequest req, ServletResponse res):
每次处理请求时调用,生命周期方法
public void destroy():在销毁前调用,只执行一次,生命周期方法
public String getServletInfo():获取servlet信息
public ServletConfig getServletConfig():获取servlet配置信息
Servlet3.0的注解
@WebServlet()
属性:
value: 为<url-pattern>
urlPatterns: 为<url-pattern>,与value只写一个
name: 为<servlet-name>
initParams: 为<init-param>,initParams={@WebInitParam(name="",value="")}
oladOnStartup: 为<load-on-startup>
asyncSupported: 是否支持异步(默认false)
GenericServlet
通过集成该类,实现Servlet接口
子类可重写init()方法 :初始化
destroy()方法:销毁前操作
public void service(ServletRequest req, ServletResponse res):这个方法要自己实现
HttpServlet
与http协议相关的Servlet实现类
子类一般只需要重写doGet()和doPost()方法(不重写访问时会出现405错误)
service(ServletRequest req, ServletResponse res)方法将参数转型后传给
service(HttpServletRequest req, HttpServletResponse resp)
此方法分析请求方式为GET或POST,然后调用方法doGet()或doPost()
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
ServletConfig
接口
获取方式:
Servlet.getConfig();
方法:
String getServletName(): 获取<servlet-name>中的内容
ServletContext getServletContext():获取servlet上下文本对象
Enumeration<String> getInitParameterNames(): 获取所有初始化参数名
String getInitParameter(String name):根据名称获取指定初始化参数值
ServletContext
javaweb中域对象之一
该类在服务器中只有一个实例
获取方法:
ServletConfig.getServletContext();
GenericServlet.getServletContext();
HttpSession.getServletContext();
ServletContextEvent.getServletContext();
函数:
void setAttribute(String name, Object object):用来存储一个对象
Enumeration<String> getAttributeNames():获取该域内所有对象名称
Object getAttribute(String name):获取对象
void removeAttribute(String name):删除对象
String getInitParameter(String name): 返回初始化参数的值
String getRealPath(String path): 得到绝对路径,参数为项目中的相对路径
InputStream getResourceAsStream(String path):得到输入流
Set<String> getResourcePaths(String path):得到目录下所有文件路径
HttpServletResponse
响应信息
扩展了ServletResponse接口,提供HTTP相关功能,发送响应
父类方法:
ServletOutputStream getOutputStream(): 获取向客户端发送字节数据的类
PrintWriter getWriter(): 获取向客户端发送字符数据的类,需要设置编码
void setCharacterEncoding(String charset): 设置PrintWriter的编码
直接setHeader("Content-Type", "text/html; charset=utf-8")会设置编码
状态码:
void sendError(int sc): 发送错误状态码
void sendError(int sc, String msg): 发送错误状态码和错误信息
void setStatus(int sc): 发送正确状态码
响应头:
void setHeader(String name, String value): 设置一个指定名字,指定值的头
void addHeader(String name, String value): 用给定的名称和值添加一个响应头。允许一个头对应多个值
void setIntHeader(String name, int value): 设置一个给定名称的响应头和整数值
void addIntHeader(String name, int value): 用给定的名称和整数值添加一个响应头。允许一个头对应多个值
void setDateHeader(String name, long date): 设置一个给定名称的响应头和毫秒值
void addDateHeader(String name, long date): 用给定的名称和毫秒值添加一个响应头。允许一个头对应多个值
void addCookie(Cookie cookie): 想浏览器保存Cookie
void sendRedirect(String location): 指定重定向的url
重定向时,字符串中有中文,要解决编码问题
编码:string = URLEncoder.encode(string, "UTF-8");(重定向Servlet)(编码前需要解响应编码)
解码:string = URLDecoder.decode(string, "UTF-8");(目标Servlet)(解码后还需要解请求编码)
String encodeRederectURL(String uri): 可以解决Cookie禁用后,Session的跟踪问题(jsessionid会写道地址栏,不安全)
uri = response.encodeRedirectURL(uri);
response.sendRederect(uri);
String encodeURL(String uri): 解决Cookie禁用后,非重定向是的Session跟踪问题(不安全)
uri = response.encodeURL(uri);
out.println("<a href='" + uri + "'>跳转</a>");
响应编码:
使用response.setCharacteEncoding("utf-8")试着发送流编码
response.setHeader("Content-Type","text/html;charset=utf-8");还会执行上面的代码,一句顶两句
response.setContntType("text/html;charset=utf-8"); 和上面一句效果相同
HttpServletRequest
请求信息
扩展了ServletReques接口,提供HTTP相关功能
父类方法:
String getRemoteAddr(): 获取ip地址
获取请求头:
String getHeader(String name): 获取单值的头
int getIntHeader(String name): 获取单值整型的头
long getDateHeader(String name): 获取单毫秒类型的头
Enumeration<String> getHeaders(String name): 获取多值的请求头
获取请求url:
String getScheme(): 获取协议
String getServerName(): 获取服务器名
int getServerPort(): 获取服务器端口号
String getContextPath(): 获取项目名
String getServeltPath(): 获取Servlet路径
String getQueryString(): 获取参数部分
String getRequestURI(): 获取请求URI(项目名+Servlet路径)
String getRequestURL(): 获取请求URL(不包含参数的整个请求路径)
获取请求参数:
String getParameter(String name): 获取指定名称的参数值(适用于单值)
String[] getParameterValues(String name): 获取指定名称的参数值(适用于多值)
Enumeration<String> getParameterNames(): 获取所有请求参数名称
Map<String,String[]> getParameterMap(): 获取所有请求参数
Cookie[] getCookies(): 获取浏览器归还的Cookie
请求转发和请求包含 getRequestDispatcher
RequestDispatcher(String path): 得到RequestDispatcher对象,path为对象Servlet路径
请求转发: RequestDispatcher.forward(request, response);(仅保留本对象对响应头的操作)
请求包含: RequestDispatcher.include(request, response);(共同完成)
域的使用:
void setAttribute(String name, Object value)
Object getAttribute(String name)
请求编码( tomcat9 get请求的默认编码为utf-8):
POST:
在获取参数前调用request.setCharacterEncoding("utf-8");
GET:
反编译
String name = request.getParameter("name");
byte[] bytes = name.getBytes("ISO-8859-1");
name = new String(bytes, "utf-8");
HttpSession
获取方法:
request.getSession(); 没有就创建
request.getSession(false); 没有就返回null
相关域方法:
void setAttribute(String name, Object object):用来存储一个对象
Object getAttribute(String name):获取对象
void removeAttribute(String name):删除对象
Cookie
public void setMaxAge(int expiry): (默认会话结束时删除)
expiry>0: 在硬盘上保存expiry秒
<0: 只在内存中保存
=0: 立刻删除
public void setPath(String uri): 为Cookie指定一个路径,只有当访问路径包含这个路径时,返回此Cookie
默认当前目录
public void setDomain(String domain): 在多个二级域中共享Cookie
例如:在www.baidu.com、tieba.baidu.com之间共享Cookie,如下设置
cookie.setDomain(".baidu.com"); sookie.setPath("/");
Filter
需要在web.xml文件注册
对客户端的请求进行过滤(单例多线程)(在服务器启动时创建并初始化)
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
子类实现该方法,对请求进行拦截过滤 操作
操作完成后,通过chain(request,response);方法可将请求发送给下一个资源
当服务器将响应发出时也会被拦截
void destroy(): 销毁Filter
void init(FilterConfig filterConfig): 初始化Filter
FilterConfig对象的方法与ServletConfig相同
Servlet3.0的注解
@WebFilter()
属性:
value: 为<url-pattern>
urlPatterns: 为<url-pattern>,与value只写一个
servletNames: 为<servlet-name>
name: 为<filter-name>
dispatcherTypes: 为<dispatcher>
Listener
监听器需要在web.xml文件中注册
Servlet2.0
ServletContextListener:在ServletContext创建(Initialized)和销毁(Destroyed)时
HttpSessionListener:在Session创建(sessionCreated)和销毁(sessionDestroyed)时
ServletRequestListener: 在Request创建(Initialized)和销毁(Destroyed)时
ServletContextAttributeListener:在ServletContext域中的变量更新时
HttpSessionAttributeListener: 在Session域中的变量更新时
ServletRequestAttributeListener: 在Request域中的变量更新时
attributeAdded(): 添加时调用
attributeRemoved(): 删除时调用
attributeReplaced(): 更新时调用
HttpSessionActivationListener: 当实现此接口的类对象被钝化和活化时(无需注册)
sessionWillPassivate(): 从内存写入硬盘(钝化)前
sessionDidActivate(): 从硬盘恢复到内存(活化)后
HttpSessionBindingListener: 当实现此接口的类对象被添加到Session域中时(无需注册)
valueBound(): 添加时调用
valueUnbound(): 删除时调用
Servlet3.0的注解:
@WebListener
AsyncContext
得到异步上下文对象:
request.startAsync(request, response);
结束方法:
1.在异步子线程中使用AsyncContext.complete()方法,
2.在异步子线程中使用AsyncContext.dispatch()方法,执行效果相当于包含
3.在异步Servlet主线程中设置AsyncContext的潮湿时限
启动异步线程:
AsyncContext.start(Runnable);
AsyncContext.addListener(Listener): 为异步操作添加监听器