首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

servlet学习札记(三)

2012-11-06 
servlet学习笔记(三)一、连接池在应用的META-INF文件夹下context.xml文件中ContextResourcenamejdbc/o

servlet学习笔记(三)
一、连接池
在应用的META-INF文件夹下context.xml文件中
<Context>
   <Resource
      name="jdbc/oracle" 配置JDNI的名字
      type="javax.sql.DataSource" 绑定资源的类型
      password="sd0605"
      driverClassName="oracle.jdbc.driver.OracleDriver" 驱动名
      maxIdle="1"最大连接数
      maxWait="-1"等待时间,配置为-1就是无限等待,只到有空闲连接为止
      username="sd0605"
      url="jdbc:oracle:thin:@192.168.0.39:1521:TARENADB"
      maxActive="3" 最大活动连接数/>
</Context>     

以下是从连接池去取数据库连接的代码
public static Connection getConnection(String JNDIName){
Connection conn = null;
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env"); //这个是在tomcat下默认绑定Context的JNDIname
DataSource ds = (DataSource) envCtx.lookup(JNDIName);
conn = ds.getConnection();
} catch (NamingException ne){
ne.printStackTrace();
} catch (SQLException se){
se.printStackTrace();
}
return conn;
}


二、Java EE编程分层
   表现层,业务层,数据层。
表现层,也就算用来显示数据,接受数据的。JSP,Servlet
业务层,是处理核心业务的程序 EJB,JDBC(Hibernate)
数据层,也就是数据库,用来存放数据。Oracle,SQLServer

   MVC框架
Model,模型层,这一层一般是进行数据库访问,并且封装对象,这一层中也存放在访问数据库取出信息封装成对象的类,也就是实体类的信息,
      可以使用JDBC或者Hibernate实现这一层的功能。
Ctrl,控制曾,用来相应请求和调用写好的相应的访问数据库的方法,这一层是用来控制请求的响应的,现在我们是使用Servlet来实现这一层,
      不过一般是会用开源的MVC框架来实现这层,例如struts,或者是Spring的MVC框架。
View,表现层,他只用来显示数据和收集必要数据,收集数据的一般是form表单,不过要保证数据的正确性要是用JavaScript验证信息,以后我
      们会学到的JSP(java server page)就是用来表现、显示数据的。
     
三、Servlet的控制流转
ServletContext,Servlet上下文对象,在每个Servlet中都会有一个ServletContext的引用,这个ServletContext是一个全局的对象,每个应用
               中只有一个ServletContext对象。
HttpServlet中的getServletContext()方法,获得ServletContext对象。
ServletContext类的getRequestDispatcher(String path)方法获得一个RequestDispatcher对象,并且跳转到指定的Servlet,
              getRequestDispatcher(String path)方法中的参数就是path,就是指定跳转的Servlet的url-pattern。
RequestDispatcher类的forward(ServletRequest request, ServletResponse response) 方法,可以把请求对象转发给其他的Servlet。
     
include用在v层
forward用在c层

ServletRequest.getRequestDispatcher();  //relative     
ServletContext.getRequestDispatcher();  //absolute

一个Servlet对应一个Config,不能互相读取
要想让所有的Serlvet都能读到参数:配置Context初始化参数,或者配置JNDI Naming的初始化参数                    

(1)配置Context容器的初始化参数
<context-param>
   <param-name>email</param-name>
   <param-vlaue>liyan@tarena.com.cn</param-vlaue>
</context-param>

在servlet的使用
getSevletContext().getInitParameter("email");

(2)配置JNDI Naming的初始化参数
<env-entry>
   <env-entry-name>email<env-entry-name>
   <env-entry-type>java.lang.String<env-entry-type>
   <env-entry-value>liyan@tarena.com.cn<env-entry-value>
</env-entry>

使用,得到初始化参数
Context ctx = new InitialContext();
String email = (String)ctx.lookup("java:comp/env/email");


四、会话
会话是可以保存状态的

Session(会话)和Cookie(会话跟踪机制)

Session对象用来解决客户端发送多个请求时来用户请求信息的存储问题,但是他和ServletRequest对象是不同的,他会在有需要时创建,
但是他的生命周期会比请求对象要长。Session对象的生命周期也是有限制的,如果长时间的没有访问,就会销毁掉Session对象,可以通
过Session对象的
setAttribute(String name, Object o) 和getAttribute(String name)来存取数据信息。Session是用户级的对象。

public void service(ServletRequest request,ServletResponse response){

String user = request.getParameter("user");
        String pass = request.getParameter("pass");
HttpSession session = request.getSession(true);//使用请求对象来创建Session
        session.setAttribute("username", user);
        session.setAttribute("passwd", pass);
}


getSession(true)就表示如果Session不存在就创建一个新的Session,并把Session的标识SessionID写到Cookie中,如果存在就是用这个
Session。getSession(false)就是在Session不存在时不会创建新Session而是返回null。如果使用getSession()方法,就等同于getSession(true)。

注意:ServletRequest对象适用于传输大量的数据,因为其生命周期比较短,可以有效的节省内存资源。
大数据量的传输或保存不适合使用Session空间。

Cookie,是记录用户的Session信息,也可以记录用户的请求信息,也就是SessionID,来分辨哪一个用户是否登陆过。在每次登陆时,
还会将Cookie发送回服务器端,Cookie是用来跟踪Session的。

public void service(ServletRequest request,ServletResponse response){

String user = request.getParameter("user");
        String pass = request.getParameter("pass");
Cookie userCookie = new Cookie("user", user);
        userCookie.setMaxAge(60 * 60 * 24 * 365);//设置Cookie的最大有效期,秒为单位
        Cookie passCookie = new Cookie("pass", pass);
        passCookie.setMaxAge(60 * 60 * 24 * 365);
        response.addCookie(userCookie);
        response.addCookie(passCookie);

}

热点排行