909422229__Servlet总结

来源:互联网 发布:软件研发项目管理 编辑:程序博客网 时间:2024/04/29 09:31

关于Servlet的学习概要:

1、什么是Sevlet?

  是java类,他提供了基于协议的请求和响应服务,担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层,具有独立于平台和协议的特性,可以生成前台web页面,生命周期通过Web容器控制。

2、有什么作用?

  主要是接收客户端的请求(多数是http),并将处理结果返回给客户端。在mvc模式中属于Control控制层。

3、生命周期:

  由容器控制,如,tomcat,经过初始化、运行和销毁三个阶段。值得注意的是,servlet是单实例,多线程,存在线程安全问题,所以,一定不要在sevlet中定义或修改成员变量。不管有多少请求客户,servlet都只进行一次初始化,并在初始化的时候调用一次init()函数,之后,为每一个客户端的请求创建一个新的线程。而且,不要把sevlet手动修改为单线程,这样会严重影响网络访问,因为在同一个时刻,只能有一个线程可以访问。可以用下面的程序,验证他是单实例,多线程:

[java] view plain copy
  1. <span style="font-size:18px;">import java.io.*;  
  2. import javax.servlet.http.*;  
  3. import javax.servlet.*;  
  4.   
  5. public class TestLifeCycleServlet extends HttpServlet {  
  6.   
  7.     public TestLifeCycleServlet() {  
  8.         System.out.println("--------TestLifeCycleServlet()----------");  
  9.     }  
  10.       
  11.     public void init()  
  12.           throws ServletException {  
  13.         System.out.println("-----------init-------------");           
  14.     }  
  15.           
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  17.     throws ServletException, IOException {  
  18.         System.out.println("------------doGet-------------");     
  19.     }  
  20.       
  21.     public void destroy() {  
  22.           
  23.     }  
  24. }</span>  

初始阶段:

1.servlet容器加载servlet类,把servlet类的.class文件独到内存

2.容器创建ServletConfig对象,该对象包含了servlet的初始化信息

3.容器创建一个servlet对象,调用对象的int方法进行初始化。

运行阶段:

  当容器接到客户端的请求的时候,会创建servletRequest和servletResponse对象,然后调用service方法,并把这两个参数传进去。不管是通过doGet(参数放到请求的头,故有长度限制)还是doPost方法处理请求(参数放到请求体中,故无长度限制),都是由service方法来处理的。servletResponse获得请求的信息,servletResponse返回处理后的信息。

销毁阶段:

  因为只有一个实例,所以只进行一次销毁,调用的是destroy方法,将servlet对象和相关联的servletConfig对象也一并销毁。我们可以在destroy方法中,添加一些释放资源的方法,这样会提高系统的性能。如,关闭连接,关闭流的输出等。

四、Servlet处理请求:

  不管是否基于mvc模式,servlet处理请求主要是基于servletRequest和servletResponse对象的。在mvc模式中,为达到职责单一的目的,采用了转发和重定向的思想。这里是一个重点。转发只发生在服务端,客户端是不知道的,不涉及重新发送请求的问题,所以数据不会被冲刷掉,request数据共享;而重定向,则是将处理到一定程度的数据回发给客户端后,再次建立一次新的请求,上次请求中request对象中的数据信息不会保留。区别见下图:



  因为重定向不会共享request对象,可以将request对象的数据放到session中,解决这种不足,下面是转发和重定向的代码实现:

servlet类中的代码:

[java] view plain copy
  1. <span style="font-size:18px;">                StudentManager studentManager = new StudentManagerImpl();  
  2.   
  3.   
  4.         List<Student> studentList = studentManager.findStudnetList(beginDate,endDate);  
  5.       
  6.         //将学生列表设置到request范围中  
  7.         request.setAttribute("student_list",studentList);  
  8.   
  9.         //转发:在服务端转发,客户端是不知道的  
  10.         <strong>request.getRequestDispatcher("/student_list.jsp").forward(request,response);</strong>  
  11.   
  12.         //将studentList放到session中  
  13.         //HttpSession session =request.getSession();  
  14.         //session.setAttribute("student_list",studentList);  
  15.   
  16.         //重定向,不会共享request,request.getContextPath()用于获取当前目录到跟目录的路径  
  17.         //response.sendRedict(request.getContextPath()+"/student_list.jsp");  
  18.         //以下写法错误,/代表8080端口,或者可以理解成跟目录  
  19.         //response.sendRedict("/studentList.jsp");</span>  


