Servlet入门 1
Web基础知识
- 软件架构
- C/S:客户端/服务器端
- B/S:浏览器/服务器端
- 资源分类
- 静态资源:
- 所有用户访问后,得到的结果都是一样的;
- 静态资源可以直接被浏览器解析;如html,css,javaScript
- 动态资源
- 每个用户访问相同资源后,得到的结果不一样。
- 动态资源被访问后,需要先转换为静态资源,再返回给浏览器;如:servlet/jsp,php,asp
- 网络通信三要素
- IP: 电子设备(计算机)在网络中的唯一标识
- 端口:应用程序在计算机中的唯一标识。0-65536
- 传输协议:规定了数据传输的规则
- 基础协议:
- tcp:安全协议,三次握手,速度稍慢
- udp:不安全协议,速度快
- Web服务器软件:
- 服务器:安装了服务器软件的计算机
- 服务器软件:接受用户的请求,处理请求,做出响应
- Web服务器软件:接受用户的请求,处理请求,做出响应
- 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
- Web容器
- 常见的java相关的web服务器软件:
- WebLogic:oracle公司,大型的javaEE服务器,支持所有的javaEE规范,收费
- WebSphere:IBM公司,大型的javaEE服务器,支持所有的javaEE规范,收费
- JBOSS:JBOSS公司,大型的javaEE服务器,支持所有的javaEE规范,收费
- Tomcat:Apache基金组织,中小型的javaEE服务器,仅支持少量javaEE规范servlet/jsp。开源免费
- javaEE:java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范
Servlet
- 概念
- 运行在服务器端的小程序
- Servlet是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则
- 定义一个类,实现Servlet接口,复写方法
- 执行原理
- 服务器接收到客户端请求后,会解析请求url路径,获取访问的servlet的资源路径
- 查找web.xml中对应关系,找出对应的全类名
- Tomcat会将字节码文件加载到内存,并创建其对象
- 调用其方法
- 体系结构
- Servlet接口-----接口
-
GenericServlet-----抽象类
- HttpSevlet-----抽象类
-
GenericServlet:将Servlet接口中其他方法做了默认空实现,只将service()方法作为抽象;将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
-
HttpSevlet:对http协议的一种封装,简化操作
-
- 应用步骤
- 定义类继承HttpServlet
- 复写doGet/doPost方法
HTTP协议1
- 概念
- Hyper Text Transfer Protocal超文本传输协议
- 传输协议:定义了客户端和服务器端通信时,发送数据的格式
- 特点:
- 基于TCP/IP的高级协议
- 默认端口号:80
- 基于请求/响应模型:一次请求对应一次响应
- 无状态的:每次请求之间相互对立,不能交互数据
- 历史版本
- 1.0:每一次请求响应都会建立新的连接
- 2.0:复用连接
- 请求消息数据格式
- 请求行
- 格式:请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
- 请求方式: http协议中有7种请求方式,常用的有2种
- GET:
a) 请求参数在请求行中,在url后
b) 请求的url长度有限
c) 不太安全 - POST:
- 请求参数在请求体中
- 请求url长度无限制
- 相对安全
- GET:
- 请求头:客户端浏览器告诉服务器一些信息
- 格式:请求头名称:请求头值(键值对)
- 常见请求头:
- User-agent: 客户端浏览器告诉服务器,我访问你使用的浏览器版本信息
- Referer:告诉服务器,我从哪里来?
- 作用:防盗链、统计工作
- 常见请求头:
- 格式:请求头名称:请求头值(键值对)
- 请求空行(分隔作用)
- 请求体(正文)GET时为空;Post时为请求参数
Request对象
- 基本原理
- Request和response对象是由服务器创建,我们来使用它
- Request对象是来获取请求消息,response对象是来响应消息
- Request继承体系
- ServletRequest------接口
- 继承HttpServletRequest-------接口
- 实现org.apache.catalina.connector.RequestFacede类(tomcat)
- 继承HttpServletRequest-------接口
- ServletRequest------接口
- 获取请求数据
- 获取请求行数据
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请求中有请求体,封装了请求参数
- 步骤:
- 获取流对象
- BufferedReader getReader()字符流输入
- ServletInputStream getInputStream()字节流输入,可操作所有类型数据
- 再从流对象中拿数据
- 获取流对象
- 其他功能
- 获取请求参数的通用方式
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”)
- 在获取参数前,设置request编码
- 请求转发 (实例demo/ServletDemo3)
- 步骤:
- 通过request对象获取请求转发器对象
requestDispatcher getRequestDispatcher(string Path)
- 使用RequestDispatcher对象来进行转发
Forward(servletRequest request,ServletResponse response)
- 通过request对象获取请求转发器对象
- 特点:
i. 浏览器地址不变
ii. 只能转发到当前服务器内部资源中
iii.转发是一次请求
- 共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- Request域:代表一次请求额范围,一般用于请求转发的多个资源中共享数据
- 方法:
request.setAttribute("msg","hello");存储数据
Object msg = request.getAttribute("msg");通过键获取值
RemoveAttribute(string name) 通过键移除键值对
-
获取ServletContext 详见第6章第3节
ServletContext servletContext = getServletContext();
登录案例
步骤: -
创建java EE web application项目
-
复制资源
a) Login界面代码
b) 把druid.properties放在test—resources文件夹中才能识别;修改登录数据库的账户密码
c) 复制jar包到main—webapp—WEB-INF下的lib文件夹中;并选中lib文件夹,右键add as library; level选择module library即可 -
创建数据库table--day14—user表;插入一行用户名和密码备用
-
在main--java文件夹中最后层目录创建domain包,创建user类,对应数据库table的列;同时生成geter/seter/toString等方法备用
-
在main--java文件夹中最后层目录创建dao包,创建userDao类,用于操作数据库user表;
a) 提供login方法:接受loginUser参数(只有用户名密码);返回查询后的user对象(包含用户全部数据)
b) 在userDao类中声明JDBCTemplate对象共用 -
在main--java文件夹中最后层目录创建util包,创建JDBCUtils类;JDBC工具类,使用
druid连接池
- 声明静态变量DataSource,并赋初值
- 获取连接池对象
- 获取connection对象
- 编写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对象中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)