0.Servlet用于处理客户端(浏览器)传到Web服务器上的Http请求,并返回响应给Web服务器,最后Web服务器再发回客户端 .
Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求.
Servlet是线程不安全的。不会同步阻塞。
1.一般的Servlet要继承HttpServlet,重写doGet()、doPost()等方法,然后在web.xml里面配置。
HttpServlet类继承GenericServlet类,GenericServlet类实现Servlet接口
HttpServletRequest类实现ServletRequest类
客户机和服务器之间进行请求-响应时,get表示从服务器获取数据,post表示向服务器提交数据
2.web.xml一般放在WEB-INF文件夹下面。
web-inf目录是不对外开放的,外部没办法直接访问到(即不能通过URL访问)。
所有只能通过映射来访问,比如映射为一个action或者servlet通过服务器端跳转来访问到具体的页面。这样可以限制访问,提高安全性。
每次修改web.xml,都要重新启动服务器,这样配置才能生效.
web.xml如下所示:
<servlet> <servlet-name>HttpSessionDemo</servlet-name> <servlet-class>com.servlet.HttpSessionDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>HttpSessionDemo</servlet-name> <url-pattern>/session</url-pattern> </servlet-mapping>
servlet-name:servlet名称,在<servlet>和<servlet-mapping>应保持一致
servlet-class:servlet的包名.类名
url-pattern:输入到浏览器便于访问的虚拟目录
welcome-file-list:表示首页,默认是index.jsp
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
3.Servlet生命周期:加载、初始化(init方法)、服务(doGet()和dePost()方法)、销毁(destroy())
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求。
服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法
(5)卸载:调用destroy()方法让servlet自己释放其占用的资源
destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法
4.作用域分为:page、request 、session 、application
常用方法:
request:getParameter()、request.setAttribute()、request.getAttribute()
getAttribute和getParameter区别:
request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据(比如jsp表单提交的数据)。
客户端跳转和服务器跳转区别:
客户端跳转:resp.sendRedirect() ,跳转后浏览器地址栏改变
服务器跳转:req.getRequestDispatcher().forward(req,resp),跳转后浏览器地址栏不变。
5.Servlet分类:简单Servlet、过滤器Filter、监听器Listener
6.Filter,过滤器。可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
它使用户可以改变一个request和修改一个response。
Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.
Filter接口定义了三个方法: init() , doFilter(), destroy()
FilterChain : 过滤链
init()和destroy()方法只会被调用一次,而且在程序加载或者卸载时调用。而doFilter()方法每次有客户端请求都会被调用一次。
filterChain.doFilter(request,response)将request递交给FilterChain中的下一个Filter,如果所有的Filter都走完了则交给Servlet处理。
Filter可用于编码过滤,日志过滤,权限验证,内容替换,文件上传
过滤器的类,需要implements接口Filter,重写doFilter()方法。然后在web.xml里面配置,如下所示:
<filter> <filter-name>ImageRedicrectFilter</filter-name> <filter-class>com.filter.ImageRedicrectFilter</filter-class> </filter> <filter-mapping> <filter-name>ImageRedicrectFilter</filter-name> <url-pattern>/images/*</url-pattern> </filter-mapping>
7.监听器Listener类似于java swing、安卓界面中的Listener监听事件。
Listener用于监控context,session,request相关的事件.
监听器的类需要实现Listener接口,当触发事件时,就会调用相应的Listener方法.
常见的Listener接口有ServletContextListener。
Listener同样需要在web.xml中进行配置.
<listener> <listener-class> com.listener.ServletContextListenerDemo </listener-class> </listener>
8.forward和redirect的区别?