/*
* 请求中文乱码解决:
* 方式一:uname=new String(uname.getBytes("iso8859-1"),"utf-8");
* 方式二:使用公共配置,与请求方式有关
* post请求:
* req.setCharacterEncoding("utf-8");
* get请求:
* 步骤一:req.setCharacterEncoding("utf-8");
* 步骤二:需要在tomcat的conf目录下service.xml中Connector标签中增加属性useBodyEncodingForURI="true"
*
* Servler流程总结:
* 浏览器发起请求到服务器 (请求)
* 服务器接收浏览器的请求进行解析,创建request对象,存储请求数据
* 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
* servlet的方法执行进行请求处理
* 设置请求编码格式
* 设置响应编码格式
* 获取请求信息
* 处理请求信息
* 创建业务层对象
* 调用业务层对象的方法
* 创建业务层接口
* 实现业务层接口
* 创建pojo类
* 创建DAO层
* 创建DAO层接口
* 实现DAO层接口
* //申明jdbc对象
* //申明数据存储对象
* //加载驱动
* //获取连接对象
* //创建SQL命令
* //创建SQL命令对象
* //给占位符赋值
* //执行
* //遍历执行结果
* //关闭资源
* //返回
* 响应处理结果
* 直接响应
* 请求转发
* 重定向
* 请求转发学习:
* 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
* 使用:
* req.getRequestDispatcher("要转发的地址").forward(req, resp);
* 要转发的地址:相对路径,直接书写servlet的别名(后期会有jsp)
* 特点:
* 一次请求,浏览器地址信息不改变。
* 注意:
* 请求转发后直接renturn结束即可。
* request作用域:
* 作用:解决一次请求内不同servlet的数据共享问题(请求数据+其他数据)
* 使用:
* req.setAttribute("str", "用户名或密码错误!");
* req.getAttribute("str");
* 作用域:一次请求内所有servlet
* 特点:
* request对象服务器创建
* 每次请求都会创建
* 声明周期一次请求内
* 重定向:
* 解决问题:
* 1、当前请求,servlet无法处理
* 2、避免表单数据重复提交
* 使用:
* resp.sendRedirect("/login/main");//本地资源uri 网络资源url
* 特点:
* 两次请求,两个request对象
* 浏览器地址栏信息改变
* 时机:
* 如果请求中有表单数据,而数据比较重要且不能重复提交,交易使用重定向
* 如果请求被servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源
* 解决主页面用户名显示为null的问题
* 原因:
* 因为在用户登陆成功后使用重定向显示主页面,两次请求,而用户的信息
* 在第一次请求中,第二次请求中没有用户数据,所以显示为null
* 解决:
* 使用session
* Servlet重定向路径总结:
* 相对路径:从当前请求的路径查找资源的路径
* 相对路径如果servlet的别名中包含目录,会造成重定向资源查找失败
* 绝对路径:
* /虚拟项目名/资源路径。第一个/表示服务器根目录webapps
* Servlet请求转发:
* /表示项目根目录
* req.getRequestDispatcher("/资源路径").forward(req, resp);
* Cookie学习:
* 作用:解决了不同发送的不同请求的数据共享问题
* 使用:
* Cookie的创建和存储
* //创建Cookie对象
* Cookie c=new Cookie("mouse", "thinkpad");
* //设置cookie(可选)
* //设置有效期
* c2.setMaxAge(int seconds);
* c2.setPath(String uri);
* //响应Cookie信息给浏览器
* resp.addCookie(c);
* Cookie的获取
* //获取Cookie信息数组
* Cookie[] cks=req.getCookies();
* //遍历数组获取Cookie信息
* 使用for循环遍历即可,示例:
* if(cks!=null){
for(Cookie c:cks){
String name=c.getName();
String value=c.getValue();
System.out.println(name+":"+value);
}
}
* 注意:
* 一个Cookie对象存储一条数据。多条数据,创建多个Cookie对象进行存储
* 特点:
* 浏览器端的数据存储技术
* 存储的数据声明在服务器端
* 临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
* 定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求,都会附带该信息。
* 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径:
* /
/*
* session技术学习:
* 问题:
* 一个用户的不同请求处理的数据共享怎么办?
* 解决:
* 使用session技术
* 原理:
* 用户第一次访问服务器时,服务器会创建一个session对象给此用户,并将
* 该session对象的JSESSIONID使用cookie技术存储在浏览器中,保证
* 用户的其他请求能够获取同一个session对象,也保证了不同请求能够获取到
* 共享数据。
* 特点:
* 存储在服务器端
* 由服务器进行创建
* 依赖cookie技术
* 有效期:一次会话(不关浏览器)
* 默认存储时间是30分钟
* 作用:
* 解决了一个用户不同请求处理的数据共享问题。
* 使用:
* 创建session对象/获取session对象
* HttpSession hs=req.getSession();
* 如果请求中有session的标识符也就是JSESSIONID,则返回其对应的session对象
* 如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中
* 如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中
* 设置session存储时间
* hs.setMaxInactiveInterval(int seconds);
* 注意:
* 在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时(默认存储时间也是如此)
* 设置session强制失效
* hs.invalidate();
* 存储和获取数据
* 存储:hs.setAttribute(String name, Object name);
* 获取:hs.getAttribute(String name) 返回数据类型未object
* 注意:存储的动作和取出的动作可以发生在不同的请求中,但是存储要先于取出执行。
* 使用时机:
* 一般用户在登陆web项目时会将用户的个人信息存储到Session中,供该用户的其他请求使用。
* 总结:
* session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。
* 用户的任意请求在处理时都能获取到同一个session对象
* 作用域:
* 一次会话
* 在JSESSIOINID和SESSION对象不失效的情况下为整个项目内。
* session失效处理:
* 将用户请求中的JSESSIONID和后台获取到的SESSION对象的JESSIONID进行比对,如果一致,
* 则session没有失效,如果不一致则证明session失效了。失效了重定向到登陆页面,让用户重新登陆,
* 则会重新生成session对象
* 有效时间补充:
* 可以在tomcat conf/web.xml中session-config修改全局的所有项目的有效时间,默认30分钟
* 也可以将session-config标签放到项目的web.xml中来设置该项目的session有效时间
* 注意:
* JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效
* /
/*
* ServletContext对象
* 问题:
* 不同用户使用相同的数据
* 解决:
* ServletContext
* 特点:
* 服务器创建
* 用户共享
* 作用域:
* 整个项目内
* 生命周期:
* 服务器启动到服务器关闭
* 使用:
* 获取ServletContext对象
* //第一种方式
ServletContext sc=this.getServletContext();
//第二种方式
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式 监听器中会用到
ServletContext sc3=req.getSession().getServletContext();
* 使用ServletContext对象完成数据共享
* 数据存储
* sc.setAttribute(String name, Object obj);
* 数据获取
* sc.getAttribute(String name) 返回Object对象
* 注意:
* 不同的用户可以给ServletContext对象进行数据的存取
* 获取的数据不存在,返回null
* 获取项目中web.xml文件中的全局配置数据
* sc.getInitParameter("name"); //根据键的名字,返回web.xml中配置的全局数据的值,返回String数据类型
* 如果数据不存在,返回null
* sc.getInitParameterNames(); //返回键名的枚举
* 配置方式:一组context-param只能配置一组键值对数据,多组可以声明多个 context-param进行存储
*
name
zhangsan
作用:将静态数据和代码进行解耦。
获取项目webroot下的资源的绝对路径
* String path=sc.getRealPath(String path);
* 获取的路径为项目的根目录,path参数为项目根目录中的路径
* 获取项目webroot下的资源的流对象
* InputStream is=sc.getResourceAsStream(String path);
* 注意:
* 此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器
* path参数为项目根目录中的路径
* /
/*
* ServletConfig对象学习
* 问题:
* 如何获取在web.xml中给每个servlet单独配置的数据呢?
* 解决:
* 使用ServletConfig对象
* 使用:
* 获取ServletConfig对象
* 获取web.xml中的配置数据
* 项目中的web.xml与tomcat下的web.xml
* 位置:
* 每个Web项目中
* Tomcat服务器中(服务器目录conf目录中)
* 区别:
* Web项目下web.xml文件为局部配置,针对本项目
* Tomcat下的web.xml文件为全局配置,配置公共信息
* 内容(核心组件):
* 全局上下文配置(全局配置参数)
* Servlet配置
* 过滤器配置
* 监听器配置
* 加载顺序:
* Web容器会按ServletContext->context-para->listener->filter->servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置
* 加载时机:
* 服务器启动
* /
service.xml说明
<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Context />
</Host>
</Engine>
</Service>
</Server>
一个server可以配置多个service
tomcat服务器端口号 协议号 超时时间 重定向端口(服务器端口被占用 会重定向到该端口)
服务器集群端口
一个service只能有一个该配置。
HOST标签appBase属性 :项目存放目录
HOST标签name属性:项目的访问地址
热部署:
reloadable:为true时,自动加载,项目发生改变,tomcat会自动加载到内存。
注意:热部署模式下,路径下项目删除,tomcat启动会报错该项目。而在webapps目录下,有什么加载什么。
如果要删除热部署的项目,则一定要删除server.xml中的热部署配置