web.xml中与Servlet配置相关的元素
- <servlet-name> 指定Servlet的名字,这个名字在同一个Web应用程序中必须是唯一的
- <servlet-class> 指定Servlet类的完整限定名
- <description> 为Servlet指定一个文件描述
- <display-name> 为Servlet指定一个简短的名字
- <icon> 为Servlet指定一个图标,在某些图形化界面工具中用于表示该Servlet
- <init-param> 定义Servlet的初始化参数,该标签必须包含<param-name><param-value>可以包含零个或者多个<description>
- <description> 为初始化参数提供一个文本描述
- <param-name> 定义初始化参数的名字
- <param-value> 定义初始化参数的值
- <load-on-startup>
指定当web应用程序启动时,Servlet被加载的次数,元素的内容必须是一个整数,如果这个值是负数,或者没有设定该值,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正数或0,容器将在web应用程序部署时加载和初始化这个Servlet,并且先加载值小的,后加载值大的Servlet。 - <servlet-mapping> 在Servlet和URL样式之间定义一个映射
- <servlet-name> servlet的名字,必须为<servlet>元素中声明过的名字
- <url-pattern> 指定对应于Servlet的URL路径
- <context-param> 定义上下文的初始化参数,该标签必须包含<param-name><param-value>
可以包含零个或者多个<description>
<description> 为初始化参数提供一个文本描述
<param-name> 定义初始化参数的名字
<param-value> 定义初始化参数的值
会话跟踪
HTTP协议本身是基于请求/响应模式的,无状态的协议。也就是说,当客户端的请求到来,服务器端做出响应之后,连接就被关闭了。用户活动发送在多个请求和响应之中,作为web服务器来说,必须采用一种机制唯一的标识一个用户,同时记录该用户的状态。
Session
Java ServletAPI使用Session来跟踪会话和管理会话内的状态。当客户第一次连接到服务器的时候,服务器为其建立一个Session,并分配给客户一个唯一的标识(SessionID)以后客户每次提交请求,都要将该标识一起提交,服务器会根据标识找出特定的Session,用这个Session记录客户的状态。
javax.servlet.http.HttpSession
获取
- HttpServletRequest
- HttpSession getSession()
返回此次请求相关联的Session,如果没有客户端分配Session,则创建一个新的Session - HttpSession getSession(boolean create)
返回此次请求相关联的Session,如果没有客户端分配Session,当create为true,创建一个新的Session,如果create为false,返回null
- HttpSession getSession()
API
- setAttribute(String name,Object val) 保存信息
- Object getAttribute(String name) 读取信息
- Enumeration getAttributeNames() 获取所有session中的name
- removeAttribute(String name) 移除对应的信息
- long getCreationTime() 获取Session创建的时间
- String getId() 返回分配给Session的唯一标识符
- long getLastAccessedTime() 返回客户端最后一次发送与Session相关的请求的时间。
- getMaxInactiveInterval() 返回以毫秒为单位的最大间隔时间,这个时间是Servlet
容器在客户的两个连续请求之间保持Session打开的最大时间间隔,如果超过这个事件,Servlet容器将使Session失效 - setMaxInactiveInterval(int interval) 如果设置一个负值,表示Session永远不会失效
- ServletContext getServletContext() 返回Session所属的ServletContext对象
- invalidate() 使会话失效。
Cookies
Cookies 是一中由服务器发送给客户的片段信息,存储在客户端浏览器的内容中或硬盘上在客户随后对该服务器的请求中发回它,Cookies以键值对的形式记录会话跟踪的内容,服务器利用响应报头 Set-Cookie来发送Cookie信息,在Servlet规范中,用于会话跟踪的Cookie的名字必须是JSESSIONID。由于涉及隐私权和安全性方面的问题,用户在使用浏览器时,可以选择禁用Cookie,web服务器就无法利用Cookie跟踪用户的会话了,要解决这个问题需要重写URL
javax.servlet.http.Cookie
- Cookie(String name,String value)
构造cookie如果cooKie中保存的是中文需要对其进行编码。
URLEncoder.encode("这个是中国字","UTF-8");
URLDecoder.decode(cookie.getPath(),"UTF-8"); - String getComment()
返回Cookie目的的注释信息 - void setComment(String p)
设置Cookie目的的注释信息 - int getMaxAge()
返回Cookie的最大生存时间,以秒为单位,如果返回-1,表示该Cookie不能持久存储,只能存活于浏览器的内存中 - void setMaxAge(int ex)
设置最大生存时间,如果设置为0.表示请求浏览器删除该Cookie - String getName()
返回该Cookie的名字 - String getValue()
返回该Cookie的值 - void setValue(String val)
设置新值
Sesssion和Cookie的对比
-
Session是一种服务器端技术,Session对象在服务器端创建,通常采用散列表存储信息,Session在服务器端保存信息
-
Cookie由服务器发送给客户端的片段信息,存储在客户浏览器的内存或硬盘中,在客户随后对该服务器的请求中发回它。Cookie在客户端保存信息。
-
通常将用于会话跟踪的Cookie叫做会话Cookie,在Servlet规范字,用于会话跟踪的Cookie的名字必须是JSESSIONID,它通常保存在浏览器的内存中。浏览器内存中的会话Cookie不能被不同的浏览器进程所共享,共享只能发生在同一个浏览器进程的不同窗口中。
URL重写
即在URL中附加标识客户的SessionID,Servlet容器解析URL,取出SessionID,根据SessionId将请求与特定的Session关联。
HttpServletResponse
encodeRedirectURL() 主要在sendRedirect()方法调用之前使用
JDBC数据源和连接池
-
javax.DataSource接口为我们提供了另外一种方式建立数据库的连接,DataSource接口由驱动供应商来实现.利用DataSource建立数据库的连接,不需要在客户程序中加载JDBC驱动,也无需使用java.sql.DriverManager类。在程序中,通过向一个JNDI(Java Naming and Directory)服务器查询来得到DataSource对象,然后调用DataSoure对象的getConnnection()方法来获取数据库连接,DataSource对象可以看成是连接工厂,用于提供到此DataSource对象所表示的物理数据源的连接。
javax.naming.Context(接口)
javax.naming.InitialContext(Context的实现类)
Object lookup(String name) throws NamingException 查询一个命名的对象 -
JNDI名称空间由一个初始的命名上下文(context)及其下的任意数目的子上下文组成,JNDI名称空间是分层次的,与很多文件系统的目录/文件结构类似,初始上下文与文件系统的根类似,子上下文与子目录类似,JNDI层次的根是初始化上下文,在这里通过变量ctx来表示。在初始化上下文下有很多子上下文,其中之一就是jdbc,jdbc是子上下文保留给JDBC数据源使用,逻辑数据源的名字可以在子上下文jdbc中,也可以在jdbc下的子上下文中,层次中最后一级元素是注册的对象,与文件类似,即数据源的逻辑名jdbc/DefaultDS
环境命名上下文(Environment Naming Context) java:comp/env ,引入它是为了解决JNDI命名冲突的问题,
连接池:
建立数据库的连接相对耗时耗费资源,而且同一个数据库服务器能同时建立的连接数也是有限的,在大型web应用中,可能同时会有成百上千个访问数据库请求,如果为web应用程序为每个客户分配一个数据库连接,性能下降。为了重复利用数据库连接,提供对请求和响应时间和服务器的性能,可以采用连接池技术,连接池预先建立多个数据库连接对象,然后将对象保存到连接池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成后,客户调用close方法,将连接对象放入池中
tomcat实现了数据源和连接池,在<Context>元素中使用<Resource>元素配置JDBC数据源
<Resource>
<name> 指定资源相对于java:comp/env上下文的JNDI名
<auth> 指定资源的管理者, Application 和 Container
<type> 指定资源所属的java类的完整限定名
<maxActive> 指定在连接池中数据库连接的最大数目,取值为0,表示没有限制
<maxIdle> 指定在连接池中保留的空间的数据库连接最大数目,取值-1,表示没有限制
<maxWait> 指定等待一个数据库连接的最大时间,毫秒为单位,-1,永久等待
<username> 指定连接数据库的用户名
<password> 指定连接数据库的密码
<driverClassName> 指定jdbc驱动程序类名
<url> 指定连接数据库的URL
例如:
<Resource auth="Container"
name="jdbc/DefaultDS"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/yx?autoReconnect=true&useUnicode=true&characterEncoding=utf8"
username="shiyue"
password="shiyue"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
maxActive="100"
maxIdle="30"
maxWait="1000"
/>
实战:
Session使用方法:
- 创建或获取Session
HttpSession session = request.getSession(true);
服务器会根据客户端发来的请求中的jsessionid 获取相对应的Session,如果获取不到或者请求端不包含jsessionid,服务器端将重新创建一个Session,并将此jsessionid作为cookie写回到客户端(始终都是这样)。
1.设置属性
session.setAttribute(key,val)
将属性保存到session中,该session会一只存在,直到session过期,或者jsessionid丢失,无法找到该session,这时候我们称会话结束。
Cookie使用方法
1.创建Cookie
String val = URLEncoder.encode(str,"UTF-8");
Cookie cookie = new Cookie(key,val);
如果cookie中保存的是中文,要进行编码,在获取的时候要进行响应的解码URLDecoder.decode(cookie.getValue(),"UTF-8");
1.设置最大存活周期,以秒为单位
cookie.setMaxAge(soc);
-1/默认 会话cookie
0 删除该cookie
1.保存cookie
response.addCookie(cookie); //服务器利用响应报头将cookie保存到浏览器端,待浏览器下次
发送请求的时候会将浏览器保存的所有的cookie发送到服务器端。
使用数据源方法
- 在context.xml配置数据源
- 将驱动包导入到tomcat的lib目录下
- 书写代码
Context context = new InitialContext(); DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/DefaultDS"); Connection conn = ds.getConnection(); 如果集成到hibernate中 <property name="connection.datasource">java:comp/env/ jdbc/DefaultDS</property>
网友评论