[zt] servlet技术总结

1.服务器如何调用servlet的? 
 
    servlet是运行在服务器的程序,当客机请求服务器的时候,服务器servlet会调用service方法,它会自动判断如果它是get方式提交,那么   就调用doget()方法如果是post提交就调用dopost()方法.我们只需要重写doget()跟dopost()方法即可! 
 
 
2.servlet与生命周期相关的方法何时被执行: 
 
    1.任何从客户端发过来的请求,会导致service方法会被执行 
    2.当servlet被创建出来时,初始化方法init会被执行 
 
    * 生命周期 
 
        1、加载 
        2、实例化 和 初始化init()       只调用一次(默认第一次访问时) 
 
            a)使用 <load-on-startup>, web应用在启动时实例化 
            b)不用的话,是第一次请求servlet的时候实例化, 
            c)Servlet属于单利多线程模式。只有一个实例 
 
        3、进入服务 service ( ) {doGet()...doPost()}(分析请求)   每次请求都会调用 
 
        4、 销毁 destroy( )        战地在人在战地没人妄,只调用一次(web应用销毁时) 
 
3.如何创建跟配置一个servlet: 
 
    * 建 java 项目,导入 servlet.jar 包 
    * 继承自 HttpSerlvet 
    * 重写 doGet()doPost() 
    * 拷贝 .class 文件到 发布路径/WEB-INF/classes/ 
    * 在发布路径/WEB-INF/web.xml中配置servlet 
 
 
4.如何给配置WEB应用中的WEB.XML.以及它的工作原理。 
 
配置一个servlet分为2部分: 
1、  声明部分 
2、  部署部分 
当我们用URL(IP + 端口 + WEB发布目录)访问服务器时,首先会访问到WEB应用的跟目录,然后在跟目录里有个WEB-INF文件夹,文件夹中有WEB.XML是我们这个应用的配置中心,在它里面可以配置<servlet>跟<servlet-mapping>。mapping的意思是映射,就是说声明部分的servlet-name必须跟下面部署的servlet-name一致,这样别人通过IP地址+端口+web应用发布目录+访问路径,一访问就可以知道这个servlet的名字是什么,然后通过部署部分的名字找到上面声明部分的名字,然后再通过声明部分的名字找到要执行的servlet的class文件,然后执行。 
<!--  http://192.168.1.119:8080/发布路径/访问路径--> 
 
例子: 
        <servlet> 
            <servlet-name>servlet名字(随便取)</servlet-name> 
            <servlet-class>com.xasxt.HelloServlet</servlet-class> 
            注意:这里是包名+类名,不要给类再加上.java后缀!!! 
        </servlet> 
 
        <servlet-mapping> 
            <servlet-name>servlet名字(必须跟上面取的名字一样)</servlet-name> 
            <url-pattern>/访问路径</url-pattern> 
        </servlet-mapping> 
 
5、Init 
     
1)如何初始化init参数? 
 
在WEB应用中的WEB.XML中设置 
    <init-param> 
        <param-name>userName</param-name> 
        <param-value>12345678</param-value> 
    </init-param> 
 
2)通过什么方法可以得到这些参数,? 
         
我们知道在init方法被调用的时候就产生了ServletConfig,它可以理解是整个WEB.xml的代表。由了这个代表WEB。Xml中的东西就可以被访问到了。 
    config.getInitParameter(name) 
    config.getInitParameterNames() 
 
3)为什么要初始化init参数? 
    比如我们后期会把链接数据库的账号密码配置到这里,以后需要改动的时候在配置里改下就可以了,而不用去找代码改! 
 
6、一个web中不可能只有一个servlet,如何设置哪个servlet优先启动 
 
<load-on-startup>数值(最先0)</load-on-startup> 
 
7、 使用 HttpSerlvetRequest 对象 
         
        getParameter("参数名")接收指定参数名的值(String) 
         
        getParameterValues("参数名")接收指定参数名的一组值(String[]) 
         
        getParameterNames()返回所有的参数名 Enumeration 
         
        setCharacterEncoding("字符集")设置request的字符编码格式 
         
        getContextPath()得到WEB应用程序名称 
         
        getServletPath()得到servlet访问路径,也就是<url-pattern>中间的东西 
         
etMethod()获得请求方式(get还是post) 
 
getRequestURI()<发布目录+访问目录> 
         
getRequestURL()返回客户端发出请求时的完整URL 
 
HttpSession getSession(boolean bool):获取 HttpSession 对象 
            true: 已经存在session,返回当前session;不存在返回新创建的session 
            false:已经存在session,返回当前session;不存在返回 null 
            HttpSession getSession():相当于 getSession(true) 
 
getRemoteAddr返回发出请求的客户机的IP地址 
复习:Enumeration的用法 
    Enumeration<String> enums = request.getParameterNames(); 
            while(enums.hasMoreElements()){ 
String name = enums.nextElement(); 
    String[] values = request.getParameterValues(name); 
                if(null==values){ 
                    System.out.println(name+"="+""); 
                }else{ 
                    for (String value : values) { 
                        System.out.println(name+"="+value); 
                    } 
                } 
            } 
         
8、ServletConfig对象: 
    它代表着整个WEB应用中的WEB.xml配置 
9、ServletContext对象: 
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象它的作用的范围是整个WEB应用。 
 
作用:1.要是有一个程序给ServletContext,中存个数据,只要这应用程序不退出,别人都可以取。 
      2.可以访问WEB应用的资源文件 
 
拿到servletContext方式: 
 
this代表servlet 
ServletContext context = this.getServletContext(); 
 
 
10、 Request乱码的处理 
        我们提交的表单数据中有的值可能是中文的,提交过来以后出现了中文乱码,处理方式按照提交的方式有2种方法: 
