Servlet总结

三层架构:数据访问层,业务逻辑层,表示层。
通常来说数据访问层放的是数据库的操作,一般写在dao包下,类名也以Dao结尾。
业务逻辑层则是对业务逻辑的封装,用于判断数据库读取是否正常等判断。
表示层是用来显示数据和接受用户的交互操作,分为前台和后台代码,前台为可视化界面,后台为调用业务逻辑层的代码,如servlet。
和mvc设计模式相同,三层架构的目的是解耦,分层,代码复用。

那么我们就来详细的说一下servlet各方面。


servlet的生命周期:


加载 初始化 服务 销毁 卸载。通常,加载和卸载通过servlet容器来处理,我们只需关注初始化,服务,销毁。
从servlet第一次访问时,初始化init()方法调用,且只调用一次,接着服务service()方法,每次请求都会调用一次,最后当服务器关闭或项目移除调用销毁destory()方法。


servlet单实例,多线程。


servlet接口:

Servlet接口定义了5种方法:

init()
service()
destroy()
getServletConfig()
getServletInfo()


init()
在Servlet实例化后,Servlet容器会调用init()方法来初始化该对象,主要是为了让Servlet对象在处理客户请求前可以完成一些初始化工作,例如:建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只能被调用一次。init()方法有一个类型为ServletConfig的参数,Servlet容器通过这个参数向Servlet传递配置信息。Servlet使用ServletConfig对象从Web应用程序的配置信息中获取以名-值对形式提供的初始化参数。另外,在Servlet中,还可以通过ServletConfig对象获取描述Servlet运行环境的ServletContext对象,使用该对象,Servlet可以和它的Servlet容器进行通信。


Service()
容器调用service()方法来处理客户端的请求。要注意的是,在service()方法被容器调用之前,必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象(类型为ServletRequest)和一个用于对客户端进行响应的响应对象(类型为ServletResponse)作为参数传递给service()。在service()方法中,Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。


destroy()
当容器检测到一个Servlet对象应该从服务中被移除的时候,容器会调用该对象的destroy()方法,以便让Servlet对象可以释放它所使用的资源,保存数据到持久存储设备中,例如将内存中的数据保存到数据库中,关闭数据库的连接等。当需要释放内存或者容器关闭时,容器就会调用Servlet对象的destroy()方法,在Servlet容器调用destroy()方法前,如果还有其他的线程正在service()方法中执行容器会等待这些线程执行完毕或者等待服务器设定的超时值到达。一旦Servlet对象的destroy()方法被调用,容器不回再把请求发送给该对象。如果需要改Servlet再次为客户端服务,容器将会重新产生一个Servlet对象来处理客户端的请求。在destroy()方法调用之后,容器会释放这个Servlet对象,在随后的时间内,该对象会被java的垃圾收集器所回收。


getServletConfig()
该方法返回容器调用init()方法时传递给Servlet对象的ServletConfig对象,ServletConfig对象包含了Servlet的初始化参数。


getServletInfo()
返回一个String类型的字符串,其中包括了关于Servlet的信息,例如,作者、版本和版权。该方法返回的应该是纯文本字符串,而不是任何类型的标记。


实现servlet的三种方式:

1)继承HTTPServlet类,复写doget()和dopost()方法。
2)实现Servlet接口
3)继承GenericServlet,实现Servlet方法。


web.xml方面:

缺省servlet:

conf下的web.xml中有这样一个代码:

<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
</servlet-mapping>
servlet的映射路径为一个(/),称之为缺省的servlet。则这个servlet就成为了当前web应用程序的缺省servlet。
缺省的servlet的作用为:凡是在web.xml文件总找不到匹配的<servlet-mapping>元素的URL,他们的方位请求都将交给缺省的servlet处理。也就是说,缺省的servlet用于处理所有其他servlet不处理的访问请求。

<load-on-startup>
servlet容器将在客户端首次请求时加载它,在Web应用启动时加载并初始化servlet。
<load-on-startup>值越小(但不能小于0),优先级越高。为负数时不自动加载,》=0自动加载,只能是整数。


设置获取初始化参数:
设置初始化参数在web.xml中
<param-name>name</param-name>  参数名
<param-value>value</param-value>  参数值
获取: 通过ServletConfig接口的getInitParameter(String name)


ServletContext和ServletConfig
ServletContext是一个全局存储信息的空间。所有用户共用一个,在jsp内置对象中application对象实现了servletContext的实例。放置必须的重要的信息。

ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,不能访问另一个servlet。


Servlet多重映射

servlet多重映射是指同一个Servlet,可以被映射成多个虚拟路径 
客户端可以通过多个路径,实现对同一个Servlet的访问 
Servlet多重映射的实现方式有两种


1)配置多个servlet-mapping元素
  <!-- 映射为Servlet01 -->
  <servlet-mapping>
    <servlet-name>TestServlet01</servlet-name>
    <url-pattern>/Servlet01</url-pattern>
  </servlet-mapping>
  <!-- 映射为Servlet02 -->
  <servlet-mapping>
    <servlet-name>TestServlet01</servlet-name>
    <url-pattern>/Servlet02</url-pattern>
  </servlet-mapping>
2)配置多个url-pattern来实现多重映射
  <!-- 映射为Servlet01和Servlet02 -->
  <servlet-mapping>
    <servlet-name>TestServlet01</servlet-name>
    <url-pattern>/Servlet01</url-pattern>
    <url-pattern>/Servlet02</url-pattern>
  </servlet-mapping>

java中获取ServletContext的常见方法

1.在javax.servlet.Filter中直接获取 
ServletContext context = config.getServletContext(); 
2.在HttpServlet中直接获取 
this.getServletContext() 
3.在其他方法中,通过HttpRequest获得 
request.getSession().getServletContext(); 


如何处理Servlet的线程不安全问题

1.最简单的就是不使用字段变量,2.使用final修饰变量,3.线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,
所以可以在Servlet的线程里面加上同步方法或同步块。(Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能变差,最好不去使用实例变量)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值