Servlet快速入门
Posted ylcc-zyq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet快速入门相关的知识,希望对你有一定的参考价值。
一、servlet的生命周期
- 第一次调用到服务器关闭
- 如果servlet配置 load-on-startup为1时,生命周期为服务器启动到服务器关闭。
注意:init方法是对servlet进行初始化的一个方法,会在servlet第一次加载进行存储时执行。destroy方法是在servlet被销毁时执行,也就是服务器关闭时。
二、Service方法和doGet方法和doPost方法的区别
- Service方法:可以处理get/post方式的请求,如果servlet中有service方法,会优先调用service方法
- doGet方法:处理get方式的请求
- doPost方法:处理post方式的请求
注意:在父类的service方法中,会判断请求方式来执行doGet或者doPost方法。所以,一般不在重写的service中调用父类的service方法,避免出现错误。
三、request对象学习
-
作用:request对象中封存了挡当前请求中的所有请求信息
-
使用:
- 获取请求行数据
- req.getMethod(); 获取请求方式
- req.getRequestURL(); 获取请求URL信息
- req.getRequestURI(); 获取请求URI信息
- req.getScheme(); 获取协议
- 获取请求头数据
- req.getHeader(键名); 返回指定的请求头信息
- req.getHeaderNames(); 返回请求头的键名的枚举集合
- 获取用户数据
- req.getParameter(键名); 返回指定的用户数据
- req.getParameterValues(键名); 返回同键不同值的请求数据(多选),返回的数组
- req.getParameterNames() 返回所有用户请求数据的枚举集合
- 获取请求行数据
-
注意:request对象由tomcat服务器创建,并作为实参给处理请求的servlet的service方法
四、respons对象学习
- 作用:用来响应数据到浏览器的一个对象
- 使用:
-
设置响应头
- setHeader(String name,String value);在响应头中添加响应信息,但是同键会覆盖
- addHeader(String name,String value);在响应头中添加响应信息,但是不会覆盖
-
设置响应状态
- sendError(int num,String msg);自定义响应状态码
-
设置响应实体
- resp.getWriter().writer(String str);响应具体的数据给浏览器
-
设置响应编码格式:
- resp.setContentType("text/html;charset=utf-8");
- resp.setHeader("content-type","text/html;charset=utf-8");
-
service请求处理代码流程:
- 设置响应编码格式
- 获取请求数据
- 处理请求数据(MVC思想)
- 响应处理结果
五、请求中文乱码的解决
- 使用String进行数据重新编码
uname=new String(uname.getBytes("iso8859-1"),"utf-8"); - 使用公共配置
- get方式:
步骤1:req.setCharacterEncoding("utf-8");
步骤2:在tomcat的conf目录下的server.xml文件中,在Connector标签中增加属性useBodyEncodingForURI=true - post方式:
req.setCharacterEncoding("utf-8");
- get方式:
六、servlet流程总结
- 浏览器发送请求到服务器
- 服务器接受请求,进行解析,创建request对象存储请求数据
- 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
- servlet的方法进行请求处理(需要实现):
- 设置请求编码格式
- 设置响应编码格式
- 获取请求信息
- 处理请求信息
- 创建业务层对象
- 调用业务层对象的方法
- 响应处理结果
七、请求转发
- 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确
- 使用:req.getRequestDispatcher("page").forward(req,resp);
- 特点:一次请求,浏览器地址栏信息不改变
- 注意:请求转发后直接return结束即可
八、request对象的作用域
- 作用:使用请求转发后,为了让不同的servlet之间进行数据的共享,实现数据在不同servlet之间的流转,使用request对象的作用域解决了一次请求内的不同servlet的数据共享问题。
- 使用:
- req.setAttribute(Object name,Object value)
- req.getAttrubute(Object obj)
- 作用域:基于请求转发,一次请求中的servlet共享
- 注意:使用Reques对象进行数据流转,数据只在一次请求内有效
- 特点:
- 服务器创建
- 每次请求都会创建
- 生命周期一次请求
九、重定向
- 问题:
- 如果当前的请求,servlet无法进行处理怎么办
- 如果使用请求转发,造成表单数据重复提交怎么办
- 解决:使用重定向
- 使用:resp.sendRedirect(String url);
- 特点:
- 两次请求,两个request对象
- 浏览器地址栏信息改变
- 时机:
- 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向
- 如果请求被servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源
十、Cookie
- 作用:解决了发送的不同请求的数据共享问题
- 使用:
- cookie的创建和存储
- 创建Cookie对象:Cookie c = new Cookie(String name,String value);
- 设置cookie
- 设置有效期:c.setMaxAge(int seconds);
- 设置有效路径:c.setPath(String uri);
- 响应Cookie信息给客户端:resp.addCookie(c);
- cookie的获取
- 获取cookie信息数组: Cookie cks=req.getCookies();
- 遍历数组获取cookie信息:使用for循环遍历即可,先进行非空判断
- 注意:一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
- cookie的创建和存储
- 特点:
- 浏览器端的数据存储技术
- 存储的数据声明在服务器端
- 临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
- 定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
- 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径,这样当浏览器访问设置的uri时,发送的请求才会带上cookie。
十一、session技术学习
- 作用:解决一个用户的不同请求处理的数据共享问题
- 原理:用户第一次访问服务器。服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。
- 特点:
- 存储在服务器端,服务器进行创建
- 依赖cookie技术
- 一次会话
- 默认存储时间是30分钟
- 使用:
- 创建或获取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 value);
- 获取:hs.getAttribute(String name) 返回的数据类型为Object
- 存储和取出的动作发生在不同的请求中,但是存储要先于取出执行。
- 使用时机:一般用户在登录web项目时会将用户的个人信息存储到session中,供该用户的其他请求使用。
- 总结:session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求都能够获取到同一个session对象。
- 作用域:一次会话。在JSESSIONID和session不失效下为整个项目。
- session失效处理:将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一直则session没有失效,如果不一致则证明session失效了。重定向到登录页面。
- 注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效
十二、ServletContext学习
- 作用:解决不同用户共享数据的问题
- 特点:服务器创建,用户共享
- 作用域:整个项目内
- 生命周期:服务器启动到服务器关闭
- 使用:
-
获取ServletContext对象
- ServletContext sc=this.getServletContext();
-
使用ServletContext对象完成数据共享
- 数据存储:sc.setAttribute(String name,Obejct value);
- 数据获取:sc.getAttribute(String name);返回的是object类型
- 不同的用户可以对ServletContext对象进行数据的存储,获取的数据不返回null。
-
获取web.xml文件的全局配置数据(将静态数据和代码进行解耦)
- sc.getInitParameter(String name);根据键名返回web.xml配置的全局数据的值,返回String类型。如果数据不存在返回null
- sc.getInitParameterNames();返回简明的枚举
- 配置方式:一对context-param只能存储一组键值对
<context-param> <param-name>name</param-name> <param-value>value</param-value> </context-param>
-
获取web目录下的绝对路径:String path=sc.getRealPath(String path).获取的路径为项目根目录,path参数为项目根目录中的路径。
-
十三、ServletConfig对象学习
- 作用:获取在web.xml中给每个servlet单独配置的数据
- 使用:
- 获取ServletConfig对象:ServletConfig sc = this.getServletConfig()
- 获取web.xml中servlet的配置信息:
标签配置
十四、web.xml文件使用总结
- 作用:存储项目相关的配置信息,保护Servlet.解耦一些数据对程序的依赖
- 使用位置:
- 每个Web项目中
- Tomcat服务器中(在服务器目录conf目录中)
- 区别:
- web项目下的web.xml文件为局部配置,针对本项目的配置
- Tomcat下的web.xml文件为全局配置,配置公共信息
- 内容(核心组件):
- 全局上下文配置(全局配置参数)
- Servlet配置
- 过滤器配置
- 监听器配置
- 加载顺序:web容器会按ServletContext->context-param->listener->filter->servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。
以上是关于Servlet快速入门的主要内容,如果未能解决你的问题,请参考以下文章