Servlet 复习
一、request和response
1-1 request对象学习:
-
作用:request对象中封存了当前请求的所有请求信息
-
使用:
获取请求头数据
req.getMethod();//获取请求方式
req.getRequestURL();//获取请求URL信息
req.getRequestURI();//获取请求URI信息
req.getScheme();//获取协议
获取请求行数据
req.getHeader(“键名”);//返回指定的请求头信息
req.getHeaderNames();//返回请求头的键名的枚举集合
获取用户数据
req.getParameter(“键名”);//返回指定的用户数据
req.getParameterValues(“键名”);//返回同键不同值的请求数据(多选),返回的数组。
req.getParameterNames()//返回所有用户请求数据的枚举集合
注意:
如果要获取的请求数据不存在,不会报错,返回null。 -
注意:
request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
1-2 Respone对象学习:
- 作用:
用来响应数据到浏览器的一个对象 - 使用:
设置响应头
setHeader(String name,String value);//在响应头中添加响应信息,但是同键会覆盖
addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖。
设置响应状态
sendError(int num,String msg);//自定义响应状态码。
设置响应实体
resp.getWrite().write(String str);//响应具体的数据给浏览器
设置响应编码格式:
resp.setContentType(“text/html;charset=utf-8”); - 总结:
service请求处理代码流程:
设置响应编码格式
获取请求数据
处理请求数据
数据库操作(MVC思想)
响应处理结果
1-3 Service方法和doGet方法和doPost方法的区别
- Service方法:
可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理。 - doGet方法:
处理get方式的请求 - doPost方法:
处理post方式的请求 - 注意:
如果在覆写的service方法中调用了父类的service方法(super.service(arg0, arg1)),
则service方法处理完后,会再次根据请求方式响应的doGet和doPost方法执行。所以,一般情况下
我们是不在覆写的service中调用父类的service方法的,避免出现405错误。
1-4 Servlet的生命周期:
1、从第一次调用到服务器关闭。
2、如果Servlet在web.xml中配置了load-on-startup,生命周期为从服务器启动到服务器关闭
注意:
init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
destory方法是在servlet被销毁时执行,也就服务器关闭时。
1-5 Servlet的常见错误:
- 404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误 - 500错误:内部服务器错误
错误一:
java.lang.ClassNotFoundException: com.bjsxt.servlet.ServletMothod
解决:
在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:
因为service方法体的代码执行错误导致
解决:
根据错误提示对service方法体中的代码进行错误更改。 - 405错误:请求方式不支持
原因:
请求方式和servlet中的方法不匹配所造成的。
解决:
尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service。
二、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 value);
获取:hs.getAttribute(String name) 返回的数据类型为Object
注意:
存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
使用时机:
一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。 - 总结:
session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。
用户的任意请求在处理时都能获取到同一个session对象。
作用域:
一次会话
在JSESSIONID和SESSION对象不失效的情况下为整个项目内。
session失效处理:
将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致
则session没有失效,如果不一致则证明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 value); //数据获取 sc.getAttribute("str") 返回的是Object类型 注意: 不同的用户可以给ServletContext对象进行数据的存取。 获取的数据不存在返回null。 获取项目中web.xml文件中的全局配置数据 sc.getInitParameter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。 如果数据不存在返回null。 sc.getInitParameterNames();返回键名的枚举 配置方式:注意 一组<context-param>标签只能存储一组键值对数据,多组可以声明多个 <context-param>进行存储。 <context-param> <param-name>name</param-name> <param-value>zhangsan</param-value> </context-param>
作用:将静态数据和代码进行解耦。
获取项目webroot下的资源的绝对路径。
String path=sc.getRealPath(String path);
获取的路径为项目根目录,path参数为项目根目录中的路径
获取webroot下的资源的流对象
InputStream is = sc.getResourceAsStream(String path);
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
path参数为项目根目录中的路径