1.Servlet规范 1.1 规范了应用服务器 tomcat(Servlet容器,没有ejb容器) jboss weblogic(有Servlet容器,也有EJB容器) 1.2 规范了java web项目的一个结构. 1.3 规范了我们程序员所写的Servlet, 其实就是现实了一个Servlet接口 2.Servlet接口 init(ServletConfig); 1. 如果没有配置load-on-startup的时候在第一次访问的时候执行 2. 如果配置的load-on-startup是在服务器启动的时候执行 service(ServletRequest,ServletResponse) 任何一次请求都执行 destroy(); 服务器正常关闭的时候执行. 3.Servlet的生命周期 1.在浏览器上面访问. http://www.itcast.cn:8080/bbs/myServlet 2.浏览器会根据www.itcast.cn,先到本机的host文件中找对应的IP地址,没有找到则到DNS服务器上面来解析出IP. 3.根据解析出来的IP和端口8080连接到服务器 4.浏览器要向服务器发送一个请求头: GET /bbs/myServlet HTTP/1.1 Host: www.itcast.cn 5. 根据Host找Server.xml中找对应的虚拟主机 6. 找到虚拟主机后, 根据Context path="/bbs" 去掉path的值得到具体请求的资源 /MyServlet. 7. 根据具体请求的资源 /MyServlet到 Context docBase="" 中具体的资源. 8. 根据资源路径/MyServlet到web.xml匹配 url-pattern. 8.1 如果没有匹配上资源路径. 返回404,文件找不到.. 8.2 找到了..匹配到url-pattern 9. 根据url-pattern找到servlet-name. 根据servlet-name的值到Servlet缓存中找Servlet对象 Servlet缓存:Map<String,Servlet> map = new HashMap<String,Servlet>(); servlet-name作为map键 Servlet对象作为map值 9.1 从缓存中找到 ... 直接执行..service.... 9.2 从缓存中没有找到 10. 如果没有找到servlet对象.. 根据servlet-name找Servlet标签从而找到servlet-class 11. 根据servlet-class通过反射创建Servlet对象 Class clazz = Class.forName(servlet-class) Servlet serlvet = (Servlet)clazz.newInstance(); //默认的无参的构造函数 同时要把该对象存入Servlet缓存中 12. Servlet容器创建一个ServletConfig对象,传递一个Servlet对象的init方法... 13. Servlet容器创建一个ServletRequest和一个ServletResponse,传递给service方法... 4. Servlet相关的API 4.1 ServletConfig getInitParameter(String name); getInitParameterNames(); getServletCoantext(); getServletName(); //web.xml中配置的servlet-name节点的值 4.2 HttpServletRequest //获取请求客户端的信息 getCookies(); getParameter(String name); getParameterValues(String name); getParameterMap(); //得到请求参数名字和值的键值对... String的键 String[]的值 getRequestURI(); 得到Host后面的资源路径,但是不带参数 getRequestURL(); 得到全路径 getRemoteAddr(); 得到IP getHeader(String name) 得到请求头信息 getSession() 得到session request.setCharacterEncoding("UTF-8") 4.2 HttpServletResponse //发送内容给客户端 setContentType("text/html;charset=utf-8") setHeader(String name,String value) 设置响应头 sendRedirect(String location) getWriter(); getOutputStream(); 4. Servlet的继承体系: Servlet 接口 GenericServlet实现Servlet接口,并且实现了ServletConfig. 就是让我们少写了一步获取ServletConfig对象 HttpServlet extends GenericServlet{ service(ServletRequest ,ServletResponse){ 转成一个WEB相关的对象 HttpServletRequest request HttpServletResponse response String method = request.getMethod(); if(method.equ...get..){ doGET } if(method.equ...post..){ doPost } } doGET{} doPost{} } 5. 处理请求的参数: getParameter(String name); getParameterValues(String name); getParameterMap(); //得到请求参数名字和值的键值对... String的键 String[]的值 处理中文乱码的问题 5.1 GET请求 new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); 5.2 POST请求 request.setCharacterEncoding("UTF-8") 如果说响应中出现了乱码的话. setContentType("text/html;charset=utf-8") 6. Cookie.. 为什么要使用cookie. 因为HTTP协议是一个无状态的... 其实就是在浏览器上面保留一个【键和值】得文本内容. 如果保留了的话,再后面的请求中,浏览器都会主动的将这个信息发送给服务 器.. 6.1 Cookie添加 Cookie cookie = new Cookie(String name,String value); //默认的状态下是一个临时的cookie,该cookie保持中浏览器的内存中.. 如果浏览器关闭的话,cookie就消失 cookie.setMaxAge(); //秒.. //设置了时间的话就是持久的cookie,保持在硬盘上的.. response.addCookie(cookie); //响应头的set-cookie 6.2. cookie的查找 Cookie[] cookies = request.getCookies(); if(cookes!=null){ for(Cookie cookie: cookies){ if(cookie.getName().equals("指定的名字")){ cookie.getValue(); break; } } } 6.3. 删除指定的一个cookie //创建一个名字样的cookie从而覆盖原来的cookie. 并且需要设置改cookie的保留时间为0 Cookie cookie = new Cookie(String sameName,null); cookie.setMaxAge(0); response.addCooke(cookie); 6.4 更新指定的一个cookie //创建一个名字样的cookie从而覆盖原来的cookie. Cookie cookie = new Cookie(String sameName,String newValue); response.addCooke(cookie); 6.5. cookie中文问题 因为cookie的传递是通过请求头和响应头来传递的.. 而在请求头和响应头中时不能够采用中文的, 所以说存储中文之前将其编码.. //添加之前编码 Cookie cookie = new Cookie(String name,URLEncoder.encode("中文","UTF-8")) response.addCookie(cookie); //接收到的时候,在对其进行解码 Cookie[] cookies = request.getCookies(); if(cookes!=null){ for(Cookie cookie: cookies){ if(cookie.getName().equlas("指定的名字")){ String value = URLDecoder.decode(cookie.getValue(),"UTF-8"); break; } } } 7. Session... cookie有一定的缺陷... cookie是放在客户浏览器端的,不安全.. 并且存储的数量和大小都限制. 所以使用Session 7.1 Session创建 //1. 根据请求上面看看有没有指定的jsessionid的cookie,根据jsessionid找对应的session,如果没有找到就会重新创建一个 session,从而将session生成一个编码以临时cookie的方式发送给浏览器.... HttpSession session = request.getSession(); Map<String,Object> request.getSession(boolean create) ;///create如果为true的话和上面是一样的.. 如果为false的话,根据jsessionid找 不到对应的session,那么也不创建对象. 7.2 向session中设置内容 session.setAttribute(String name,Object object); 7.3 获取session中的内容 session.getAttribute(String name); 返回名字对应的值,如果没有对应值的话,返回null 7.4 session的特点 session的值保持在服务器上的.. 如果浏览器不接受cookie的话, url重写的形式方法请求,然后再请求地址上面加上jsessionid http://localhost:8080/myservlet;jsessionid=asdfasdflas8d9f7a9sf response.encodeURL(""); response.encodeRedirectURL(""); 这两个方法可以传入的字符串加上jsessionid 7.5. session的超期管理 为什么要使用session的超期管理. 因为session在服务器端保持,如果没有再使用的情况下需要释放占用的内存.如果不释放的话将会越来越多. 可能导致服务器内存 溢出.. 7.1 session.invalidate();//直接释放掉 7.2 session.setMaxInactiveInterval(秒) //设置最大的活动时间间隔.. 7.3 在当前项目的web.xml中配置session-config 中的session-timeout 分钟 7.4 如果当前项目的web.xml中没有配置. 那么默认的使用Tomcat/conf/web.xml中配置的session-config 中的session-timeout 分钟 优先级的顺序为:7.1>7.2>7.3>7.4 7.6 session的API getId(); isNew(); getServletContext(); 8. 共享控制 8.1 forward 强调的是将请求转发给下一个Servlet或者是资源 RequestDispacher rd = request.getRequestDispacher(/当前项目的资源路径) rd.forward(request,response); 最后的目标资源决定发送给浏览器的内容. 转向的Servlet和当前Servlet使用的是内容一样的Request.. 8.2 url重定向 浏览器看到响应码是302并且有一个响应头是Location. 那么浏览器就会自己来发送一个到Location response.sendRedirect(String location) 8.3 include 强调的是将被包含的资源(Servlet,html) 的输出合并到当前Servlet中.一起输出给客户端.. RequestDispacher rd = request.getRequestDispacher("/当前项目的资源路径") rd.include(requst,response) 被包含的资源和当前资源使用的是内容一样的Request和response url重定向和forward的区别: 1>. 浏览器的地址是否发生改变: forward不改变. 因为只发送了一次请求. 那么具体的转发是在服务器端进行的. url重定向是改变的. 因为发送的下次请求的有浏览器发出的.. 2>. 是否可以发送外部的资源 forward不可以 url重定向是可以的 3>. 是否可以访问WEB-INF下面的资源 forward是可以的 url重定向是不可以 4>. /的区别: forward : 代表当前应用的根目录 url重定向: 代表当前服务器默认的项目的根路径. 在上面情况下使用 url重定向 和 forward的呢? 如果Servlet1 转到 Servlet2. 那么Servlet1 的一个运算结果需要Servlet2来处理. 那么必须使用forward的. 在Servlet1中将运算结果放在request.setAttribute(String name,Object object),然后在Servlet2里面可以 request.getAttribute(String name);获取到 其他的两种都可以... 8. 共享信息. pageContext: jsp Request(一次请求) Session(一次会话) ServletContext(整个WEB应用). 在线用户. ServletContext在服务器启动的时候创建. 服务关闭的时候销毁,在这个web项目中只有一个对象. 存放在该对象中的属性值是被所有 用户和Servlet所共享. 在上面的对象中都相同的方法: setAttribute(String name,Object object); getAttribute(String name):Object getAttributeNames() removeAttribute(String name) ServletContext中有重要的几个方法: getRealPath("/") 得到当前应用的跟目录的绝对路径 getRealPath("/WEB-INF/web.xml") getResourceAsStream("/web项目的相对路径") // 返回一个inputStream getInitParameter(String name)根据名字获取在web.xml中配置的初始化参数 <context-param> <param-name>configPath</param-name> <param-value>/WEB-INF/db.properties</param-value> </context-param> getContextPath() ;//得到当前应用的虚拟路径,在server.xml中配置的Context的path的值..