servlet访问流程

  • Servlet的访问过程

    1.客户端通过发送请求给Tomcat,Tomcat发送客户端的请求页面给客户端。

    2.用户对请求页面进行相关操作后将页面提交给Tomcat,Tomcat将其封装成一个HttpRequest对象,然后对请求进行处理,。

    3.Tomcat截获请求,根据action属性值查询xml文件中对应的servlet-name,再根据servlet-name查询到对应的java类(如果是第一次,Tomcat则会将servlet编译成java类文件,所以如果servlet有很多的话第一次运行的时候程序会比较慢)。

    4.Tomcat实例化查询到的java类,注意该类只实例化一次

    5.调用java类对象的service()方法(如果不对service()方法进行重写则根据提交的方式来决定执行doPost()方法还是doGet()方法)。

    6.通过request对象取得客户端传过来的数据,对数据进行处理后通过response对象将处理结果写回客户端。

  • Servlet的线程安全问题

    • 当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet,
    • 当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。
    • JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的,这种默认以多线程方式执行的设计可大大降低对系统的资源需求,提高系统的并发量及响应时间。
    • Servlet本身是无状态的,一个无状态的Servlet是绝对线程安全的,无状态对象设计也是解决线程安全问题的一种有效手段。
    • 解决方案

      避免使用实例变量(即非static 的成员变量
      避免使用非线程安全的集合
      在多个Servlet中对某个外部对象(例如文件)的修改是务必加锁(Synchronized,或者ReentrantLock),互斥访问。
      属性的线程安全:ServletContext、HttpSession是线程安全的;ServletRequest是非线程安全的。

=======================================================================================

  • 修改Servlet模板

    • 先找到MyEclipse的安装路径

      C:\Users\forever\MyEclipse 2015\plugins\com.genuitec.eclipse.wizards.xxxx.jar

    • 我自己的:com.genuitec.eclipse.wizards_13.0.0.me201502130035.jar

    • 千万别解压,右键–选择压缩工具打开–templates–Servlet.java修改内容

    • 拖回去之前,先MyEclipse关闭。
  • ServletConfig对象

    • ServletConfig对象和配置文件相关

      • 配置初始化参数

        • 需要在标签下配置。

          • 如果要是配置在某个servlet的标签下,那么只能在该servlet中获取初始化参数。
          1. <init-param>
          2. <param-name>username</param-name>
          3. <param-value>root</param-value>
          4. </init-param>
          • String getServletName() 获取配置文件中servlet的名称
          • String getInitParameter(String name) 获取初始化参数
          • Enumeration getInitParameterNames() 获取初始化参数的名称们
    • 该对象位于servlet对象的init()方法的参数中,用于获取初始化参数。

      1. @Override
      2. publicvoid init(ServletConfig config)throwsServletException{
      3. // TODO Auto-generated method stub
      4. }
      • 也可以直接通过getServletConfig() 方法获取该对象

======================================================================================

  • ServletContext对象(域对象)(很重要的域对象)

    • 定义:WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

    • 一个WEB应用对应一个ServletContext对象
      一个WEB应用下有多个Servlet程序
      所有的servlet程序都共享同一个ServletContext对象

      demo1存入内容 ServletContext demo2中取出来

      • 获取WEB应用全局初始化参数

        • 在web.xml中配置
          1. <context-param>
          2. <param-name>encoding</param-name>
          3. <param-value>GBK</param-value>
          4. </context-param>

        在servlet中通过如下代码获取配置的参数

        1. String getInitParameter(String name);
        2. getInitParameterNames();
      • 实现数据的共享(*****)

        1. void setAttribute(String name,Object object)存入数据
        2. void removeAttribute(String name)删除数据
        3. Object getAttribute(String name)获取数据
      • 读取资源文件(*****)

        1. InputStream getResourceAsStream(String path)//通过文件的地址获取输入流,path相对于服务器端的路径,即 ..../项目名 后面就根据资源文件的具体位置加载资源文件即可
        2. String getRealPath(String path)通过文件的地址获取文件的绝对磁盘路径

转载于:https://www.cnblogs.com/foerver-zs/p/f630734d95e79e5cb53b84dcc024a07b.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值