• ServletConfig
– 如何给Servlet类配置初始化参数
– 如何在Servlet类中获取它的初始化参数值
• ServletContext
– 如何配置Web应用上下文初始化参数
– 如何在Servlet类中获取Web应用上下文的初始化参数值
• ServletContext的其他用途
– public void setAttribute(String name, Object obj):根据指定名name把对象obj存放到应用上下文范围中。
– public Object getAttribute(String name):根据指定名从应用上下文范围中获取到该属性对象。
– public void removeAttribut(String name):根据指定名从应用上下文范围中移除该属性。
• ServletConfig和ServletContext的区别
– 整个Web应用只有一个ServletContext,在部署Web应用的时候,容器会建立这一个ServletContext对象,这个上下文对Web应用中的每个Servlet和JSP都可用。
– Web应用中的各个Servlet都有自己的ServletConfig,它只对当前Servlet有效。
• 使用synchronized
– 使用synchronized关键字同步操作成员变量和共享数据的代码,就可以防止可能出现的线程安全问题。
• 尽量少使用成员变量和共享数据
– ServletContext是可以多线程同时读/写成员变量和共享数据的,线程是不安全的。
– ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
– Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题
• public void doPost(HttpServletRequest request, HttpServletResponse response)
• throws ServletException, IOException {
• //验证用户输入的账号和密码是否是合法的。用户的输入账号和密码怎么获取?验证--admin 1234 把验证的结果发送回客户端
• //用户的输入账号和密码怎么获取:通过request对象来获取
• request.setCharacterEncoding("utf-8");
• String username=request.getParameter("userName");
• String password=request.getParameter("password");
• String str=username+":"+password;
• //验证--admin 1234
• //String result=null;
• if("admin".equals(username)&& "1234".equals(password)){
•
•
• //result="合法的用户";
• ServletContext context=this.getServletContext();
• context.setAttribute("username",username);
• response.sendRedirect("secuss");//请求的重定向---
• }else{
• //result="非法用户";
• //请求的转发--两个Servlet共享一个Request对象
• request.setAttribute("user_name_password",str);
• request.setAttribute("var1", "var1");
• request.setAttribute("var2", "var3");
•
• response.setContentType("text/html;charset=utf-8");
• PrintWriter out = response.getWriter();
• out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
• out.println("<HTML>");
• out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
• out.println(" <BODY>");
•
•
• RequestDispatcher rd=request.getRequestDispatcher("fail");
• rd.forward(request, response);
•
• //rd.include(request,response);
•
• out.print("用户名为:"+username);
• out.println(" </BODY>");
• out.println("</HTML>");
• out.flush();
• out.close();
• }
•