java web-servlet

33 篇文章 0 订阅
7 篇文章 0 订阅
  1. Servlet是一个JavaEE的组件,也是JavaEE中的一个规范
    该规范有以下约束.
    1:约束服务器  服务器其实是对Servlet的实现.
    2:约束web的项目结构
    3:约束程序的执行
  2. Servlet是一个JavaEE的组件:
         Servlet是一个程序(类),只不过必须要遵循Servlet的规范.
         要求类:必须实现javax.servlet.Servlet接口.
  3. Servlet属于JavaEE的范畴,只依赖JavaSE是不能开发的,得依赖JavaEE的jar.
    ----------------------------------------------------------
    Servlet的第一个程序编写步骤:
         1):拷贝Tomcat根/lib/servlet-api.jar到项目的WEB-INF/lib目录中,并做build path.
         2):编写Servlet程序,使之实现javax.servlet.Servlet接口,并覆盖接口中的方法.
            public class HelloServlet implements javax.servlet.Servlet{...实现方法...}
         3):发现方法中参数出现arg0,arg1的情况是因为没有关联Servlet的源代码.
            Tomcat的源代码程序:apache-tomcat-7.0.57-src.zip
         4):在service(ServletRequest req, ServletResponse res)方法,打印一句话.
            告诉Tomcat管理HelloServlet类.(Tomcat是Servlet的容器,会负责Servlet对象的生命周期和方法调用).
        tomcat 在context.xml文件中配置 这个值, 表示启动后会加载web项目中web.xml文件

            所以,得以配置的形式,告诉Tomcat来帮我们管理自定义的Servlet类.
         Servlet配置,如右图的web.xml:


  4. 部署项目,并访问:
       server.xml中:
       <Context docBase="web项目的根路径" path="上下文路徑--用于区分不同項目"/>
       访问:
       http://ip:port/contextPath/资源名(url-pattern)
       http://localhost:80/day3/hello

  5. 生命周期:从出生--->死亡,中间的过程.
    Servlet的生命周期:创建对象,初始化操作,运行操作,销毁操作.
    Tomcat管理了Servlet对象的生命周期
    -------------------------------------------------------------------------
    javax.servlet.Servlet接口中的方法:

    void init(ServletConfig config):初始化当前Servlet类对象方法: 相关参数初始化
    void service(ServletRequest req, ServletResponse resp):服务方法, servlet在这个方法中实现逻辑功能
    void destroy():销毁Servlet对象方法., tomcat服务器正常关闭时候,才调用                           
    String getServletInfo():   获取当前Servlet的信息(Servlet的作者,版本,版权相关).
    ServletConfig getServletConfig(): 获取当前的Servlet类的配置信息对象.

    -------------------------------------------------------------------------
    生命周期方法:
    在Web的生命周期中(Tomcat启动->Tomcat关闭),当前Servlet类是单例的.
    -------------------------------------------------------------------------
    构造器:在服务端程序第一次被请求的时候,调用,只被调用一次.
    void init(ServletConfig config):在构造器执行完毕之后,调用init方法,也只会执行一次.
    void service(ServletRequest req, ServletResponse resp):每一次请求都会执行该方法.
    void destroy():正常关闭Tomcat才会执行(该方法不一定会被执行,我们没必要在其中编写扫尾的操作).
    总结:
          构造器--->init方法---->[ service方法 ]循环 ---->destory方法
    -------------------------------------------------------------------------
    注意:
        1):Servlet类的构造器必须提供一个public无参构造器..
        原因:  底层创建Servlet对象:Class.newInstance()方式.--->公共的无参数构造器.

    -----------------------------------------------------------------------------------------

    Servlet的请求流程:
       1:浏览器先发送请求:http://localhost:80/day3/hello.
       2:DNS解析域名(忽略)
       3:Tomcat解析请求:/day3/hello.
           上下文路径:/day3
           资源的名称:/hello
       4:解析Tomcat根/conf/server.xml文件,获取其中所有的<Context/>元素,并找到path属性为/day3的元素., 如果没有报404异常
          <Context docBase="D:\OpenSources\JavaApps\servlet\webapp" path="day3"/>.
          再读取该<Context/>元素,再获取docBase属性值,该属性值就是当前访问的WEB项目的根路径.
       5:从该web的根路径/WEB-INF下找到web.xml文件.
       6:读取web.xml文件,获取所有的<url-patten>元素,并判断哪一个<url-pattern>的文本内容为:/hello.
          找不到: 报404错误.
          找  到: GOTO 7.
       7:通过/hello,找到当前Servlet的全限定名.
         com._520it._01_hello.HelloServlet
       8:从Servlet的实例缓冲池中去获取com._520it._01_hello.HelloServlet对应的对象.
          Map<String,Servlet> cache = .....;
            key: 类的全限定类名
            value: servlet类的对象
          Servlet obj = cache.get("com._520it._01_hello.HelloServlet");
          if(obj == null{
               //第一次请求:GOTO 9.
          }else{
               //非第一次请求:GOTO 12;
          }
        9:使用反射创建Servlet对象.
          Servlet obj = Class.forName("com._520it._01_hello.HelloServlet").newInstance();
        10.把创建的Servlet对象,存储到Servlet实例缓存池中,供下一次请求使用.
               cache.put(“com._520it._01_hello.HelloServlet”, obj);
        11:容器创建ServletConfig对象,并调用init方法,来完成初始化操作.
           obj.init(config);
        12:容器创建ServletRequest和ServletResponse对象,并调用service方法,处理请求.
           obj.service(req,resp);
        13:在service方法中,对当前请求的客户端做相应.

  6. ServletConfig接口:表示Servlet的信息配置对象(web.xml中,当前Servlet的配置信息).
    其中的方法:
    ServletContext getServletContext(): 获取当前的Servlet的上下文对象,其实表示当前应用对象
               表示tomcat给当前servelt提供的运行环境的包装对象(后讲).
    String getInitParameter(String paramName): 根据当前Servlet的指定的参数名获取初始化参数值.

    String getServletName():   获取当前Servlet的名字,<servlet-name>元素的文本内容.
    Enumeration<String> getInitParameterNames():获取当前Servlet的所有初始化参数的名字.
    ---------------------------------------------------------------------------

  7.  

    问题:如果多个Servlet有共同的初始化参数,怎么办?
       如果多个Servlet需要共享相同的初始化参数,此时得使用全局的初始化参数(ServletContext).

     

  8.  

     

    都是 B/S 软件架构,web浏览器和web服务器基于HTTP协议,我们都是居于HTTP协议,就应该是http请求跟http响应.

  9. 所以程序设计:

    1:先将普通请求转成http请求, 普通响应转换成http响应
    service(ServletRequest req, ServletResponse res){
          service(HttpServletRequest , HttpServletResponse );
    }
    2: 重定义一个方法service(HttpServletRequest request, HttpServletResponse response) 专门来处理http请求跟http响应逻辑

    3: 因为http请求分doget请求跟doPost所以, 可以将 servcie 区分成doGet请求处理逻辑跟 doPost处理逻辑.

     

    ServletRequest接口:    请求对象,封装了获取所有请求信息(请求行,请求头,请求实体)的方法.
    HttpServletRequest接口:是ServletRequest的子接口,处理HTTP协议请求的方法.
    ---------------------------------------------------------------------------
    常用方法:
    1.String getMethod():返回请求方式:如GET/POST
    2.String getRequestURI():返回请求行中的资源名字部分:如/test/index.html
    3.StringBuffer getRequestURL():返回浏览器地址栏中所有的信息
    4.String getContextPath():返回当前项目的上下文路径,该值以/开头(<Context/>元素的path属性值.建议以/开头)
    5.String getRemoteAddr():返回发出请求的客户机的IP地址
    6.String getHeader(String name):返回指定名称的请求头的值。

    获取请求参数的方法:
    1.String getParameter(String name):根据参数名获取单个参数值。
    2.String[] getParameterValues(String name):根据参数名获取多个参数值。
    3.Enumeration<String> getParameterNames():返回包含所有参数名的Enumeration对象。
    4.Map<String,String[]> getParameterMap():返回所有的参数名和值所组成的Map对象。

    注意:
    String getInitParameter(String name):获取初始化参数,初始化参数是开发人员设置的.
    String getParameter(String name):获取用户输入的参数,参数是不同的用户输入的(通过表单).

  10. 在Tomcat中,对于POST和GET请求,都默认才有的ISO-8859-1的编码方式.
    而该ISO-8859-1不支持中文,所以乱码.
    --------------------------------------------------------------------
    解决方案:
       1:按照ISO-8859-1把乱码恢复成二进制形式
            byte[] data=username.getBytes("ISO-8859-1");
      2:再把二进制形式的数据使用UTF-8重新编码
         String username = new String(data,"UTF-8");
    --------------------------------------------------------------------

    解决方案:
       针对于POST请求方式:
        request.setCharacterEncoding("UTF-8");
        注意:1:只对POST有效, get请求无效,2:必须放在获取任意参数之前.

       针对于GET请求方式:
       修改Tocmcat中的server.xml配置文件中修改端口的元素,对GET方式的默认编码.

    不要修噶tomcat中任何配置,除非你是专业(运维人员).  不建议修改server.xml文件编码

  11. ServletResponse接口:    响应对象.封装了获取响应信息的方法.
    HttpServletResponse接口:ServletResponse的子接口,可以处理HTTP响应
    ------------------------------------------------------------------------------
    常用方法:
    1:OutputStream getOutputStream():获取字节输出流对象
    2:PrintWriter  getWriter():获取字符输出流对象
        注意:上述方法,不能共存,否则报错.

    //设置输出的MIME类型(内容的类型):
       response.setContentType("text/html");//不能写错
    //设置输出数据的编码方式:
       response.setCharacterEncoding("UTF-8");

    可以将上述两行代码合并成一行代码:
    5:response.setContentType("text/html;charset=utf-8");
        注意:必须先设置MIME类型和编码,再获取输出流,否则没有效果.

     

     

     

     

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值