首页 > 技术文章 > Servlet入门 1

bluecola 2022-02-11 20:42 原文

Web基础知识

  1. 软件架构
    • C/S:客户端/服务器端
    • B/S:浏览器/服务器端
  2. 资源分类
  • 静态资源:
    • 所有用户访问后,得到的结果都是一样的;
    • 静态资源可以直接被浏览器解析;如html,css,javaScript
  • 动态资源
    • 每个用户访问相同资源后,得到的结果不一样。
    • 动态资源被访问后,需要先转换为静态资源,再返回给浏览器;如:servlet/jsp,php,asp
  1. 网络通信三要素
    • IP: 电子设备(计算机)在网络中的唯一标识
    • 端口:应用程序在计算机中的唯一标识。0-65536
    • 传输协议:规定了数据传输的规则
  2. 基础协议:
    • tcp:安全协议,三次握手,速度稍慢
    • udp:不安全协议,速度快
  3. Web服务器软件:
    • 服务器:安装了服务器软件的计算机
    • 服务器软件:接受用户的请求,处理请求,做出响应
    • Web服务器软件:接受用户的请求,处理请求,做出响应
      • 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
      • Web容器
    • 常见的java相关的web服务器软件:
      • WebLogic:oracle公司,大型的javaEE服务器,支持所有的javaEE规范,收费
      • WebSphere:IBM公司,大型的javaEE服务器,支持所有的javaEE规范,收费
      • JBOSS:JBOSS公司,大型的javaEE服务器,支持所有的javaEE规范,收费
  4. Tomcat:Apache基金组织,中小型的javaEE服务器,仅支持少量javaEE规范servlet/jsp。开源免费
  5. javaEE:java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范

Servlet

  1. 概念
    • 运行在服务器端的小程序
    • Servlet是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则
    • 定义一个类,实现Servlet接口,复写方法
  2. 执行原理
    1. 服务器接收到客户端请求后,会解析请求url路径,获取访问的servlet的资源路径
    2. 查找web.xml中对应关系,找出对应的全类名
    3. Tomcat会将字节码文件加载到内存,并创建其对象
    4. 调用其方法
  3. 体系结构
  • Servlet接口-----接口
    • GenericServlet-----抽象类

      • HttpSevlet-----抽象类
    • GenericServlet:将Servlet接口中其他方法做了默认空实现,只将service()方法作为抽象;将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

    • HttpSevlet:对http协议的一种封装,简化操作

  1. 应用步骤
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

HTTP协议1

  1. 概念
  • Hyper Text Transfer Protocal超文本传输协议
    • 传输协议:定义了客户端和服务器端通信时,发送数据的格式
    • 特点:
      1. 基于TCP/IP的高级协议
      2. 默认端口号:80
      3. 基于请求/响应模型:一次请求对应一次响应
      4. 无状态的:每次请求之间相互对立,不能交互数据
  1. 历史版本
    • 1.0:每一次请求响应都会建立新的连接
    • 2.0:复用连接
  2. 请求消息数据格式
  • 请求行
    • 格式:请求方式 请求url 请求协议/版本
             GET    /login.html   HTTP/1.1
  • 请求方式: http协议中有7种请求方式,常用的有2种
    1. GET:
      a) 请求参数在请求行中,在url后
      b) 请求的url长度有限
      c) 不太安全
    2. POST:
      • 请求参数在请求体中
      • 请求url长度无限制
      • 相对安全
  • 请求头:客户端浏览器告诉服务器一些信息
    • 格式:请求头名称:请求头值(键值对)
      • 常见请求头:
        1. User-agent: 客户端浏览器告诉服务器,我访问你使用的浏览器版本信息
        2. Referer:告诉服务器,我从哪里来?
          • 作用:防盗链、统计工作
  • 请求空行(分隔作用)
  • 请求体(正文)GET时为空;Post时为请求参数

Request对象

  1. 基本原理
  • Request和response对象是由服务器创建,我们来使用它
  • Request对象是来获取请求消息,response对象是来响应消息
  • Request继承体系
    • ServletRequest------接口
      • 继承HttpServletRequest-------接口
        • 实现org.apache.catalina.connector.RequestFacede类(tomcat)
  1. 获取请求数据
  • 获取请求行数据
        1.获取请求方式,get
            String getMethod()
        *2.获取虚拟目录 /day14  **
            String getContextPath()
        3.获取servlet路径 /demo1
            String getServletPath()
        4.获取get方式请求参数 name=zhangsan
            String getQueryString()
        *5.获取请求URI /day14/Demo1  **
            String getRequestURI()
            String getRequestURL  http://localhost/day14/demo1
        6.获取协议及版本 HTTP/1.1
            String getProtocal()
        7.获取客户机IP地址
            String getRemoteAddr()

URL:统一资源定位符 http://localhost/day14/demo1 中华人民共和国
URI:统一资源标识符 /day14/demo1 共和国

  • 获取请求头数据
	//通过请求头的名称获取请求头的值
```	String getHeader(string name);```
	//获取所有请求头名称
```    Enumeration<String> headerNames = request.getHeaderNames();```
  • 获取请求体数据
    • 只有POST请求中有请求体,封装了请求参数
    • 步骤:
      1. 获取流对象
        • BufferedReader getReader()字符流输入
        • ServletInputStream getInputStream()字节流输入,可操作所有类型数据
      2. 再从流对象中拿数据
  1. 其他功能
  • 获取请求参数的通用方式
	1.根据参数名称获取参数值;doGet和doPost都可以使用
		String username = request.getParameter("username");
	2.根据参数名称获取参数值得数组
		String[] hobbies = request.getParameterValues("hobby");
	3.获取所有参数的请求名称
		Enumeration<String> parametersNames = request.getParameterNames();
	4.获取所有参数的map集合
		Map<String,String[]> parameterMap = request.getParameterMap();
  • 中文乱码问题:
    • 在获取参数前,设置request编码
      Request.serCharacterEncoding(“utf-8”)
  1. 请求转发 (实例demo/ServletDemo3)
  • 步骤:
    • 通过request对象获取请求转发器对象
      requestDispatcher getRequestDispatcher(string Path)
    • 使用RequestDispatcher对象来进行转发
      Forward(servletRequest request,ServletResponse response)
  • 特点:
    i. 浏览器地址不变
    ii. 只能转发到当前服务器内部资源中
    iii.转发是一次请求
  1. 共享数据
  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • Request域:代表一次请求额范围,一般用于请求转发的多个资源中共享数据
  • 方法:
	request.setAttribute("msg","hello");存储数据
	Object msg = request.getAttribute("msg");通过键获取值
	RemoveAttribute(string name) 通过键移除键值对
  1. 获取ServletContext 详见第6章第3节
    ServletContext servletContext = getServletContext();
    登录案例
    步骤:

  2. 创建java EE web application项目

  3. 复制资源
    a) Login界面代码
    b) 把druid.properties放在test—resources文件夹中才能识别;修改登录数据库的账户密码
    c) 复制jar包到main—webapp—WEB-INF下的lib文件夹中;并选中lib文件夹,右键add as library; level选择module library即可

  4. 创建数据库table--day14—user表;插入一行用户名和密码备用

  5. 在main--java文件夹中最后层目录创建domain包,创建user类,对应数据库table的列;同时生成geter/seter/toString等方法备用

  6. 在main--java文件夹中最后层目录创建dao包,创建userDao类,用于操作数据库user表;
    a) 提供login方法:接受loginUser参数(只有用户名密码);返回查询后的user对象(包含用户全部数据)
    b) 在userDao类中声明JDBCTemplate对象共用

  7. 在main--java文件夹中最后层目录创建util包,创建JDBCUtils类;JDBC工具类,使用
    druid连接池

  1. 声明静态变量DataSource,并赋初值
  2. 获取连接池对象
  3. 获取connection对象
  1. 编写servletLogin类,写具体登录的逻辑
    a) 设置编码
    request.setCharacterEndoding(“utf-8”)
    b) 获取请求参数
    c) 封装user对象
    d) 调用userDao的login方法
    e) 判断查询结果user是否为null;空则转发请求失败页面;成功则转发至成功页面,并保持数据
    f) 上述b和c步骤,可以使用Beanutils工具类代替,简化获取数据和封装;

JavaBean :标准的java类,

1.遵循以下规则:
1) 类必须被public修饰
2) 必须提供空参的构造器
3) 成员变量必须使用private修饰
4) 提供公共的setter和getter方法
2.功能:封装数据

  • 概念:
    • 成员变量:
    • 属性:setter和getter截取后的产物 即getUsername()方法中的username;
      属性和获取的成员变量名称可以不一样,大多数情况一样
  • 方法:
    setProperty() :注意中间string参数操作的是属性名称,不是成员变量名称
    getProperty()
    populate(object obj, Map map):将map集合中的键值对信息,封装到对应的JavaBean对象中

推荐阅读