servlet技术简要总结

来源:互联网 发布:mac文件复制到u盘里 编辑:程序博客网 时间:2024/06/06 00:43
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.  
0 0
原创粉丝点击