物联网工程综合实践-JAVA WEB开发

* * * * * * * * * * * * * * * 在 Servlet 接口的 service(ServletRequest req, ServletResponse res)方法中有一个ServletRequest类型的参数。ServletRequest类表示来自客户端的请求。当Servlet容器接收到客户端要求访问特定Servlet的请求时,容器先解析客户端的原始请求数据,把它包装成一个ServletRequest对象。当容器调用Servlet对象的service()方法时,就可以把ServletRequest对象作为参数传给service()方法。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 通过两个浏览器同时访问HelloServlet1 两个线程同时操纵HelloServlet1对象的clientName实例变量 导致并发问题的操作时序 两个线程各自操纵HelloServlet对象的clientName局部变量 public class AdderServlet1 extends GenericServlet{ private int sum=100; //sum为实例变量 public void service(ServletRequest request,ServletResponse response) throws ServletException, IOException { int increase=Integer.parseInt(request.getParameter("increase")); response.setContentType("text/html;charset=GB2312"); /*输出HTML文档*/ PrintWriter out = response.getWriter(); out.println("

AdderServlet"); out.println(""); out.println(sum+"+"+increase+"="); try{ Thread.sleep(3000); //特意延长响应客户请求的时间 }catch(Exception e){e.printStackTrace();} sum+=increase; out.println(sum); out.println(""); out.close(); //关闭PrintWriter}} http://localhost:8080/helloapp05/adder1?increase=100 解决并发问题的方案 (1)根据实际应用需求,合理决定在Servlet中定义的变量的作用域,变量到底为实例变量,还是局部变量,是由实际应用需求决定的。 (2)对于多个线程同时访问共享数据而导致并发问题的场合,使用Java同步机制对线程进行同步。 synchronized{…} Synchronized关键字 Synchronized关键字的一个使用方式是用于方法上,让方法的范围(scope)内都成为被同步化区域,如: Public synchronized void setNameAndID(){ = name; this.id = id; count++; } Synchronized关键字 被标示为synchronized的方法就成为被同步化区域的一员,当线程执行某个对象的被同步化方法时,线程会在对象上得到一个锁定,不让其他的线程来执行这些区域。其他线程必须等当前线程执行完被同步化方法,并解除对对象的锁定后,才有机会取得对象上执行方法的权利。 Q&A 本讲结束 ! * * * * * * * * * * * * * * * * * * * * * GenericServlet类实现了Servlet接口中的init(ServletConfig config) 初始化方法,GenericServlet类有一个ServletConfig类型的私有实例变量config,当Servlet即使得GenericServlet对象与一个ServletConfig对象关联。 GenericServlet类容器调用GenericServlet的init(ServletConfig config)方法时,该方法使得私有实例变量 config 引用由容器传入的
Logo

宁波官方开源宣传和活动阵地,欢迎各位和我们共建开源生态体系!

更多推荐