Servlet学习笔记

Servlet 学习笔记

一、动态网页技术发展

  • 静态网页技术
    • HTML: 无法进行用户交互
  • 动态网页技术
    • CGI: 效率低
    • ASP: html+javascript+com
    • PHP:php+mysql+linux+apache(流行结构)
    • JSP:html + java片段 + jsp + js

二、B/S结构与C/S结构比较

  • C/S结构:服务器和客户端都需要开发,例如QQ,服务器和客户端都需要腾讯开发和升级。
  • B/S结构:客户端是现成的,例如客户端为浏览器,只需要开发服务器,客户端为浏览器,不用开发。

三、Servlet技术(B/S)

3.1 什么是Servlet

  • Applet: java客户端小程序
  • Servlet:java服务器小程序

3.2 servlet运行环境

  • 浏览器

  • Web服务器(Tomcat,jBoss)

  • 数据库

    图片3.png

3.3 Tomcat

  • 免费的开源的servlet容器
  • 位于服务器端
  • 功能
    • web服务器:即可以接收浏览器的http请求,转发给servlet处理并返回页面
    • jsp和servlet的容器:存放jsp和servlet
  • 修改默认端口
    • /conf/server.xml
  • 修改虚拟目录
    • /conf/server.xml
    • 在</Host>之前,加入<Context path = "/MyWebSite" docBase="D:\MyWebSite" debug = "0">
  • 修改管理员密码
    • /conf/tomcat-users.xml
    • 防止非法用户远程登录到tomcat并发布有害站点(例如关闭服务器)

3.4 Servlet开发方法

  • 开发流程

    1. 在%TOMCAT_HOME%/webapps下WEB-INF的文件夹,写一个文件web.xml(该网站的配置信息),建立一个classes的子文件夹,也可以从别的目录ROOT下拷贝
    2. 开发servlet(见以下三种方法)
    3. 部署servlet(修改web.xml文件配置)
      <servlet>
        <servlet-name>hello</servlet-name>                <!—给servlet取名,可以随意取名-->
        <servlet-class>com.test.Hello</servlet-class>     <!—指明servlet的路径,就是servlet的包+类名-->
      </servlet>
      
      <servlet-mapping>
        <servlet-name>hello</servlet-name>                <!—给servlet取名,与上面的名字相同-->
        <url-pattern>/hello<url-pattern>                  <!—浏览器中输入的url,可以随意取名-->
      </servlet-mapping>
      
    4. 启动Tomcat,访问你的servlet,在浏览器的地址栏中输入:http://127.0.0.1:8080/myWebSite/hello 回车就可以看到servlet的输出
  • 三种开发方法

    1. 实现servlet接口
    • 需要实现init service destroy方法
    • 配置web.xml文件
    1. 继承GenericServlet
    • 需要实现service方法,相对简单
    • 配置web.xml文件
    1. 继承HttpServlet(目前用的最多的方法)
    • 需要重写doGet,doPost方法
      • 表单提交数据get和post请求的区别
      1. 从安全性看get < post。get提交的数据会在浏览器的地址栏显示
      2. 从提交的内容大小看get<post。get提交的数据不能大于2K,而post提交的数据理论上不受限制,但是实际编程中建议不要大于64K
      3. 从请求响应速度看get>post。get请求服务器立即处理请求,而post请求可能形成一个队列请求

3.5 Servlet生命周期

  • servlet部署在容器里(我们使用的是Tomcat,也可是别的,比如jboss,weblogic...),它的生命周期由容器来管理。
  • servlet的生命周期分为以下几个阶段:
    1. 装载servlet,由相应的容器来完成
    2. 创建一个servlet实例
    3. 调用servlet的init()方法,该方法只会在第一次访问servlet时被调用一次
    4. 服务:调用servlet的service()方法,一般业务逻辑在这里处理,该方法在访问该servlet时,会被调用
    5. 销毁:调用servlet的destroy()方法,销毁该servlet实例,该方法在以下情况被调用:
      a. tomcat重新启动
      b. reload该webapps
      c. 重新启动电脑

3.6 Servlet共享数据方法