1、如果是get提交方式: 
        Get方式提交的必须手动一个值一个值的进行处理,方式是: 
        String uname = getParameter(“uname”); 
        String name = new String(uname.getBytes(“iso8859-1”),”UTF-8”); 
2、如果是post提交方式: 
        Request. setCharacterEncoding(“UTF-8”); 
 
11、使用 HttpSerlvetResponse 对象   
             
        setContentType("text/html;charset=UTF-8")   设置响应输出类型 
             
        setCharacterEncoding("字符集") 设置 response 的字符编码格式 
 
        sendRedirect("路径")  设置 响应 的路径 
 
13、请求转发与重定向: 
 
  
response . sendRedirect(“路径”)    
1、重定向:其实是发一次请求,等响应回来之后,重新再去请求,然后再响应, 
也就是去了回来,然后再去再回来,第二次去也就是我们所要重定向的地址。 
 
1>显示最新的请求 
2>地址栏会变显示最新的请求地址。 
3>是客户端跟服务器之间 
4>request不同,所以不能使用:reqeust. setAttribute(key,value) 
 
2、转发: 
request.getRequestDispatcher(“ ”).forward( req ,resp) 
1>地址栏只显示第一次的请求地址,不会变 
2>服务器内部的处理过程 
3>参数可以累加 
4>可以使用 reqeust. setAttribute(key,value)存放对象在当前请求中 
14、Cookie: 
 
Cookie是客户端技术,程序把每个用户的数据以cookie的形式回写给用户各自的浏览器,或是存到硬盘上,当用户使用浏览器再去访问服务器中的WEB资源时,就会带着各自的数据去,这样WEB资源处理的就是用户各自的数据了。 
 
如果创建cookie。并将它发送到浏览器,默认情况下有效期就是浏览器进程, 
浏览器关闭cookie即被删除,如果希望该cookie存在磁盘上,则需要设置setMaxAge,那么设置的时间是多久,在这段时间中即使关闭浏览器,用新的浏览器去访问,cookie也是有效的。 
 
注意 : 
 
1、如果设置为0,则是命令浏览器删除该cookie 
2、删除cookie时,path必须一致,否则不会删除 
常用方法: 
创建:Cookie cookie = new Cookie(“代号名称”, 实际内容); 
get/setValue()     :得到或设置值 
get/setMaxAge()    :得到或设置有效期 
get/setPath()           :设置或得到Path 
getName()           :得到代号名称 
加入response.add();加入响应 
 
15、Session: 
void setAttribute(String name,Object value):把信息保存到当前浏览器对应的session中 
       Object getAttribute(String name):把信息从当前浏览器对应的session中取出,注意转型 
*Session生命周期: 
    生:用IE去访问服务器,服务器中的WEB应用中只要出现getSession那么session就创建了。 
    死:session不是说浏览器一关闭就死了,而是要等服务器规定的时间后才会死例如:30分钟后,即使你不关闭浏览器,30分后session也会死掉。 
 
*如何设置session有效期及摧毁session 
 
1、在WEB应用WEB.XML里设置 
<session-config> 
        <session-timeout>30</session-timeout> 
</session-config> 
 
2、用代码摧毁: 
    session.invalidate(); 
 
*Session原理: 
客户机用IE去访问服务器,服务器会在内部给这个IE开辟一块带IEsessionID的空间,然后把SessionID以Cookie的形式回写给浏览器,其实也就是一个没有设置有效期的Cookie。如果浏览器关闭客户端cookie资源也跟着即被删除,再次用IE访问则不会带着cookie去(因为cookie已经被删除了),但是以前那个IE的session空间依然存在(存在的时间根据你浏览器请求响应的最后一次开始算),这次服务器会再给当前这个IE新开辟一个IEsessionId空间。 
 
注意: 
 
1、Session的空间可以存放东西,但是不可以存放太多,比如:用户的账户密码什么的。 
2、我们知道session基于cookie,相等于一个没有有效期的cookie,如果我们给购物车里放了1000本书,然后浏览器突然关闭了,下次再访问,这1000本书就没有了,如何解决? 
    答:服务器的getSession在创建session空间时会回写给客户机的cookie是没有有效期的我们只需要在回写coolie的时候设置有效期,那么即使浏览器关闭了,那么新开的浏览器来访问的时候,也会带着cookie的资源来,我们买的东西依然在. 
服务器回写给客户机的sessionId是:JSESSIONID 
 
16、Application: 
    setAttribute(String name,Object value) 
        Object getAttribute(String name) 
 
    对所有客户端只有一个。服务器启动,生,服务器停止,死。 
    小例子: 
<% 
        int cc = 0; 
    if(null==application.getAttribute("webCount")){ 
        application.setAttribute("webCount",1); 
    }else{ 
        cc = (Integer)application.getAttribute("webCount"); 
        if(session.isNew()){ 
            application.setAttribute("webCount",cc+1); 
        } 
    } 
%> 
访问次数:<%=cc+1 %> 
 
12、*servlet细节: 
 
1. 
    针对客户端的多次servlet请求,通常情况下,服务器只会创建一个servlet实例对象,也就是说servlet实例对象一旦被创建 
    它就会驻留再内存中,为后续的其他请求服务,直到web容器推出servlet实例对象才会销毁! 
 
2. 
    同一个servlet可以被映射到多个URL上,即<servlet-name>一个它可以同时有 
    多个映射 
    <servlet-mapping> 
        <servlet-name></servlet-name> 
        <url-pattern></url-pattern> 
    </servlet-mapping>。 
 
3. 
    URL中可以使用通配符,但只能有2种:一种是:*.扩展名,另一种是/开头并以 
    /*结尾。*代表所有东西。 

你可能感兴趣的:(servlet)