C/S架构(客户端与服务器)
B/S架构(浏览器与服务器)
Servlet:Server Applet的简称,是服务器端的程序(代码,功能实现),可交互式的处理客户端发到服务器端的请求,并完成响应操作。
Url-pattern:
后缀匹配:*.xxx只要以xxx结尾就匹配
通配符匹配:/* 匹配所有请求,包含服务器所有资源
通配符匹配:/ 匹配所有请求,包含服务器所有资源,不包括.jsp
Load-on-startup:
作用:Tomact在启动时自动对Servlet实例化,在进行初始化。
值为整数,表示Servlet被加载发先后顺序,值越小,优先级越越高,就越先被加载。如果没有设置或为负数只有被请求时在加载Servlet。
@WebServlet注解:
name:Servlet名字
value:配置url路径,可以多个
urlPatterns:配置url路径
loadOnSatrtUp:配置Servlet创建的时机
Request对象:
在Servlet中用来处理客户端请求需要用到doGet或doPost方法的request对象
request方法:
1.使用HttpServletRequest接口中的public String getParameter(String name)和public String[]getParameterValues(String name)方法可以获得客户端表单提交的值。
方法public String getParameter(String name)取得单值,方法public String[]getParameterValues(String name)取得多值。
- setCharacterEncoding(String charset) 指定每个请求编码
respone 对象:
respone对象用于响应客户请求并向客户端输出信息。
setHeader(name,value)设置响应信息
setContentType(String) 设置响应文件类型,响应式的编码格式(服务器和客户端同时设置)
setCharacterEncoding(String)设置服务器响应内容的编码格式
getwriter()获取字符输出流
转发:
转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求处理
request.getRequestDispatcher(“目标地址”).forward(request,respone)
使用forward跳转是在服务器内部跳转,地址栏不变,属于同一次请求
存数据:request.setAttribute(key,value);
以键值对形式存取在request作用域当中,key为String类型,value为Object类型。
取数据:request.getAttribute(key)
通过String类型的key访问Object类型的value
重定向:
重定向作用在客户端,客户端将请求发生给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送请求。
sendRedirect跳转时,地址栏改变,代表客户端重新发送请求,属于两次请求
response.sendRedirect(“目标url”);
respone没有作用域,两次请求中都数据无法共享。
传递数据通过Url拼接进行数据传递,参数值只能是字符串(/Web/B?username=Tom)
获取数据:request.getParameter(“username”);
Servlet生命周期
- 实例化
当用户第一次访问servlet时,由容器调用Servlet的构造器创建具体的Servlet对象。服务器启动时就自动创建Servlet对象
<load-on-startup>1</load-on-startup>
- 初始化
在初始化阶段,init()方法会被调用。Initial()只被执行一次
- 服务
当客户端有一个请求时,容器就会将请求ServletRequest与响应ServletResponse对象传给Servlet,以参数的形式传递
- 销毁
当Servlet容器被停止时或者重新启动时都会引起销毁Servlet对象并调用destory方法
destory方法只被执行一次
Servlet线程安全问题
将变量变为私有变量,变成各个线程绑定的私有变量
状态管理
将多次交互所涉及的数据保存下来
- 状态管理分类
客户端管理:将状态保存到客户端,代表技术是Cookie技术
服务端管理:将状态保存到服务端,代表技术是session(服务器传递sessionId时需要使用Cookie的方式)和application.
Cookie:
Cookie cookie=new Cookie(name,value);//服务器创建cookie对象
//设置cookie访问路径
cookie.setPath("/webProject2/get");
//设置cookie有效期,>0有效期,单位秒。<0内存储存,默认-1,=0浏览器关闭
cookie.setMaxAge(60*60);
respone.addCookie(cookie);//将cookie响应给客户端。
- 获取cookie值
Request.getCookie()
修改cookie
只要名字和路径一致即可
如果改变cookie的name和有效路径 会新建cookie而改变cookie值,有效期会覆盖原有的cookie
Cookie编码与解码
Cookie默认不支持中文
编码:通过java.net.URLEncoder类中的encode(String str,String encoding)方法
解码:通过java.net.URLDecoder类中的decode(String str,String encoding)方法
Session
Session:
session用于记录用户的状态。Session指的是在一段时间内,单个客户端与web服务器的一连串相关的交互过程。
在一个seesion中,客户可能会多次请求访问同一个资源,也有可能访问各种不同的服务器资源(多次请求响应)
Session原理:
服务器会为每一次会话分配一个session对象
同一个浏览器发起的多次请求同属于一次会话
首次使用session时,服务器会自动创建Session,并创建Cookie储存SessionId发送给客户端
Session是由服务器创建的
Session作用域:拥有储存数据的空间,作用范围是一次会话有效
一次会话是使用同一个浏览器发送多次请求,一旦浏览器关闭,会话结束
可以将数据传入Session中,在一次会话的任意位置进行获取
可以传递任何数据(基本数据类型,对象,集合,数组 )
Session获取
HttpSession session=request.getSession();
Session保存数据
setAttribute(“key”,value);
获取
getAttribute(“key”)
移除
RemoveAttribute(“key”);
session生命周期
开始:第一次使用到Session的请求产生,则创建Session
结束:
浏览器关闭,则失效
Session超时,则失效
session.setMaxInactiveInterval();设置session的有效时间
手工销毁,则失效
Session.invalidate();//登录退出,销毁
浏览器禁用Cookie解决方法
实现url重写
String newUrl= resp.encodeRedirectURL("/webProject2/GetSessionServlet");//要跳转的路径
resp.sendRedirect(newUrl);
ServletContext对象
概述:
全局对象,也拥有作用域,对应每一个Tomcat中的web应用
当web服务器启动时,会为每一个web应用程序创建一块共享的存储区域
SercvletContex在web服务器启动时创建,服务器关闭时销毁。
获取ServletContext对象
GenericServlet的getServletContext
ServletContext作用
获取项目的真实路径
ServletContext.getRealPath(“/”)
获取项目的上下文路径(应用程序名称)
ServletContext.getContextPath();
ServletContext可以储存数据到全局容器中
servletContext.setAttribute("name","tom");存储数据
servletContext.getAttribute("name");获取数据
servletContext.removeAttribute("name");移除数据
ServletContext特点
唯一性:一个应用对应一个ServletContext
生命周期:只要容器不关闭或者应用不卸载,ServletContext就一直存在
过滤器
过滤器是处于客户端与服务器目标资源之间的一道过滤技术
作用:
执行地位在Servlet之前,客户端发送请求,会先经过Filter,再到达目标的Servlet中,响应时,会根据执行流程在反向执行Filter
可以解决多个Servlet共性代码的冗余问题
实现过程:
编写java类实现接口
在doFilter中编写拦截逻辑
设置拦截路径
过滤器配置:
在自定义的Filter类上使用注解@WebFilter(urlPatterns = "/目标路径")
过滤器链和优先级:
客户端对服务器请求之后,服务器会调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤链
每个过滤器实现某个特定的功能,当第一个Filter的都doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。调用了doFilter方法,Web服务器会检查FilterFilterChain对象是否还有filter,如果有,则调用第二个filter,如果没有则调用目标资源
过滤器优先级:
如果为注解的话,是按照类全名称的字符串顺序决定作用顺序
如果Web.xml,按照filter-mapping注册顺序,从上往下
web.xml配置高于注解方式
如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次
过滤器的拦截路径通常有三种方式
精确拦截:/具体路径
后缀:*.jsp
通配符:/*表示拦截所有