Servlet && Filter

j2ee源码位置:D:\MainSoftWare\myeclipse安装包\javaee源码

快捷键:重新打开myeclipse-->快捷键ctrl+e
Servlet3.0规范中,新增metadata-complete:为true时,web应用将不会加载注解配置的Web组件(Servlet、Filter、Listener等);
AsyncContext startAsync() 和startAsync(ServletRequest ,ServletResponse);  异步处理操作
1.http协议:超文本传输协议,传输html
       1.http协议是单向性的协议,先请求,后响应
       2.http协议执行过程:http1.1开始有长连接的概念(可以多次发送请求,多个响应请求)
          a.建立连接  
          b.发送请求
          c.响应请求
          d.断开连接 
       3.无状态的协议,只负责传输,对事物的处理没有记忆性
          1.客户端存储信息:cookie
          2.服务器存储信息:session
       4.http请求信息:url:绝对资源路径      uri本机的相对路径
          URI属于父类,而URL属于URI的子类。URI的定义是:统一资源标识符;对于URL的定义是:统一资源定位符。
          区别在于,URI表示请求服务器的路径,定义这么一个资源。而URL同时说明要如何访问这个资源(http://)
          请求行:请求方式、资源路径、协议和协议版本号
          请求头: 若干请求头
          请求正文:  get请求,请求的内容放在url地址栏;post请求,请求内容放在请求的内容body中
        5.响应信息:
           响应行:协议和协议版本号       响应的状态码(200,404,405,500)       状态码描述(OK)
           响应头:若干响应头
           响应正文: 

2.使用Servlet:  
      a在tomcat上运行的其实就是WebRoot下的文件,因为src目录下的文件会自动被编译生成对应的class文件在web-Inf/class目录下
      b.创建Servlet步骤:
         1:新建 web project,写上项目名称
       2:选择javaEE 5  选web 2.5 ---完成
       3:新建一个类,类要继承 httpSevlet
       4:重写service方法
       5:配置web.xml
<servlet>
  <servlet-name>TestServlet</servlet-name>
  <servlet-class>com.bjsxt.myServlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>TestServlet</servlet-name>
  <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
    注解式Servlet  访问时项目名/getapp
    @WebServlet(name="getApplicationAttribute",urlPatterns="/getapp")    //urlPatterns和value作用一样
  public class GetApplicationServlet extends HttpServlet{
    protected void service(HttpServletRequest req, HttpServletResponse res)
   web.xml形式:load-on-startup:指定的数值越小,优先级越高
   注解形式:  loadOnStartup 
  
   注解配置初始参数:   servlet-api.jar  注解需要加此包
   

 用户可以有多种方式访问Servlet,常见的有 浏览器地址栏访问、请求转发、重定向 form表单提交 超链接指向    。 

3.getOutputStream和getWriter区别:
   1.getOutputStream:返回Servlet引擎创建的ServletOutputStream字节输出流对象,按字节形式输出响应正文。
   2.getWriter:返回Servlet引擎创建的将Servlet引擎的数据缓冲区包装成PrintWriter字符输出流对象,按字符形式输出响应正文。
   3.getOutputStream和getWriter:两者互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  
   4.当service方法结束后,Servlet引擎将检查getWriter或getOutputStream输出流对象是否已经调用过close方法,
     如果没有,Servlet引擎将调用close方法关闭该输出流对象

4.如何避免405错误
    1.当实现类重写了service方法,就不能再调用父类(HttpServlet)的service  推荐
    2.如实现类重写service方法,并且调用了父类的service方法,则需要重写doGet或者doPost,
       并且不能再调用父类的doGet或doPost
    3.直接重写doGet或doPost

5.常见的url形式:
   <url-pattern>/FirstServlet</url-pattern>      //匹配FirstServlet请求
  <url-pattern>/one/*</url-pattern>      //匹配one目录下的所有请求
  <url-pattern>*.aaa</url-pattern>       //匹配所有以aaa结尾的请求
  错误:<url-pattern>/one/*.aaa</url-pattern>  

7.Servlet生命周期:
  默认懒汉单例模式,修改load-on-startup参数值(值越小,优先级越高,依次加载),变成饿汉模式
 1.加载初始化只执行一遍
 2.调用init(),创建对象,只执行一遍
 3.每个请求,servlet容器会new一个新的线程,调用service-->super.service-->doGet/doPost
     不要在Servlet中使用成员变量(因为当多个用户访问同一个对象的时候,可能会造成数据不安全(数据错乱));
 4.destroy 销毁Servlet

8.HttpServletRequest:由Servlet容器(tomcat等)创建,该对象包含了所有http协议的请求信息
   getMethod()和getContextPath()  常用
   getHeaderNames()   返回枚举类型Enumeration
   getParamter("name")   当name对应的jsp中找不到时,获取的内容是null
                                      当name可以找到时,但是这个名词值为"",则获取的内容也是""


9.HttpServletResponse:
   //响应行内容不需要我们处理,浏览器自动处理;
   当手动设置响应头时,同名的响应头会被覆盖       //setHeader
   添加响应头,同名的响应头不会被覆盖              //addHeader

10.乱码问题:
   post 请求时处理
      1.jsp页面设置pageEncoding="utf-8"
      2.servlet:   req.setCharacterEncoding("utf-8");    //设置请求信息的解码格式
   post响应信息处理:
      1.resp.setContentType("text/html;charset=utf-8");
         resp.setCharacterEncoding("utf-8");
         resp.getWriter.print("中文");

   get处理:
      1.跟post一样
      2.还要在tomcat的conf/server.xml进行修改 useBodyEncodingForURI="true"
       

11.forward():同一web应用内,把请求转发给目标组件   
     1.发生一次请求,url地址不会改变
     2.(在一个组件内已经请求转发过,不能再请求转发(可能出现500错误))避免多次请求转发,直接在forward之后加return;
         但是不同组件之间可以多次请求转发
     3.可以携带请求参数信息;效率相对较高
     4.使用场景:如登录页面;通常用于服务器内部资源跳转的时候用

     req.getRequestDispatcher("ServletRequest02").forward(req, resp);   //转发应该发生在同级目录
    req.getRequestDispatcher("/index.jsp").forward(req, resp);     加/代表从根目录转
    req.getRequestDispatcher("xxx/index.jsp").forward(req, resp); 或者加xxx/xxx.jsp
    <a href="servlet/ServletCharset?username=中文&pwd=sss">打开网页</a>

   include():包含目标组件的响应结果
           a.目标为Servlet或Jsp,调用service(),把响应正文添加到源组件的响应结果中;
              HTML直接把内容添加到源组件的响应结果中。
           b.返回源组件中,继续执行后续代码。
   servlet获取RequestDispatcher对象的两种方式:
   ServletContext的getRequestDispatcher(path)    //path为绝对路径    以“/”开头的路径
   ServletRequest的getRequestDispatcher(path)  //path为相对路径    不以“/” 开头的路径
   dispatcher.forward(req,res);
   dispatcher.include(req,res);

6.重定向:链接类似,可以发生在不同web应用
   1.发生两次请求;url地址栏会改变
   2.(在一个组件内已经重定向过,不能再重定向(可能出现500错误))避免多次重定向,直接在sendRedirect之后加return;
   但是不同组件之间可以多次重定向
   3.不可以携带请求参数信息,但是可以把请求参数写在重定向的地址后面(不推荐使用,如果想带参数,使用forward)
   4.效率相对较低
   5.退出登录时使用,访问的资源在服务器外部时,必须使用重定向

   4.location 以“/”开头表示相对于当前服务器根路径的URL;以http://开头,表示一个完整的URL;可以是web内部组件也可以是任意网页。
   res.sendRedirect("/helloApp/output?msg="+message);

7.cookie:
   1.将http协议信息保存在客户端的技术
   2.Cookie由服务器Servlet创建,由servlet服务器发送给浏览器,最终被浏览器保存,
      当再次访问servlet的时候会带上cookie信息。  
   3.当cookie没有设置有效时间,则cookie会保存在浏览器的内存中,当关闭浏览器,cookie就会被销毁。
   4.设置cookie有效期后,则会保存在硬盘。
   5.cookie信息如果同名,客户端保存信息时会被覆盖
   Cookie cookie=new Cookie("user","kkk");     //创建cookie
   cookie.setMaxAge(60*60);        //单位秒
  nameCookie.setPath(req.getContextPath()+"/SetCookie");      
   //设置浏览器存放路径,访问mydemo/SetCookie才会显示该cookie       SetCookie为form的action名字(
   即servlet的url-pattern)
   resp.addCookie(cookie);       //发送cookie
   
    查看cookie:
    Cookie[] cook=req.getCookies();
  c.getName();  c.getValue();
  1. Set-Cookie:
    user=kkk //resp
  2. Cookie:
    user=kkk //req

8.session(服务器端):
  会话:相当于客户端和服务器端的多个请求和响应
      会话开始:客户端发送请求
      会话结束:
            客户端结束:关闭浏览器:清除cookie信息,sessionId也随之被销毁
            服务端结束:a:session超时  b:超过最大不活动周期  c:强制session失效

  1.适合保存大量的数据,安全,效率高,session跟踪机制需要cookie来保存和传递sessionId
     能否取消cookie?   不能,因为session的id需要cookie来保存, 也称session的跟踪机制
     cookie(客户端):不适合保存大量的数据,不安全,效率低。
  2.强制session失效    req.getSession().invalidate();//全部的session失效?
     移除会话: req.getSession().removeAttribute("userRealName");

  设置session有效时间,单位分钟
    a.在项目web.xml配置  
    b.在tomcat的web.xml配置   
    <session-config>
     <session-timeout>10</session-timeout>
   </session-config>
     c.设置最大不活动周期:
        session.setMaxInactiveInterval(10);    10秒最大不访问
      
9.获取初始化信息servletConfig:
   ServletConfig sc=this.getServletConfig();
   sc.getInitParameter()     //获取web.xml中init-param的参数值 

10.一个web应用只有一个ServletContext对象,所有的servlet都共享这个ServletContext对象(又称application对象,作用域)
    三种方式获取ServletContext:
     1.ServeltContext sc=this.getServletContext();           sc.getContentPath() 同req.getContextPath()效果相同
     2.ServletContext sc02=this.getServletConfig().getServletContext();
     3.ServletContext sc02=this.getSession().getServletContext()
        sc.getRealPath()     //获取文件绝对路径(包含项目部署在tomcat下的绝对路径)
        sc.getResourcepath()  //获取文件夹下的文件路径(只能作用倒数一层);
        sc.getResourceAsStream(“/index.jsp”)  //获取资源文件
     
11.作用域:
      UUID uuid=UUID.randomUUID();      //生成不重复的一个随机字符串
      uuid.toString().replaceAll("-","");        //将 - 替换成空串,常用于公司数据库表的id
      生命周期:数据在web应用内部传递(同时满足:1.生命周期  2.作用范围)
             req:在一次请求之间
             session:
                       开始:客户端第一次发生请求就开始
                       结束:1.客户端关闭浏览器(丢失JsessionID)  2.设置session超时时间    3.强制session失效
             ServletContext: 
                       开始:web项目启动时候就存在
                       结束:服务器停止

     作用范围:  
             req:所有被请求转发过的Servlet        
             session:作用于所有的Servlet
             ServletContext:作用于所有的Servlet
   使用方式:request:和当次请求相关的内容用request作用域
                       session:和当前用户相关的信息用session作用域
                       ServletContext:存放公共不常改变的数据

12.路径问题:
     a.请求转发/跳转到项目根目录
         req.getRequestDispatcher("/").forward(req,resp);
     b.重定向/跳转到服务器根目录:
         resp.sendRedirect("/");
         return;
     服务器根目录:http://localhost:8080/
     项目根目录:http://localhost:8080/bjsxt/ 

Filter:
   1.对用户请求进行预处理,再将请求交给Servlet进行处理并生成响应,最后对服务器响应进行处理。
   创建流程:
        a.创建Filter     b.在web进行配置
   chain.doFilter(),之前进行数据的请求处理;之后对服务器响应的处理。
  2.URL Rewrite: http://download.csdn.net/download/bestbanana/5839169
   
  3.自定义拦截器,实现Filter
     web.xml中,监听器配置在过滤器的下面,Servlet的上面
     过滤器在项目启动的时候,就会被加载,但不关心加载顺序,只关注执行的顺序(满足前提条件下,顺序与配置有关系)    
     filter-mapping可以搭配servlet-name一起使用

Listener:
  a.主要监听生命周期(init destroy)  b.作用域的变化
  1.ServletContextListener:监听web的启动和关闭
  2.ServletContextAttributeListener:监听ServletContext(application)范围内属性的改变
  3.ServletRequestListener:监听用户的请求
  4.ServletRequestAttributeListener:监听用户ServletRequest(request)的属性改变
  5.HttpSessionListener:监听用户session的开始和结束
  6.HttpSessionAttributeListener:监听用户session的属性改变























posted on 2018-03-06 18:04  xiaojiayu0011  阅读(156)  评论(0)    收藏  举报

导航