javaweb jsp/servlet(jsp本质上也是servlet)
web表示网页的意思 网络上供外界访问的资源 分两种 一种是静态资源 比如html数据是不变的 另一种动态资源 jsp
不容的时间点 不同的操作 看到的数据是不一样的
C/S Client Server
B/S Broswer Server
web 通信的流程 访问网站的流程
1.打开浏览器 输入url地址 回车(将请求的数据转为http请求--转字节流 二进制数据)
2.查找Hosts 文件 解析 url 查看一下 有没有对应的ip地址 互联网上任何一台电脑都对应一个唯一的ip地址,根据这个ip地址 找到这台电脑,如果 没有在 hosts文件中 找到对应的ip,请求会发送给互联网上的DNS服务器(域名解析服务器)
3.将http请求 发送给指定的ip对应的服务器
4.服务器查找浏览器所请求的资源 将查到的结果以http响应的形式发送给浏览器
5.浏览器解析发送回来的数据
===============================================
对于服务器的理解?
可以理解为是一个服务器程序 比如 tomcat 也可以理解为运行服务器程序的计算机
手写一个简陋的服务器 Server.java 通过浏览器 访问他url格式
Tomcat 服务器的安装与使用
web项目的文档结构
http请求与响应介绍
http请求:客户端脸上服务器 请求某个web资源 称之为 客户端向服务器发送了一个http请求
一个完整的http请求包含了哪些东西?
一个请求行 描述客户端的请求方式 (有7种 五种已经弃用 只剩下 get和post 一般请求方式都是get表单提交用post),请求资源的名称以及http协议版本号
若干请求头
Accept:用于告诉服务器客户机支持的数据类型
Accept-Charset:告诉服务器 客户机采用的编码
Accept-Encoding:客户机支持的数据压缩格式
Accept-Language:客户端的语言环境
Host:告诉服务器 想访问的主机名
Referer:告诉服务器他是从哪个资源来访问服务器的
User-Agent:告诉服务器 客户端的软件环境
~~~~~~~~~
http响应:服务器向客户端回送数据 包括一个状态行(响应行)若干消息头 以及实体内容
状态行:http版本号 状态码 200 OK 404 找不到资源 原因描述 :http/1.1 200 OK
响应头:
Location:配合 状态码302使用 告诉浏览器 继续去找谁 其实就是 重定向
Conten-Encoding:告诉浏览器 数据的压缩格式
Refresh:告诉浏览器 多久刷新一次
~~~~~~~~~
状态码:表示服务器对请求的处理结果 它是三位的十进制数 分为5类
手写Servlet
1.在classes 文件夹下 创建 FirstServlet.java
编译:把这个servlet-api.jar 加载到classpath -d吧包编译出来 . 在当前目录
2.配置web.xml
<sevlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</sevlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
3.客户端请求
=====================================
Servlet 接口
sun提供的 运行在服务器端应用程序 接受客户端请求 并返回响应的有两个子类GenericServlet HttpServlet
Servlet 接口的三个主要方法
init(ServletConfig servletConfig) 完成servlet的初始化 创建这个servlet实例的时候调用
第一次访问这个servlet的时候 创建这个实例 调用 init()后面在访问 就不再调用了 说明 这个Servlet 只创建一次 内存里只有一个实例 所以可能出现多线程问题
service(ServletRequest servletRequest,ServletResponse servletResponse) 是Servlet给客户端提供服务的方法,每请求一次都会调用这个方法 两个参数 request response 分别代表 客户端的请求和响应,是服务器创建的,每一次请求都会创建新的request 和 response 对象(后面有 转发 和重定向 转发是一次请求 所以 只有一堆request 和 response 重定向 是两次请求 就会有 两对 request 和 response)
void destroy(); servlet 销毁的时候调用 停止服务的时候 会调用这个方法
面试题:请简述servlet的生命周期?
当客户端发送请求到服务器,请求哪个servlet,服务器就会在第一次请求这个Servlet的时候 创建这个Servlet的实例 并调用init()方法 完成这个Servlet的初始化,然后由Servlet容器 创建 代表请求和响应的request 和 response对象,传给service方法,来给客户端提供服务,每一次请求都会调用一次service方法 都会给service方法 传递新的request 和response,当servlet容器销毁的时候会调用servlet的destroy 方法 销毁 servlet 的实例 这就是servlet的生命周期
一些细节:
1.客户端通过url来访问web服务器对的资源 所以 servlet 想要被访问到 必须把servlet 映射到一个url上,这个工作在web.xml中完成,通过<servlet>和<servlet-mapping>,<servlet>包含两个主要的子元素<servlet-name>和<servlet-class>分别设置 注册名称和servlet的完整类名,<servlet-mapping>用于映射一个已经注册的servlet的一个对外的访问路径 包含两个子元素 <servlet-name>和<url-pattern>分别指定servlet的注册名称 和 servlet 的对外访问路径
2.一个servlet可以映射到多个url上即多个<servlet-mapping>元素的<servlet-name>值可以是同一个servlet的注册名称 <url-pattern>可以不一样 但是只有两种固定的格式
第一种 *.扩展名
第二种 正斜杠 (/) 开头并以 /* 结尾
3.servlet 默认实在第一次访问的时候创建servlet的实例,但是有时希望在服务器启动的时候就创建servlet实例 就调用 init() 可以配置 <load-on-startup>3</load-on-startup> 让服务器启动 就创建servlet
~~~~~~~~
ServletConfig:Servlet的配置信息 可以通过这个对象得到一些初始化的配置在 Servlet 的配置文件中 可以使用一个或多个servlet元素内
<init-param> <!-- 给这个servlet配置初始化参数 -->
<param-name>password</param-name>
<param-value>tiger</param-value>
</init-param>
在servlet得到 ServletConfig 对象
ServletConfig servletConfig = this.getServletConfig();
======================================
ServletContext:在web容器启动的时候 它会为每一个web应用程序创建一个 对应的ServletContext 它代表当前
web应用
在ServletConfig对象中 维护了ServletContext 对象的引用 所以 可以通过得到 servletConfig 对象 来得到ServletContext对象
ServletContext sc = teis.getServletContext();
重点:
1.作为域对象使用 由于一个web应用中 所有的Servlet 共享一个 ServletContext 对象 所以 Servlet 可以通过ServletContext对象实现数据共享 也就是 作为 域对象 来使用
2.获取web应用的初始化参数
<context-param>
<description>mysql数据库的有用户名</description>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
3.转发 sc.getRequestDispatcher("/day2/message.jsp").forward(request, response); // 转发
4.读取配置文件
======================================
Response 代表 响应 服务器向客户端发送数据 找这个对象