`
Mr.Zero
  • 浏览: 33191 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

head first 学习笔记 JSP&Servlet--4

    博客分类:
  • java
阅读更多
1. 不是所有的类都需要实现序列化接口,在同一个JVM中,且未写入存储设备中,不需要实现序列化接口。

2. 了解各种常见的监听器

3. 三种存储空间的比较

                应用上下文            请求                                  会话

生命周期        整个应用           单个请求(线程安全)                 会话连接(非线程安全)

可访问性        servlet,jsp,       持有这个会话的所有servlet          该请求相关的对象及相关监听器
                lisntener etc        jsp

适用于         整个应用共享的资源    与客户端会话有关的资源和数据      将模型数据从控制器传递到视图 
                DB连接,JNDI,
                 email

4. 上下文中值的存储设置需要设置为线程安全,对关键代码做同步,而不需要对所有方法做同步

例如:
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        PrintWriter out = resp.getWriter();
        out.println("test content attributes<br>");

        synchronized(getServletContext())
        {
            getServletContext().setAttribute("foo", "22");
            getServletContext().setAttribute("bar", "42");
           
        }

        out.println(getServletContext().getAttribute("foo"));
        out.println(getServletContext().getAttribute("bar"));
       
       
    }

  
   5. 会话中保持线程安全。同理,在获取会话的时候进行同步加锁

        HttpSession session = req.getSession();
        synchronized (session)
        {
            session.setAttribute("foo", "df");
            session.setAttribute("bar", "df");
        }
       
        out.println(session.getAttribute("foo"));
        out.println(session.getAttribute("bar"));


   6. 若是多个线程在运行某段servlet代码,那么该servlet的实例变量也不是线程安全的,所以尽量不要在servlet中定义实例变量。
      servlet只有一个实例,但是可以有多个线程  。若是为了解决多个线程访问同一个值的话,那么可以考虑设置在某一级别的作用域中 


7. 不同获得dispatch的方式
      RequestDispatcher dispatcher = req.getRequestDispatcher("result.jsp");
         -- 这种方式获得的对象可以针对相对路径进行转发

      RequestDispatcher dispatcher2 = getServletContext().getRequestDispatcher("/result.jsp");
         -- 这种方式或的对象不能针对当前相对路径进行转发,需要设置斜杠来跳转 /

   8. 如果已经提交了响应,那么就不能进行转发操作,否着会报无效状态异常

   9. 会话 session
        1.HttpSession session = req.getSession();
        2.HttpSession session2 = req.getSession(true);

    两者完全相同,若是会话不存在的话,创建一个新的会话。存在的话则使用旧的会话

        3.HttpSession session3 = req.getSession(false);
    如是已经存在会话的话,则返回会话对象,若是不存在的话,那么返回null

为了保持同一个session的话,是通过cookie来实现的,若是客户端屏蔽了cookie的话,那我们可以使用URL重写的方式来保持session的统一


URL重写的方式有两种:
  
     1. 不加URL重写
        out.println("<html><body>");
        out.println("<a href=\"Listener.do\">click me</a>");
        out.println("</body></html>");

这种方式的跳转不会在禁止cookie的情况下会丢失session,返回的地址是:
http://localhost:8080/JspStu/Listener.do

     2. 加上URL重写
        out.println("<html><body>");
        out.println("<a href=\""+resp.encodeURL("Listener.do")+"\">click me</a>");
        out.println("</body></html>");

这种方式在跳转时,在禁止cookei的情况下亦不会丢失session,返回的地址是:
http://localhost:8080/JspStu/Listener.do;jsessionid=8391FEED24807566F8E10A127BA1BC80

   使用URL重写就必须保证页面时动态生成的
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics