Servlet课上笔记

    这两天在学习servlet,课上自己动手记了了一些笔记,内容不是很详细,有些地方可能做的不是很明了,毕竟在课堂生还是以听和练为主,所以大家要是看就对付看吧。

   Servlet:
  1、什么是Servlet?
      是一个java类,要按照servlet规范来编写,并且要部署在符合servlet规范的容器当中运行。其
      作用是扩展web服务器的功能(生成动态资源,与CGI程序类似)。
                      请求a.html
                ——————————>                |—— 动态————>CGI程序
      browser        返回a.html                apche        
               <——————————非动态————|             
  2、Servlet的优点:
      (1)可以访问数据库
      (2)方便地处理业务逻辑
      (3)一个请求只会启动一个线程(CGI程序是一个请求启动一个进程),消耗的资源相对少
      (4)多个请求可以共享同一个Servlet实例
      (5)servlet可以在任何符合servlet规范的容器(tomcat/was/...)上运行,方便维护。
  3、如何去写一个servlet?
       step1:
          写一个java类实并现Servlet接口或者继承HttpServlet。
       step2:
          编译(依赖servlet-api.jar)
       step3:
          打包
   appName(应用名)
      WEB-INF
          classes(放servlet字节码)
          lib(比如数据库驱动)
          web.xml(部署描述文件:比如配置servlet-url)
       step4:
          部署   将第三步目录结构copy to 服务器特定的目录。
       step5:
          启动服务器
       step6:
          访问
http://ip:port/appName/servlet-url

  4、安装服务器
      (1)解压tomcat

      (2)配置环境变量
         JAVA_HOME
         CATALINA_HOME:tomcat解压到的目录
         PATH:CATALINA_HOME/bin
      (3)启动tomcat
         cd CATALINA_HOME/bin
         linux:sh startup.sh
         windows:startup.bat
      (4)http://localhost:8080
  5、服务端写servlet不用考虑网络问题
  6、web服务器=servlet容器(符合servlet规范的web服务器)
    

     1)、Servlet的运行的基本过程:

         http协议是应用层协议                               将请求中的数据先解析然后生成对象
          

              (1)请求(通过http协议)       servlet        (2)
         
——————————————>             ————————>HttpServletRequest(对象)
  browser                                        引      (3)
                                                    ————————>HttpServletResponse(对象) 
                   (7)响应                                (4)然后
           <——————————————         ————————>  Servlet
                                                                  调用service (5)处理请求
                                                       (6)引擎读取HttpServletResponse  

   第五步时可以从request中获取数据(方便),
   也可以将处理的结果放到response  
              第四步先看要调用的servlet是否有对应
                                                 的实例,若无,则创建实例,若有不再创建新的实例
        

  第二步为什么引擎要将请求中的数据转化成一个request对象?
  因为servlet不再需要考虑http协议。

step1 浏览器会将表单中的数据打包(http数据包)
step2 发送
       (地址 http:ip:port/appName/pricing(action的值)
step3 服务器将请求地址去掉应用名之前的内容(包括应用名),保留应用名之后的地址
       再将该地址与web.xml中的url-pattern作比较,找不到的话显示404
step4 找到
step5 如果servlet没有相应的实例则创建实例
step6 调service方法

   2)、Http协议

什么是http协议?
 超文本传输协议,用于制订浏览器与web服务器之间数据交互的方式与数据本身的格式。
 A.数据交互的方式
     浏览器发送连接请求
     服务器接受
     浏览器将数据打包,发送
     服务器处理完毕,数据打包,发送
  , 发送完毕,关闭连接。
 B. 数据包的格式
    请求数据包(请求消息)
       请求行:
           请求方式(get/post)
           要访问的资源路径(如果是get,包含请求数据)
           协议的版本号(1.0,1.1)
       若干消息头(浏览器与服务器之间的一些约定):
           比如在消息头中,可以携带cookie。
           又比如,在消息头中,可以告诉服务器,
           当前浏览器支持的语言。
       实体内容
           如果请求方式是post,则表单中的数据会存放到这儿。
           如果请求方式是get,则数据会放到请求行(资源路径之后)
   响应数据包(响应消息)
       状态行:
           协议的版本号
           状态码 
               404:找不到资源
               500:系统内部错误
               200:正常
           状态码的描述
       若干消息头:
           比如,告诉浏览器,以什么样的编码来显示返回的内容。
       实体内容:
           返回的处理结果。
 
 练习:
   计价
    规则  产品的最终价格 = 原始价格 * (1 + 税率)。
   界面:
    pricing2.html
    表单 
     原始价格 basePrice
     销售城市 city     先依据城市,找到对应的税率(if...else)。
 

  3 )、get/post方式:

   get方式:
       A. 表单默认提交的方式,浏览器地址栏直接输入一个地址,使用链接访问。
       B. 表单中的数据会添加到请求行,放置的数据有限,而且数据会直接在浏览器的地址栏显示,不安全。
       C. get方式,一般不适合用于浏览器向服务器提交数据。适用于请求某个资源。
   post方式:
       A.对表单,设置了method="post"。
       B.表单中的数据会添加到实体内容里,可以存放大量数据。相对于get方式,会安全一些。(不管哪种方式,都不是绝对安全的,因为浏览器不会对数据进行加密)
       C.一般如果有大量的数据需要提交给服务器。
 
   练习:
      写一个ListEmpServlet,会返回一个
      表格,表格中的内容是:
      id   name salary
      1  zs  2000

   4)、表单的处理


 

 (1)如果获得表单中的数据
  String request.getParameter(paramName);
  //有多个同名的paramName
  //比如 interest=fishing&interest=sleep
  String[] request.getParameterValues(paramName);
 (2)表单中的中文问题
 step1:
   对于html文件,添加<meta http-equiv="content-Type" 
                      content="text/html;charset=utf-8">
   要注意:该文件保存时所使用的编码一定也是utf-8
   作用是:要求浏览器按照指定的编码来显示该文档。
 step2:
   在servlet中,使用request.setCharacterEncoding("utf-8");
   要注意:此处的编码应该与meta中设置的一致
   作用:设置request对象的解码所采用的编码。
   默认情况下,request采用iso-8859-1编码来解码。
   此外,还要使用response.setContentType("text/html;charset=utf-8");
   作用有两个:
       一、response中写入数据时,所使用的编码
       二、生成一个消息头,要求浏览器按指定的编码来显示返回的数据。
  (3) 数据库的中文问题(mysql)
   对于某些版本的mysql jdbc驱动,需要告诉它,
   数据库当前存放数据采用的编码是什么(把URL设置如下)
   String url = "jdbc:mysql://localhost:3306/sd1005db2?" +
    "useUnicode=true&characterEncoding=utf8";

   create database name default character set utf8 指定数据库的编码 统一设定成utf8

    5)、重定向


  服务器向浏览器发送一个状态码302以及一个地址。
  浏览器收到该状态码之后,会立即向这个地址发送请求。
  特点:
   重定向的地址是任意的(既可以是当前服务器上的某个地址,也可以是其它服务器上的某个地址)
   浏览器的地址栏的地址会发生变化。
 

练习
  按照servlet02工程的要求实现
  学生信息的维护
  id name age classname
  
  create table t_student(
  id bigint primary key auto_increment
  name varchar(50),
  age int(3),
  classname varchar(50));
  
  注意,中文问题