3.6.1 同一用户的不同页面共享数据

即同一个账号的用户,如何在不同的http页面之间(即不同的servlet之间)共享信息

  • cookie技术(客户端)
    • 什么是cookie
      • Name Value
        String String
        服务器在客户端保存用户的信息,比如登录名、密码……就是cookie
        Name Value
        String String
    • cookie可以用来做什么
      1. 保存用户名、密码,在一定时间不用重新登录
      2. 记录用户访问 网站的喜好,比如有无背景音乐、网页的背景色是什么
      3. 网站的个性化,比如定制网站的服务、内容
    • cookie使用
      1. cookie有点像一张表,分两列,一个是名字,一个是值,数据类型都是String
      2. 如何创建一个cookie(在服务器端创建的)
        Cookie c=new Cookie(String name, String val);
      3. 如何将一个cookie添加到客户端
        response.addCookie(c);
      4. 如何读取cookie(从客户端读到服务器)
        request.getCookie();
    • cookie其他说明
      1. 可以通过IE—工具—internet选项—隐私—高级来启用或是禁用cookie
      2. 由于cookie的信息是保存在客户端的,因此安全性不高
      3. cookie信息的生命周期可以在创建时设置(比如30s),从创建那一时刻起,就开始计时,到时该cookie的信息就无效了
  • sendRedirect()跳转
    • sendRedirect("welcome?name="+user+"&pass="+psw);
    • 其中welcome是sevlet的url,?后面是两个传递的变量name和pass,第二个变量需要加AND符号&
    • 传送较快,但只能传字符串,不能传类
    • 传送的变量会在浏览器url中显示,密码等敏感信息不能传送
  • 隐藏表单提交

    • hidden 不会显示在页面上,但是后台servlet可以获取该值
      <form action=login>
      <input type=hidden name=a value=b>
      </form>
      
  • session技术(服务器端)

    • 什么是session

      • 当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为该浏览器分配一个空间,该空间被这个浏览器独占。这个空间就是session空间,该空间中的数据默认存在时间为30min,你也可以修改该值。一个浏览器实例拥有一个session。
    • 如何理解session

      • 可以把session看做一张表,这张表有两列,而表有多少行理论上没有限制,每一行就是session的一个属性。每个属性包含有两个部分,一个是该属性的名字String,另外一个是它的值Object。

        Name Value
        String Object
    • 如何使用session

      1. 得到session
        HttpSession hs=request.getSession(true);
      2. 向session添加属性
        hs.setAttribute(String name,Object val);
      3. 从session得到某个属性
        String name=hs.getAttribute(String name);
      4. 从session中删除掉某个属性
        hs.removeAttribute(String name);
      5. 注销session中的内容(比较安全的一种方式)
        ht.setMaxInactiveInterval(0);
    • session注意事项

      1. session中属性存在的默认时间是30min,你也可修改它存在的时间:
        (a)修改web.xml 全局修改改Tomcat/conf文件夹下面的web.xml,仅改某一个webapp的默认时间,则修改webapp下面的web.xml(b)在程序中修改
      2. 上面说的这个30min指的是用户的发呆时间,而不是累计时间
      3. 当某个浏览器访问网站时,服务器会给浏览器分配一个唯一的session id,并以此来区分不同的浏览器(即客户端)
      4. 因为session的各个属性要占用服务器的内存,因此软件公司都是在迫不得已的情况下才使用
    • session应用实例

      1. 网上商城中的购物车
      2. 保存登陆用户的信息
      3. 将某些数据放入到session中,供同一用户的各个方面使用
      4. 防止用户非法登陆到某个页面
  • cookie和session比较

    1. 存在的位置
      • cookie保存在客户端,session保存在服务器端
    2. 安全性
      • cookie的安全性比session要弱
    3. 网络传输量
      • cookie通过网络在客户端与服务器端传输,而session保存在服务器端,不需要传输
    4. 生命周期
      • cookie的过期时间是从创建开始计算的,session的过期时间是从最近一次使用时间开始计算的;
      • 关机会导致session生命周期结束,而对cookie没有影响;
    5. sessionCookie与persistentCookie
      • sessionCookie
        • session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,称为sessionCookie
        • 存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串
      • persistentCookie
        • 通常所说的cookie,存储在硬盘上
    6. 内在联系
      • 大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session

3.6.2 不同用户之间共享数据

  • ServletContext
    • ServletContext、cookie与session区别

      图片4.png
    • ServletContext使用方法

      1. 得到ServletContext实例 this.getServletContext();
      2. 添加属性setAttribute(String name, Object ob);
      3. 得到值getAttribute(String name); 返回Object
      4. Name Value
        String Object
        删除属性removeAttribute(String name);
        Name Value
        String Object
    • ServletContext生命周期

      • ServletContext中的生命周期从创建开始,到服务器关闭而结束。
    • ServletContext注意事项

      • ServletContext长时间占用服务器内存,建议不要向ServletContext中添加过大的数据,切忌。
      • 总之如果是涉及到不同用户共享数据,而这些数据量不大,同时又不希望写入数据库中,我们就可以考虑使用ServletContext来实现。
    • ServletContext应用实例

      1. 网站计数器
      2. 网站在线用户显示
      3. 简单的聊天系统

3.7 servlet数据库操作

  • 采用JDBC连接数据库

    • Class.forName("com.mysql.jdbc.Driver");
    • Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","test","020048");
    • Statement stat = conn.createStatement();
    • ResultSet rs = stat.executeQuery("select password from userinfo where username='"+ uname+"'");
    • 注意在finally语句中逆序关闭
  • 采用连接池方式连接数据库

    • 配置连接池
      • 在 /conf/server.xml中添加代码 or 在Tomcat中直接配置

      • 类似线程池,给数据库连接预先分配连接池,以提高性能。原先每次连接数据库都需要加载驱动得到一根连接,分配连接池后,如果连接池中有空闲的连接,就直接将其分配给请求客户端;如果没有空闲连接,则请求客户端在队列池中等待空闲连接;

        图片1.png
    • 使用连接池
      • 引入javax.sql,javax.naming
      • Context ctt=new javax.naming.InitialContext();
      • DataSource ds=(DataSource)ctt.lookup(“java:comp/env/数据源名”);
      • conn=ds.getConnection();
  • sql注入漏洞

    • select * from users where username='abc'and password = '123' or 1='1'
    • 当用户输入的密码为"123' or 1='1'"时,数据库所有数据泄露
  • 分页技术详解

    • 需要定义四个变量:
      • int pageSize:每页显示多少条记录
      • int pageNow:希望显示第几页
      • int pageCount:一共有多少页
      • int rowCount:一共有多少条记录
    • 数据库操作
      • select top pageSize 字段名列表 from 表名 where id not in(select top pageSize*(pageNow-1) id from 表名)
  • 注意事项

    • 需要将连接数据库的jar包,拷贝到tomcat服务器。具体有两种方法:
      1. 将jar包拷贝到tomcat目录下的lib文件夹里
      2. 在webapps目录的WEB-INF文件下建立一个lib文件夹,然后将jar包拷贝到该文件夹下
    • 两种方法的区别:
      1. 所有webapps都可以使用jar【公用lib库】
      2. 只有放入jar的那个webapps能使用jar【私用lib库】

3.8 网站框架改进

  • Model1模式(界面和业务逻辑混合)
    • 代码冗余

    • 框架层次模糊

    • 代码可读性、可维护性差(界面改动会影响业务逻辑)

      图片2.png
  • MV模式(M:Model,V:view)
    • 进行分层,将界面层和业务逻辑层分离

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

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,137评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • servlet 简介 1.servlet叫什么 Servlet(Server Applet)是Java Servl...
    维乾阅读 604评论 0 1
  • 图书馆真是个好地方,每个人在这静静的看书。 这里有许多人值得学习,每个人都在为自己的未来默默的做准备。...
    雷一凡阅读 298评论 0 0
  • 最近在解决ie8中支持webpack3 打包压缩支持ie8的问题。 之前框架中使用的是webpack1,现在要升级...
    宅神sean阅读 4,052评论 0 4