第一章使用IDEA开发Servlet
1.怎么编写Servlet类
使用Servlet创建动态网页的第一步,就是创建Servlet类
Servlet 规范的最顶层是一个名为 javax.servlet.Servlet 的接口,所有的 Servlet 类都要直接或者间接地实现该接口。直接实现 Serviet接口不太方便,所以 Servlet 又内置了两个 Servlet 接口的实现类(抽象类),分别为 GenericServlet 和HtpServlet。
因此,创建Servlet类有如下三种方式:
实现javax.servlet.Servlet 接口,重写其全部方法。
继承javax.servlet.GenericServlet抽象类,重写service()方法。
继承javaxservlethttp.HttpServlet抽象类,重写doGet()或doPost0)方法。
一般第三种方式使用最多。
2.Servlet、GenericServlet 、HttpServlet三者的关系
GenericServlet 是实现了Servlet接口的抽象类。
HttpServlet是GenericServlet 的子类,具有 GenericServlet 的一切特性。
Servlet程序(MyServlet 类)是一个实现了 Servlet 接口的Java类。
MyServlet为自己编写的Servlet类
3.核心API
Servlet就是实现了Servlet接口的类,它由Web服务器创建并调用,用于接收和响应用户的请求,
在Servlet接口中定义了五个抽象方法
方法说明 |
说明 |
init(ServletConfig config) |
Servlet实例化后,Servlet容器调用该方法完成Servlet的初始化工作 |
ServletConfig getServletConfig() |
获取Servlet对象的配置信息 |
String getServletInfo() |
返回包含Servlet信息的字符串,如作者,版权等 |
service(ServletRequest req,ServletResponse resp) |
负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时就会调用此方法。容器会构造一个表示客户端请求信息的ServletRequest对象和一个用于响应客户端的ServletResponse对象作为参数传递给service()方法,在service()方法中可以通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse |
destroy() |
负责释放Servlet对象占用的资源,当服务器关闭或者Servlet对象被移除时会销毁Servlet对象,此时会调用此方法 |
编写的Servlet类必须实现Servlet接口或者继承Servlet接口的实现类,如GenericServlet和
HttpServlet,这两个类都是抽象类并且HttpServlet继承了GenericServlet,其中GenericServlet
有一个抽象方法service(),而HttpServlet没有抽象方法。
第二章Requset和Response
从编写Servlet的过程中可以看出,doGet(或者doPost方法中有两个参数,分别是HttpServletRequest和HttpServletResponse,当执行Servlet的时候会从HttpServetRequest读取请求信息,而将响应信息封装进HttpServletResponse对象中
1.Requset 和 Response 对象的原理
Requset 和 Response 是有服务器创建的.我们只是使用
Requset 是来获取请求消息,Response 是来设置响应消息的.
继承体系结构
ServletRequest (接口)<–继承-- HttpServletRequest (接口) <–实现— RequestFacade 类(tomcat 创建)
Requset 功能
1.获取请求行数据;
2. 获取 servlet 路径;
3. 获取get方式请求参数 ;
4. 获取请求
Response 功能
1.功能:主要是设置响应消息;
2. 服务器输出字符数据到浏览器注意事项;
2.中文乱码问题
中文乱码就是值在请求信息或者响应信息中包含的中文字符不能正常显示。产生原因无非就是客户端与服务器采用的编码方式不同导致的。
根据请求方式的不同,请求一般可以被分为两种:GET请求和POST请求,
POST请求
乱码的原因:POST 提交的数据在请求体中,其所使用的编码格式时页面一致(即utf-8)。request 对象接收到数据之后,会将数据放到request缓冲区,缓冲区的默认字符集是SO-8859-1(该字符集不支持中文),两者使用的字符集不一致导致乱码。
解决方案:在获取请求参数之前设置request缓冲区字符集为utf-8。
//修改request缓冲区的字符集为UTF-8
request.setcharacterEncoding("utf-8");
// 获取用户名
string username = request.getParameter("username");
第三章过滤器
什么是过滤器?
Filter中文意思为过滤器。顾名思义,过滤器可在浏览器以及目标资源之间起到一个过滤的作用。例如:水净化器,可以看成是生活中的一个过滤器,他可以将污水中的杂质过滤,从而使进入的污水变成净水。对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息。WEB资源可能包括ServletJSPHTML页面等。
Filter是Tomcat容器内的过滤器,在请求到达容器是先会调用过滤器,再调用我们的servlet或者isp
当服务器收到特定的请求后,会先将请求交给过滤器,程序员可以在过滤器中对请求信息进行读取修改等操作,然后将请求信息再发送给目标资源。目标资源作出响应后,服务器会再次将响应转交给过滤器,在过滤器中同样可以对响应信息做一些操作,然后再将响应发送给浏览器。
也就是说过滤器可以在WEB资源收到请求之前,浏览器收到响应之前,对请求和响应信息做一些相应的操作。在一个WEB应用中可以部署多个过滤器,多个过滤器就组成了一个过滤器链,请求和响应必须在经过多个过滤器后才能到达目标过滤器不是必须将请求传送到下一个过滤器(或WEB资源),也可以自己来处理请求,发送响应。
过滤器原理
当我们使用过滤器时,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分
1.放行之前的代码
2.放行
3.放行后的代码
这3个部分分别会发挥不同作用。
第一部分代码会对游览器请求进行第一次过滤,然后继续执行
第二部分代码就是将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器
第三部分代码就是对返回的Web资源再次进行过滤处理
filter的实现
编写Filter和编写Servlet类似,都需要实现接口。
编写Filter需要实现Filter接口,我们来看一下Filter接口的主要方法:
Filter接口,实现Filter需要实现该接口
1.init()方法用于初始化Filter
2doFilter()作用和service()方法类似,是过滤请求和响应的主要方法。
3destroy0)用于在Filter对象被销毁前做一些收尾工作。如:释放资源等。
FilterConfig对象在服务器调用init()方法时传递进来
1getFilterName0)获取Filter的名字
2.getServletContext0)获取ServletContext对象(即application)
3getlnitParameter0获取Filter的初始化参数
filter应用
filter的生命周期
Filter的生命周期和Servlet类似
构造器:创建Filter实例是调用,Filter实例服务器一旦启动就会被创建
init0:实例创建后马上被调用,用来对Flter做一些初始化的操作
doFilter0:Filter的主要方法,用来完成过滤器主要功能的方法,每次访问目标资源时都会调用。
destroy0:服务器停止时调用,用来释放资源
flter过滤器链
过滤器可以组成一个过滤器链,链中的每个过滤器都可以负责特定的操作和任务客户端访问服务器的请求和响应在这些过滤器链之间传递FilterChain接口用于调用过滤器链中的一系列过滤器