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);
}