Servlet

Servlet是什么:
    运行在web服务器和引用服务器上的程序,它是一个中间层,处于web浏览器或者其他http
客户端的请求,和http服务器上的数据库或应用程序直接的中间层.

Servlet生命周期:从创建到毁灭的过程
    init()初始化
        只调用一次,它在servlet第一次创建的时候被调用,在后续每次用户请求时不再调用
        servlet创建与用户的第一次调用对应的URL,但是您可以指定servlet在服务器第一次启动的时候
        被加载.当用户调用一个servlet时,就会创建一个servlet实例,每次请求都会产生一个新的线程,
        适当的时候移交给doGet和doPost,init简单的创建和加载一些数据没,这些数据会用户servlet的
        整个生命周期.
        public void init() throws ServletException{ //初始化代码 }

    service()处理客户端的请求
        是执行实际任务的主要方法. Servlet容器(即web服务器)调用service()方法来处理来自客户端的
        请求并格式化响应写回客户端.   每次服务器接收到一个servlet请求,服务器就会产生一个新的
        线程并调用服务,service()方法,检查http请求(GET,POST,PUT,DELETE等),并在适当的时候调用
        doGet,doPost,doPut,doDelete等方法.

        service方法由容器调用,适当的时候调用doGet等方法,所以你不必做任何操作,只需要重写doGet
           和doPost方法.
           doGet():处理来自URL的一个正常请求,或者来自一个为指定的method的html表单,get方法有参数
            限制请求字符串中最多包含1024个字符.
           doPost():请求来自一个特定指定了METHOD为post的HTML表单


    destroy()终止
        只会调用一次,在Servlet生命周期结束时被调用,destroy()调用后会被java回收.
    最后.servlet是由jvm的垃圾回收器进行垃圾回收的.








Servlet实例:HelloWorld示例代码

public class HelloWorld extends HttpServlet{

    private String message;

    public void init() throws ServletException{
        //初始化servlet中的必须的参数
        message = "Hello world";
    }

    public void doGet(HttpServletRequest  request,
                      HttpServletResonse  response) throws ServletException,IoException{
        //设置响应内容类型
        response.setContentType("text/html");
        //实际的逻辑是在这里
        PrintWrite out = response.getWriter();
        out.println("<h1>" + message + "</h1>")

    }

    public void destroy(){}
}

Servlet部署:
    1.将HelloWorld.java文件编译后移到tomcat中的/webapps/ROOT/WEB-INF/classes
    2>在/webapps/ROOT/WEB-INF/中的web.xml文件中配置
        <web-app>
            <servlet>
                <servlet-name>HelloWorld</servlet-name>
                <servlet-class>HelloWorld</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>HelloWorld</servlet-name>
                <url-pattern>/HelloWorld</url-pattern>
            <servlet-mapping>
        </web-app>


使用servlet读取表单数据:
  getParameter():调用request.getParameter()方法获得参数值  request.getParameter("name")
  getParameterValues():如果参数值出现一次一上调用该方法,返回多个值,request.getParameterValues(paramName);
  getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。Enumeration paramNames = request.getParameterNames();i
    String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");



Servlet编写过滤器:
    Servlet过滤器可以动态拦截请求和响应,以变换或使用包含在请求或响应中的信息.
    可以将一个或多个servlet过滤器附加到一个servlet或一组servlet,
    Servlet过滤器是可用于Servlet变成的java类,可以实现一下目的: 
        1:在客户端的请求访问后端资源之前,拦截这些请求
        2:在服务器的响应发送回客户端之前,处理这些响应.
    根据规范建议的各种类型的过滤器:
        可以查看:  http://www.runoob.com/servlet/servlet-writing-filters.html

    过滤器通过web部署描述符(web.xml)中的xml标签来声明,然后映射到您的应用程序的
        部署描述中的Servlet名称或URL模式中.当web容器启动web应用程序时,它会为你在
        部署描述中声明的没一个过滤器创建一个实例.  Filter的执行顺序与web.xml配置
        文件中的顺序一致,一般全部都在所有servlet之前.

    Servlet过滤器的方法,过滤器继承javax.servlet.Filter接口的java类.其中有3个方法.
        init(FilterConfig filterConfig):相当与servlet中的init方法.可以读取web.xml
            配置,完成对象的初始化,   服务器启动时创建过滤对象.
        doFilter(ServletRequest,ServletResponse,FilterChain):该方法完成实际的过滤
            过程,当客户端请求方法与过滤器设置匹配的URL时,servlet容器将先调用
            doFilter方法,FilterChain用户访问后续过滤器.
        destroy():销毁,过滤器占用的资源,.

        FilterConfig的使用: init方法中使用:
            web.xml配置:<filter>
                            <filter-name>LoginFilter</filter-name>
                            <filter-class>com.tian.LogFilter</filter-class>
                            <init-param>
                                <param-name>site</param-name>
                                <param-value>菜鸟编程</param-value>
                            </init-param>
                        </filter>
                init方法:
                    public void init(FilterConfig filterConfig) throws ServletException{
                        String site = filterConfig.getInitParameter("site");
                    }

        doFilter()方法;
        publc void doFilter(ServletRequest re,ServletResponse res,FilterChain chain){
            //处理各种请求和响应.
            chain.doFilter(re,res);//将请求传回过滤链
        }


        filter的访问也是按照配置顺序, <servlet-mapping>的顺序.
            <filter-mapping>
               <filter-name>AuthenFilter</filter-name>
                  <url-pattern>/*</url-pattern>
              </filter-mapping>

              <filter-mapping>
                     <filter-name>LogFilter</filter-name>
                        <url-pattern>/*</url-pattern>
              </filter-mapping>


web.xml配置节点说明:
    <filter>指定一个过滤器。
    <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
    <filter-class>元素用于指定过滤器的完整的限定类名。
    <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
    在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
    <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
    <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
    <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
    <servlet-name>指定过滤器所拦截的Servlet名称。
    <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDEFORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
    <dispatcher>子元素可以设置的值及其意义
    REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。





Servlet线程安全问题:
    每次客户端访问servlet web服务器都会为每个请求创建一个线程,这就会引起线程安全问题,(servlet只会在第一次被请求时创建一个实例,
        多个请求就是多个线程同时访问一个实例,就会有线程安全问题,)
    1:我们可以为执行的方法加锁:
        eg: public void doGet(HttpServletRequest re , HttpServletResonse res){
            synchronized(this){  //为对象加锁,保证任何时候都只有一个线程在访问servlet里面的对象.
                i++;
            }
        }
        注:这个方法虽然可以解决线程安全,Servlet请求必须排队执行,当9999个人一起访问的时候这个方案不可能使用,
    2:sun公司提供的解决方案让servlet去实现一个SingleThreadModel接口,实现这个接口,Servlet引擎就会以单线程模式来调用service方法.
        说明:实现SingleThreadModel几口,Servlet引擎仍然支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值