处理视图显示的jsp的与之对应的代码:

[java] view plain copy
  1. <span style="font-size:18px;">      List <Student> studentList =(List) request.getAttribute("student_list");  
  2.         //如果servlet使用的是session,那么这里就要对应成session  
  3.         //List <Student> studentList =(List) session.getAttribute("student_list");      
  4. </span>  


五、servlet和jsp的区别:

  我们知道jsp通过容器的管理最后编译成servlet类,同样也是运行在服务端的,但是jsp更加侧重处理与界面相关的一些显示。当然也避免不了与一些后台数据的交互,这时候就引入了jsp中嵌入java代码的语法:

1.如果使用<!%   %>作为全局变量出现,用于定义成员变量:

[java] view plain copy
  1. <span style="font-size:18px;"><%!   
  2.     int i;  
  3.     public void setName(){....};      
  4. %></span>  


2.如果使用<%   %>作为局部变量出现,用于定义某个方法的一些变量等:

[java] view plain copy
  1. <span style="font-size:18px;"><%  
  2.     List <Student> studentList =(List) request.getAttribute("student_list");  
  3.     //如果servlet使用的是session,那么这里就要对应成session  
  4.     //List <Student> studentList =(List) session.getAttribute("student_list");      
  5.   
  6.   
  7.     for (Iterator<Student> iter = studentList.iterator();iter.hasNext();){  
  8.         Student student = iter.next();  
  9.   
  10.     }  
  11.                   
  12. %></span>  

3.如果使用<%=   %>=后面必须是字符串变量或者可以被转换成字串的表达式,不需要以分号结束,只有一行:

[java] view plain copy
  1. <span style="font-size:18px;">      <td><%=student.getStudentId()%></td>  
  2.       <td><%=student.getStudentName()%></td>  
  3.   
  4.   
  5. </span>  


4.注释:

[java] view plain copy
  1. <span style="font-size:18px;"><% //.....%>  
  2. <% --.......--%>  
  3. <% /*.....*/%></span>  

六、Servlet的Cookie:

  这是Servlet的一个重点,这里只简要的概述一下,后面会深入学习。

Session 是单用户的会话状态。当用户访问网站时,产生一个 SESSIONID,并存在于 COOKIES 中。每次向服务器请求时,发送这个 COOKIES ,再从服务器中检索是否有这个 SESSIONID 保存的数据。

CACHE ,则是服务器端的缓存,是所有用户都可以访问和共享的。通常为网页及媒体文件,在涉及安全性的动态生成页面上,可以设置有较时间,以便减少攻击。

cookie和ssession都是保存每个用户单独的信息,前者保存在服务器。安全。后者保存在客户端。安全比较低。后者可以长期保存。在客户端浏览器和服务器之间来回丢来丢去。

七、Sevlet过滤器:

过滤器的作用:

1.判断用户是否登录

2.过滤非法字符

3.解决统一编码

过滤器的使用:

是一个实现了Filter接口的java类,重写init、doFilter、destroy方法,在web.config文件中可以配置多个过滤器,它们按照顺序执行,并具有传递性。

八、Servlet的监听器:

  是对request、session、application的监听。通过监听,可以增加系统的安全性,手动的添加一些资源的处理,可以增强系统的性能。

如,若要创建一个对session的监听,需要实现HttpSessionListener接口,重写下面的方法:

[java] view plain copy
  1. <span style="font-size:18px;">public void sessionCreated(HttpSessionEvent arg0) {} // 创建    
  2.     
  3. public void sessionDestroyed(HttpSessionEvent arg0) {} // 销毁    
  4.     
  5. public void attributeAdded(HttpSessionEvent arg0) {} // 增加    
  6.     
  7. public void attributeRemoved(HttpSessionEvent arg0) {} // 删除    
  8.     
  9. public void attributeReplaced(HttpSessionEvent arg0) {} // 替换  </span>  



总结:

  这里主要介绍了Servlet的机制原理和常用的基本语法,重点是request和response对象的处理,限于篇幅,会单独Session、cookie过滤器和监听器从代码的角度通过一些实例进行学习。

  感觉java中的转发和重定向是一个比较新颖的东东,还有在jsp文件的html中嵌入java代码也是一个需要熟练掌握并运用的地方。


0 0
原创粉丝点击