Servlet学习笔记
Servlet概念:狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只是用来扩展基于HTTP协议的Web服务器(可以理解为Servlet是...
目录
service()和doGet()和doPost()方法的区别
Servlet
概念:
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只是用来扩展基于HTTP协议的Web服务器(可以理解为Servlet是服务器与程序员之间的协议或规定,必须实现Servlet的类)
特点:
运行在支持java的应用服务器上
Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动根据请求调用对应的servlet进行请求处理。
简单方便、可移植性强
使用:
eg:
A:创建普通的java类并继承HttpServlet
B:覆写service方法
C:在service方法中书写逻辑代码即可
D:在WEB-INF文件夹下的web.xml文件中配置servlet
运行流程:
URL组成:服务器地址:端口号/虚拟项目名/servlet的别名
URI:虚拟项目名/servlet的别名
浏览器发送请求到服务器,服务器根据请求URL地址中的信息在webapps目录下找到对应的项目文件夹,然后在web.xml中检索对应的servlet,找到后调用并执行Servlet
Servlet的生命周期
A:从第一次调用到服务器关闭
B:如果Servlet在web.xml中配置了load-on-startup,生命周期为从服务器启动到服务器关闭
注意:
init()方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
destory()方法是在Servlet被销毁时执行,也就是服务器关闭时。
service()和doGet()和doPost()方法的区别
service()方法:
不管是get方式还是post方式的请求,如果Servlet类中有service()方法,则优先调用service()方法。
doGet()方法:
在没有service()方法的情况下如果是get方式的请求所调用的处理请求的方法
doPost()方法:
在没有service()方法的情况下如果是post方式的请求所调用的处理请求的方法
注意:
如果在复写的service()方法中调用了父类的service()方法(super.service(arg0, arg1)),则service()方法处理完后,会再次根据请求方式响应的doGet()和doPost()方法执行。所以,一般情况下是不在覆写的service()方法中调用父类的service()方法的,避免出现405错误
Servlet的常见错误:
404错误:资源未找到(URL书写错误)
原因一:在请求地址中的Servlet的别名书写错误。
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:java.lang.ClassNotFoundException: *******
解决:在web.xml中校验servlet类的全限定路径是否拼写错误
错误二:因为service()方法体中代码执行错误导致
解决:根据错误提示对service()方法中的代码进行错误更改。
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service()方法进行请求处理,并且不要在service()方法中调用父类的service。
Servlet在运行时服务器会调用service()方法,并创建了Request对象和Respone对象
Request对象学习:
作用:
Request对象中封存了当前请求的所有请求信息
使用:
获取请求行数据
req.getMethod(); //获取请求方式
req.getRequestURL(); //获取请求URL
req.getRequestURI(); //获取请求URI
req.getScheme(); //获取协议
获取请求头数据
req.getHeaderNames(); //获取所有请求头的键的枚举
req.getHeader("键名"); //获取指定键的信息
获取用户数据
req.getParameter("键名"); //获取指定键的用户数据
req.getParameterValues("键名"); //获取同键不同值的用户数据(多选),返回的为数组
注意:
如果要获取的请求数据不存在,不会报错,返回为null.
Request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service()方法。
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思想)
响应处理结果
请求乱码问题解决:
A:使用String进行数据重新编码
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
B:使用公共配置
get方式:
在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性useBodyEncodingForURI="true"
req.setCharacterEncoding("utf-8");
post方式:
req.setCharacterEncoding("utf-8");
Servlet流程总结:
浏览器发起请求到服务器(请求)
服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法执行进行请求处理
//设置请求编码格式
//设置响应编码格式
//获取请求信息
//处理请求信息
//创建业务层对象
//调用业务层对象的方法
//响应处理结果
请求转发学习:
作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
使用: req.getRequestDispatcher("要转发的地址").forward(req, resp);
地址:相对路径,直接书写servlet的别名即可。
特点:一次请求,浏览器地址栏信息不改变。
注意:请求转发后直接return结束即可。
Servlet请求转发路径:
/表示项目根目录
req.getRequestDispatcher("/资源路径").forward(req,resp);
request作用域:
解决了一次请求内的servlet的数据共享问题
重定向:
解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
使用:resp.sendRedirect(String uri);
特点:两次请求,两个request对象。浏览器地址栏信息改变。
时机:如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
Servlet重定向路径总结:
相对路径:从当前请求的路径查找资源的路径
相对路径如果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信息存储好之后,每次请求都会附带,除非设置有效路径
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 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.getInitParamter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。数据不存在返回null
sc.getInitParamterNames(); 返回键名的枚举
配置方式:注意一组<context-param>标签只能存储一组键值对数据,多组数据可以声明多个<context-param>进行存储。
获取项目web下的资源的绝对路径。
String path = sc.getRealPath(String path);
获取的路径为项目根目录,path参数为项目根目录中的路径
获取web下的资源流对象
InputStream is = sc.getResourceAsStream(String path);
注意:此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
ServletConfig对象学习:
作用:
解决获取在web.xml中给每个servlet单独配置的数据问题
使用:
获取ServletConfig对象
ServletConfig sc = this.getServletConfig();
使用web.xml中的配置数据
sc.getInitParmeter(String name);
Web.xml文件使用总结:
作用:
存储项目相关的配置信息,保护Servlet。解耦一些数据对程序的依赖。
使用位置:
每个Web项目中
Tomcat服务器中(在服务器conf目录中)
区别:
Web项目下的web.xml文件为局部配置,针对本项目的位置。
Tomcat下的web.xml文件为全局配置,配置公共信息。
内容(核心组件):
全局上下文配置(全局配置参数)
Servlet配置、过滤器配置、监听器配置
加载顺序:
Web容器会按ServletContext ->context-param ->listener ->filter ->servlet 这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。
加载时机:
服务器启动时。
Servler.xml文件
核心组件
<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Connector />
<Host>
<Engine>
<Service>
<Server>
热部署:
<Context path ="" reloadable="true" docBase = "项目路径" />
更多推荐
所有评论(0)