映射细节
- 1:一个Servlet可以有多个
2:可以使用(*)通配符来给Servlet配置资源名称
方式一:/*使用任何字符都可以访问当前的Servlet 方式二:使用拓展名配置 *.abc 只要Servlet的的资源名后缀为abc就可访问
3:Servlet的生命周期方法执行顺序
构造器>init>service>destory 如果初始化操作非常复杂,那么就应该改变初始化的时机 在web.xml文件中添加配置,数字代表执行初始化的优先级,0表示最先执行 <load-on-startup>0</load-on-startup>
4:Servlet的名称不能为default,default专门用于访问项目下的静态文件
Servlet3.0的注解配置
问题: 如果有多个Servlet 那么就需要在web.xml文件有大量的配置,造成文件过于臃肿
- 解决方法:使用注解代替xml文件中的部分配置
注解的使用方式
第一步:WebServlet("/注解元素") 第二步:metadata-complete(false)默认为true,删除为false
WebServlet常用的元素
String name() default""; 指定Servlet的名称 String[] value default{};和urlPatterns一样的工功能<url-pattern> int loadOnStartup() default 0;设置Servlet的初始化时机 WebIitParam[] initParams() default{}设置Servlet的初始化参数
在Servlet中使用注解的优缺点
优点:简单直观,便于维护; 缺点:有以硬编码的形式写入到Servletd代码中
Servlet线程的安全问题
- 线程不按安全的原因:多线程并发的访问同一份资源
解决方法
1:Servlet实现SingleThreadModel,只允许一个对象进入 2:不使用成员变量,改为当前对象的局部变量,
Http无协议带来的问题
http是无协议状态,也就是没有记忆力,每个请求之间无法共享数据
解决方式
1:参数传递机制,解决请求之间不能共享数据的问题 问题:不安全,信息暴露 2:Cookie:将用户的信息保留在浏览器中 3:Session 将数据保留在服务端,给浏览器一个内存地址,根据地址从内存中过去数据
Cookie
Cookie小甜点:是一个客户端技术,将数据放到浏览器中,(请求头中)
Cookie的基本使用:
1:创建cookie的对象 Cookie(String name,String vlaue) Cookie c=new Cookie("username","neld") 2:强Cookie中的共享数据交给浏览器 response对象.addCookie(c); 3:获取Cookie的中共享数据 Cookie[]cookies=request对象.getCookie() for(Cookie c : cookies){ if(“username”.equals(c.getName())){ username = c.getValue(); break; } } 4:Cookie中的name和value不支持中文 URLEncoder.encode(String name,String enc)编码,加密 URLDecoder.decode(String name,String enc)解码,解密 5:修改Cookie中的共享数据, 根据Cookie对象调用setValue(String name)即可设置参数值 创建一个新的Cookie对象,name和被修改的Cookie的一样 6:Cookie的生命周期Cookie对象.setMaxAge(int expiry) expiry=0删除当前的Cookie对象 expiry>0的值表示Cookie存活时间的秒数 expiry<0默认值,浏览器关闭的时候Cookie失效 7:Cookie的路径和域范围 Cookie对象.setPath("/");设置为根路径Cookie对象.setDomain(".baidu.com")
Cookie的缺陷
1: 不支持中文;
2: 共享的数据保存在浏览器,不安全
3: 数据大小限制最大4kb
4: 一次只可以保存一个字符串
Session
Session:会话,实现会话跟踪的技术,实际上底层依然使用Cookie来实现,
是服务端的技术,给浏览器一个内存地址,根据地址从内存中获取数据
1:获取Session
request对象.getSession()
2:设置参数
session对象.setAttribute(String name,Object value);
3:获取参数
session对象.getAttribute(String name);
3:更改参数
session对象.setAttribute(String name,Object vlaue)
4:删除参数
session对象.removeAttribute(参数)
5:销毁session对象
session对象.invalidate();
6:超时管理
session对象.setMaxInactiveInterval(秒数);
7:URL重写,在浏览器关闭Cookie的时候使用
String url = resp.encodeUrl("/session/list");
在跳转页面改为url;