• 2 Servlet 细节


      1 Servlet 配置详解

      ①  由于客户端在浏览器只能通过URL访问web服务器的资源,所以Servlet程序若想被外界访问,必须把Servlet 程序映射到一个URL 地址上,这个工作在项目web.xml 完成。

      ② web.xml 的 <servlet>元素用于注册Servlet,它主要包含2个元素:<servlet-name>与<servlet-class>,分别用于注册Servlet 名称和设置Servlet 完整类名。

    1   <servlet>
    2     <!-- 注册Servlet -->
    3     <servlet-name>FirstServlet</servlet-name>
    4     <!-- 类的全路径 -->
    5     <servlet-class>com.latiny.servlet.FirstServlet</servlet-class>
    6   </servlet>

    ③ <servlet-mapping> 元素用于映射一个已经注册的Servlet对外的访问路径,它包含2个子元素:<servlet-name>与<url-pattern>,分别用于指定Servlet 注册名对应的对外访问路径。

    1  <servlet-mapping>
    2       <!--Servlet的注册名 -->
    3     <servlet-name>FirstServlet</servlet-name>
    4     <!--Servlet对外的访问路径 -->
    5     <url-pattern>/FirstServlet</url-pattern>
    6   </servlet-mapping>

      

      ④ 一个注册的Servlet可以映射为多个URL,且每个URL都可以被外部访问

      ⑤ 对Servlet映射时,可以使用通配符,有两种格式

    第一种格式 *.扩展名,例如*.do,*.html

    第二中格式 以 / 开头,同时以 /* 结尾 例如 /* 或者 /news/*

    第三如果一个URL被映射成多种格式,匹配标准如下:

    • 谁的匹配度高,谁先被选择
    • *.do 优先级最低

      案例:

      ① 如果在上面的<servlet-mapping> 元素里,FirstServlet 被映射成 *.html,那么在浏览器输入任何以html 结尾的地址都可以访问到该 Servlet

      http://localhost:8080/TestWeb/abc.html,其中abc 可以换成任意字符都可以访问到该Servlet。

      ② 如果在上面的<servlet-mapping> 元素里,FirstServlet 被映射成 /*,那么在浏览器输入任何字符或者不输字符都可以访问到FirstServlet,如下面的地址都可以访问到:

      http://localhost:8080/ServletProject/

      http://localhost:8080/ServletProject/a

      http://localhost:8080/ServletProject/.html

      

      2 Servlet 单例问题

    当Servlet第一次被访问后,就被加载到内存,以后该实例对各个请求服务,Servlet在使用中是单例的,因为Servlet是单例,因此会出现线程安全问题。比如:售票系统,不加同步机制,则会出现问题。

    ① 解决方案:

    如果一个变量或者一段代码,可能会有多个用户共享,则应该在访问时加同步机制:

    1 synchronized(对象)
    2 {
    3 
    4 }

      

      如果一个变量不需要共享,则直接在doPost或doGet定义。

      

      3 Servlet中的<servlet-on-startup> 配置

     

      当我们启动网站的时候,可能会要求初始化一些数据,比如创建临时表、完成一些网站要求定时完成的任务如:定时写日志,定时备份数据库,定时发送邮件等。

      解决方案:可以通过<load-on-startup>配合线程解决

      ① 通过配置<load-on-startup> 可以指定某个Servlet 自动启动

      ② 创建一个简单的线程:

     1 public class SendEmail extends Thread 
     2 {
     3     public void run()
     4     {
     5         int i=0;
     6         try
     7         {
     8             while(true)
     9             {
    10                 //每休息10秒,就去扫描sendmail表,看看哪份email应该发出
    11                 Thread.sleep(60*1000);
    12                 System.out.println("发出第"+(++i)+"邮件");
    13             }
    14         }
    15         catch(Exception e)
    16         {
    17             
    18         }
    19     }
    20 
    21 }

      ③ 创建一个简单的Servlet:FirstServlet,然后在该Servlet里创建SendEmail 线程并启动

     1 public class FirstServlet extends HttpServlet {
     2 
     3     public void init() throws ServletException {
     4         //完成一些初始化任务
     5         System.out.println("FirstServlet is called");
     6         SendEmail email = new SendEmail();
     7         email.start();
     8             
     9     }
    10     
    11     public void destroy() {
    12         super.destroy();
    13         
    14     }
    15 .......

      ④ 在项目的web.xml配置该Servlet,随着网站启动时一起启动

    1   <servlet>
    2     <servlet-name>FirstServlet</servlet-name>
    3     <servlet-class>com.latiny.servlet.FirstServlet</servlet-class>
    4     <load-on-startup>1</load-on-startup>
    5   </servlet>

      

      ⑤ 部署该项目,然后启动Tomcat,启动之后我们可以在后台看到,每隔10秒就会输出一条信息

     1 一月 27, 2018 4:39:51 下午 org.apache.coyote.AbstractProtocol start
     2 信息: Starting ProtocolHandler ["ajp-apr-8009"]
     3 一月 27, 2018 4:39:51 下午 org.apache.catalina.startup.Catalina start
     4 信息: Server startup in 5818 ms
     5 发出第1邮件
     6 发出第2邮件
     7 发出第3邮件
     8 发出第4邮件
     9 发出第5邮件
    10 发出第6邮件
    11 发出第7邮件

      以上只是简单的模拟了<load-on-startup> 配置Servlet 在项目启动时跟着一起启动的案例。

      3 SerlvetConfig 对象

      ServletConfig 对象主要用于读取Servlet的配置信息,要在项目中使用该对象来工作,需要做如下操作:

      ① 在web.xml 中给对应的Servlet 配置ServletConfig 信息,注意这个配置信息只能供该Servlet 访问,其他Servlet无法访问

     1 <servlet>
     2     <servlet-name>FirstServlet</servlet-name>
     3     <servlet-class>com.latiny.servlet.FirstServlet</servlet-class>
     4    
     5     
     6      <!-- Servlet 配置信息,此处配置信息只能被该Servlet读取 -->
     7     <init-param>
     8         <param-name>encoding</param-name>
     9         <param-value>utf-8</param-value>
    10     </init-param>
    11     
    12     <init-param>
    13         <param-name>name</param-name>
    14         <param-value>latiny</param-value>
    15     </init-param>
    16     
    17     <init-param>
    18         <param-name>gender</param-name>
    19         <param-value>male</param-value>
    20     </init-param>
    21     
    22   </servlet>

      ② 获取使用

    1         String encoding = this.getServletConfig().getInitParameter("encoding");
    2         String name = this.getServletConfig().getInitParameter("name");
    3         String gender = this.getServletConfig().getInitParameter("gender");

      这种配置方式只能被某个Serlvet独立使用,如果希望所有Servlet都能读取到某个配置参数,则需要配置参数<context-param>

    1 <context-param>
    2       <param-name>contextName</param-name>
    3       <param-value>Hello context config</param-value>
    4 </context-param>

      该项目任何Servlet 都可以通过以下代码获取<context-param> 中的配置

    1 String contextName = this.getServletContext().getInitParameter("contextName");

    4 修改Servlet的配置模板

    MyEclipse提供的Servlet 模板有时候不一定适合项目的开发,为了方便我们可以按照实际需要修改模板

      ① 找到MyEclipse安装目录下的 Commonplugins文件夹:

      D:Program FilesAppDataLocalMyEclipseCommonplugins

      ② 然后找到com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar这个jar文件

      ③ 用压缩工具打开,注意是打开不是解压这个jar包

    ④ 打开com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar这个jar文件后,可以看到里面有一个templates文件夹,进入templates文件夹,可以看到里面有一个Servlet.java文件,然后打开按照自己的需求修改即可

  • 相关阅读:
    Delphi中 StrToIntDef函数的用法:
    Delphi判断文件夹(目录)是否存在,不存在就创建一个,可以一次创建多级目录
    Delphi中Format的字符串格式化使用说明
    linux下可变参数打印
    c++11 thread
    QMessageBox 使用
    Ubuntu虚拟机配置nfs
    test
    Qt 布局时组建不贴边
    QPainter 居中写字
  • 原文地址:https://www.cnblogs.com/Latiny/p/8366560.html
Copyright © 2020-2023  润新知