Servlet-jsp从入门到精通(二)

web.xml中与Servlet配置相关的元素

  1. <servlet-name> 指定Servlet的名字,这个名字在同一个Web应用程序中必须是唯一的
  2. <servlet-class> 指定Servlet类的完整限定名
  3. <description> 为Servlet指定一个文件描述
  4. <display-name> 为Servlet指定一个简短的名字
  5. <icon> 为Servlet指定一个图标,在某些图形化界面工具中用于表示该Servlet
  6. <init-param> 定义Servlet的初始化参数,该标签必须包含<param-name><param-value>可以包含零个或者多个<description>
  7. <description> 为初始化参数提供一个文本描述
  8. <param-name> 定义初始化参数的名字
  9. <param-value> 定义初始化参数的值
  10. <load-on-startup>
    指定当web应用程序启动时,Servlet被加载的次数,元素的内容必须是一个整数,如果这个值是负数,或者没有设定该值,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正数或0,容器将在web应用程序部署时加载和初始化这个Servlet,并且先加载值小的,后加载值大的Servlet。
  11. <servlet-mapping> 在Servlet和URL样式之间定义一个映射
    1. <servlet-name> servlet的名字,必须为<servlet>元素中声明过的名字
    2. <url-pattern> 指定对应于Servlet的URL路径
  12. <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

获取
  1. HttpServletRequest
    • HttpSession getSession()
      返回此次请求相关联的Session,如果没有客户端分配Session,则创建一个新的Session
    • HttpSession getSession(boolean create)
      返回此次请求相关联的Session,如果没有客户端分配Session,当create为true,创建一个新的Session,如果create为false,返回null
API
  1. setAttribute(String name,Object val) 保存信息
  2. Object getAttribute(String name) 读取信息
  3. Enumeration getAttributeNames() 获取所有session中的name
  4. removeAttribute(String name) 移除对应的信息
  5. long getCreationTime() 获取Session创建的时间
  6. String getId() 返回分配给Session的唯一标识符
  7. long getLastAccessedTime() 返回客户端最后一次发送与Session相关的请求的时间。
  8. getMaxInactiveInterval() 返回以毫秒为单位的最大间隔时间,这个时间是Servlet
    容器在客户的两个连续请求之间保持Session打开的最大时间间隔,如果超过这个事件,Servlet容器将使Session失效
  9. setMaxInactiveInterval(int interval) 如果设置一个负值,表示Session永远不会失效
  10. ServletContext getServletContext() 返回Session所属的ServletContext对象
  11. invalidate() 使会话失效。
Cookies

Cookies 是一中由服务器发送给客户的片段信息,存储在客户端浏览器的内容中或硬盘上在客户随后对该服务器的请求中发回它,Cookies以键值对的形式记录会话跟踪的内容,服务器利用响应报头 Set-Cookie来发送Cookie信息,在Servlet规范中,用于会话跟踪的Cookie的名字必须是JSESSIONID。由于涉及隐私权和安全性方面的问题,用户在使用浏览器时,可以选择禁用Cookie,web服务器就无法利用Cookie跟踪用户的会话了,要解决这个问题需要重写URL

javax.servlet.http.Cookie

  1. Cookie(String name,String value)
    构造cookie如果cooKie中保存的是中文需要对其进行编码。
    URLEncoder.encode("这个是中国字","UTF-8");
    URLDecoder.decode(cookie.getPath(),"UTF-8");
  2. String getComment()
    返回Cookie目的的注释信息
  3. void setComment(String p)
    设置Cookie目的的注释信息
  4. int getMaxAge()
    返回Cookie的最大生存时间,以秒为单位,如果返回-1,表示该Cookie不能持久存储,只能存活于浏览器的内存中
  5. void setMaxAge(int ex)
    设置最大生存时间,如果设置为0.表示请求浏览器删除该Cookie
  6. String getName()
    返回该Cookie的名字
  7. String getValue()
    返回该Cookie的值
  8. void setValue(String val)
    设置新值
Sesssion和Cookie的对比
  1. Session是一种服务器端技术,Session对象在服务器端创建,通常采用散列表存储信息,Session在服务器端保存信息

  2. Cookie由服务器发送给客户端的片段信息,存储在客户浏览器的内存或硬盘中,在客户随后对该服务器的请求中发回它。Cookie在客户端保存信息。

  3. 通常将用于会话跟踪的Cookie叫做会话Cookie,在Servlet规范字,用于会话跟踪的Cookie的名字必须是JSESSIONID,它通常保存在浏览器的内存中。浏览器内存中的会话Cookie不能被不同的浏览器进程所共享,共享只能发生在同一个浏览器进程的不同窗口中。

URL重写

即在URL中附加标识客户的SessionID,Servlet容器解析URL,取出SessionID,根据SessionId将请求与特定的Session关联。
HttpServletResponse
encodeRedirectURL() 主要在sendRedirect()方法调用之前使用

JDBC数据源和连接池
  1. 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 查询一个命名的对象

  2. 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使用方法:

  1. 创建或获取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发送到服务器端。

使用数据源方法

  1. 在context.xml配置数据源
  2. 将驱动包导入到tomcat的lib目录下
  3. 书写代码
  4.          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>  
    

serlvet-jsp从入门到精通(一)
serlvet-jsp从入门到精通(三)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,183评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • web技术的发展 早期的web应用主要是静态页面的浏览,这些静态页面使用HTML语言编写,放在服务器上,用户使用浏...
    清枫_小天阅读 2,233评论 0 20
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 首先说一下自己的工作经历。在大学毕业之前,从来没有实习过。因为学的是计算机专业,对编程什么的也不感兴趣也没有进行过...
    小红帽_阅读 711评论 1 3