Servlet学习笔记

事实上我们在浏览器提交请求之后,在服务器端处理http请求并给出http响应的是Servlet容器。Servlet是java Web应用程序的核心程序,所有的网址最终都会交给Servlet来处理。Servlet的调用是Servlet容器直接调用的,并没有我们所熟悉的main方法,Servlet容器来负责Servlet实例的查找、创建及整个生命周期的管理。servlet主要还用来做来web服务器端的逻辑控制处理。

1)servlet的工作原理

Servlet只在首次访问的时候才被创建,且在生命周期中之创建一次,以后的每次访问都会创建一个ServletRequest和ServletResponse对象,两个对象的生命周期都非常短,不会对内存造成压力。如果在需要进行一些复杂的操作,需要在初始化时就完成,比如打开文件、初始化网络连接等,可以配置在服务器启动时就创建实例,具体配置方法为在声明servlet标签中添加<load-on-startup>1</load-on-startup>标签。客户端浏览器用户的很多请求信息都封装在了ServletRRequest对象里,然后Servlet调用Service方法,并将结果封装进ServletResponse对象并传回给客户端浏览器。

  2)servlet的生命周期

Servlet整个生命周期可以分为四个阶段:类装载及实例创建阶段、实例初始化阶段(init)、服务阶段(service)以及实例销毁阶段(destory) .

当http请求到来时,Web服务器把控制权交给Servlet容器,Servlet容器首先对所请求的URL进行解析并根据web.xml 配置文件找到相应的处理servlet,并将此来的class文件装载到内存中,然后Servlet容器创建一个ServletConfig对象,该对象包含了该Servlet的初始化配置信息。Servlet容器然后会创建一个servlet对象,并调用init()方法来初始化Servlet对象。

Servlet根据http请求创建ServletRequest对象和ServletResponse对象,并将他们传给Service方法,doGet或doPost,都使用该方法。并将结果封装进ServletResponse对象中生成响应结果, 传送给客户端浏览器。

在Web应用要结束的时候,servlet容器会先调用servlet对象的destrory方法,然后再销毁servlet对象,同时也会销毁与servlet对象相关联的servletConfig对象。我们可以在destroy方法的实现中,释放servlet所占用的资源,如关闭数据库连接,关闭文件输入输出流等。

3.Servlet的配置

我们所写的Servlet要在web.xml中配置,方便servlet容器查找,有两处需要配置。 

首先要配置Servlet的名称以及类名,名称与类名使用标签<servlet>配置,还可以配置一些初始化信息,如编码、加载方式等, 如下例子:

<servlet>

        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>com.demo.servlet.FirstServlet</servlet-class>
        <init-param>
            <param-name>message</param-name>
            <param-value>welcome to FirstServlet</param-value>
        </init-param>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

     然后再配置映射路径,使用<servlet-mapping>标签,这样的话,访问时直接查找到路径。对于路径的映射可以使用通配符"*"和"?",如下配置:

<servlet-mapping>

        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet/FirstServlet.html</url-pattern>
        <url-pattern>/servlet/FirstServlet.jsp</url-pattern>
        <url-pattern>/servlet/FirstServlet.php</url-pattern>
        <url-pattern>/servlet/FirstServlet.asp</url-pattern>
        <url-pattern>/servlet/FirstServlet.aspx</url-pattern>

    </servlet-mapping> 

如果映射路径为/,则为默认servlet,系统提供默认servlet,若覆盖则不会使用原来默认的了。对于一些编译器,如MyEclipse会自动完成servlet 的这些配置。

  4)servlet的使用

由于servlet只会有一个实例,多个用户同时请求访问同一个Servlet时,会有线程安全问题的隐患。最简单的方法就是加上synchronized(this) ,但这种方法很显然是错误的,因为这样会使执行变得很慢,请求得不到及时处理,那样网站就会被投诉了。servlet自己提供了一种方法,使用SingleThreadModel接口,该接口是个标记接口。但是如果请求servlet响应未完成,再有请求的话,会再去常见新的servlet,因此该方法不好。而对于目前的服务器性能来讲,对于request和response的处理很快,这个问题需要担心但也不是亟待解决。

 常用到的有ServletConfig,HttpServletRequest,HttpServletResponse,ServletContext等

ServletContext是一个接口,它所属整个web程序,有多少web应用就有多少ServletContext,有常用方法:getInitParameter(),getInitParameterNames(),其实现对象是一个域对象,因此还有方法getAttribute(),setAttribute(),getAttributeNames(),removeAttribute().ServletContext读取资源有三种方法,普通java程序读取文件系统、通过类装载器读取getClassLoader().getResourceAsStream()、getRealPath()+资源名称。

ServletConfig是servlet容器的配置对象,用于初始化传递信息,它也是个域对象,常用方法:getServletContext(),getInitParameter(),getInitParameterNames()等

HttpServletRequest对象用于封装客户端信息的,getParameter()是获取请求参数的,getAttribute()是用来获取域中的信息,其有很多的函数可以用来获取客户端信息,getRequestDispatcher().forward()可用来转发请求的,include()静态包含,getSession()获取会话session。

HttpServletResponse对象用来封装响应信息的,可设置响应头,格式,编码等,getWriter获取PrintWriter对象,来向浏览器输出字符数据,getOutputStream 用来获取字节输出的。addCookie()用来客户端添加cookie对象,sendRedirect()向浏览器发出指示重新定向请求.

  在servlet中使用Bean,可使用BeanUtils包。此外servlet主要用于逻辑控制,不应该作为页面表现。

 更多详细细节,参看 https://www.ibm.com/developerworks/cn//java/j-lo-servlet/#ibm-pcon

 

 

原文地址:https://www.cnblogs.com/kingcucumber/p/2837840.html