java Servlets(二)

资源跳转的方式
(内部跳转:forward和include,外部跳转:sendRedirect)
  1)forward
    forward后的响应内容由所请求的资源给出
     RequestDispatcher rd=request.getRequestDispatcher("SuccessServlet");
     request.setAttribute("userinfo", "new User()");
     rd.forward(request, response);
  2)include
    inclue后的响应内容由其本身给出
out.println("<html><body>");
RequestDispatcher rd = request.getRequestDispatcher("/ch04/header");
rd.include(request,response);
out.println("</body></html>");
  forward和include的相同点:
    绝对路径中/都是web应用
    服务器内跳转,客户端地址栏无变化
    都是同一个请求
  3) sendRedirect
    客户端地址栏发生变化
    两次请求,request范围内设置的所有属性将失效
response.sendRedirect("ShowInfo");
/指代 响应内容 地址栏 请求 跨应用
forward
web应用 请求资源 不变 一次 不能
include
web应用 本身 不变 一次 不能
sendRedirect
服务器 请求资源 变化 两次 能
web应用:  http://localhost:8080/hello
服务器:     http://localhost:8080
<form action="/...">,<a href="/...">:"/"指代服务器
注:能用forward方式,就不要用sendRedirect
1)从性能
2)从对服务器内部资源的保护(地址栏内能否显示服务器资源URL)
考虑
保护服务器资源
1)使用Filter对请求进行过滤
2)把要保护的资源方到WEB-INF下,客户端浏览器不能直接访问该目录下
的资源,我们可以通过Servlet等访问
设置属性的四个范围:
范围 对应类 Jsp内建对象
javax.servlet.ServletContext application
应用级别 针对整个web应用
javax.servlet.http.HttpSession session
会话级别 针对一次会话
javax.servlet.http.HttpServletRequest request
请求级别 针对一次请求
javax.servlet.jsp.PageContext page
页面级别 针对一个页面
注:一个application可以跨越多个session,一个session可以跨越多个request,
一个request可以跨越多个page;
实际项目开发中,从性能、占用资源角度考虑,优先使用小级别的;
获取RequestDispatcher
1)HttpServletRequest.getRequestDispatcher(...):相对/绝对路径
2)ServletContext.getRequestDispatcher(...):绝对路径
注:这里的相对是绝对,/表示web应用(如http://localhost:8080/hello)
3)ServletContext.getNamedDispatcher(...):根据servlet的名字获取
------------------------------------------------------------------------------------------
forward之前不能pw.flush();
------------------------------------------------------------------------------------------
外部跳转:让浏览器重新发送一个新的请求,跳转前后不是同一个请求;访问前后路径不同;
------------------------------------------------------------------------------------------
总结:
forward:内部跳转或则是服务器内部重定向;
servlet1-------forward-----servlet2
servlet1和servlet2中的request对象是同一个。
sendRedirect:外部跳转或则服务器外部重定向;
servlet1-------sendredirect-----servlet2
servlet1和servlet2中的request对象不是同一个。
作外部跳转调用response的sendRedirect方法,这个方法中传入的路径可以是相对的,也可以是绝对的;
相对的跟forward相同;
绝对的:应用路径+servlet url-pattern(这点和内部跳转是不同的);
------------------------------------------------------------------------------------------
四、在tomcat中配置数据源
  1)Admin登录,找到项目
  2)创建Data Source
    JNDI Name:  jdbc/oracle
    URL:  jdbc:oracle:thin:@192.168.1.200:1521:briupdb
    Driver:  oracle.jdbc.driver.OracleDriver
    User:  briup
    Password:  briup
  3)web.xml中配置资源引用(可选,新版本的tomcat不需要配置)
    <resource-ref>
  <description>
Oracle Datasource example
</description>
  <res-ref-name>jdbc/oracle</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
    </resource-ref>
  4)Context ctx = new InitialContext();

     DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle");
  注:配置数据源之后,在Tomcat/config/Catalina/..目录下会新建一个xml文件,
  里面存放数据源相关的信息
五、持久化状态:Cookie,Session
HTTP协议是无状态的,为了保存会话状态,我们有两种解决方案:
1、Cookie,把会话状态信息保存在客户端
2、Session,把会话状态信息保存在服务器端
Cookie:保存一些键/值对,到客户端浏览器
  name:briup
  password:briup
使用Cookie:
  1)创建Cookie
     Cookie cookie = new Cookie("name","value");
  2)将Cookie加到客户端浏览器
    HttpServletResponse.addCookie(cookie);
  3)在服务器端取出Cookie(返回Cookie[ ])
    HttpServletRequest.getCookies();
    Cookie.getName();
    Cookie.getValue();
  会话Cookie:只在当前会话起作用的Cookie
  持久Cookie:保存在客户本地一段时间的Cookie
  设置Cookie的时长:Cookie.setMaxAge(int second),单位秒
  设置Cookie的有效路径:Cookie.setPath(...)
  Cookie:由服务器创建,但是存放在客户端;
  Cookie cookie=new Cookie(name,value);
  cookie.setMaxAge(timeout);
  当timeout<0时,意味着这个cookie只要浏览器关闭就会消失;
  当timeout=n(n>0)时,意味着cookie将会在客户端被保存n秒;
  当timeout=0时,意味着这个cookie将会被删除;
  name相同的cookie会被覆盖.
  response.addCookie(cookie);
  服务器端获得客户端传过来的cookie:Cookie[] cookies=request.getCookies();
Session:
  获取Session的方法:
    HttpServletRequest.getSession()<==>HttpServletRequest.getSession(true)
    如果客户和服务器已经建立起会话,直接使用已有的Session对象,
    如果没有建立,就新建一个Session对象
    HttpServletRequest.getSession(false);
    设置属性:HttpSession.setAttribute("name",Object);

    获取属性:HttpSession.getAttribute("name");
    删除属性:HttpSession.removeAttribute("name");
  使用Session来保存会话信息,在客户端也要留下一个标识,一般用JSESSION表示
  在用户禁用Cookie时使用Session方式在服务器端维持会话状态,在客户端要留一个Session的id号,
  优先使用Cookie的JSESSIONID存放,如果禁用了Cookie,URL重写的Session id号会被追加到
  浏览器地址中URL的后面,用jsessionid表示
    (http://localhost:8888/servlet/ch5/urlcounter;jsessionid=9FFA9CCB7D86134E0256E94D05E6DC44)
    重写:String encodedURL = response.encodeURL("/servletjd0710/ch05/UrlBasedCounterServlet");
  Session什么时候失效?
    1:程序中调用HttpSession.invalidate()方法
    2:Session过期,在Session的最大有效时间以外
    3:关闭应用服务器
  设置Session的有效时间:
    1:HttpSession.setMaxInactiveIntervale(int second) 单位秒
    2:在web.xml中进行配置
    <session-conf>
<session-timeout>...</session-timeout><!-- 单位分钟 -->
    </session-conf>
注意:当程序中和web.xml中都设置了Session的有效时间时,以程序中的设置为准

你可能感兴趣的:(java,oracle,应用服务器,浏览器,servlet)