JavaWeb核⼼之Servlet
1.Http请求 request
请求行: GET /day02_war_exploded/index.html HTTP/1.1
GET: 请求方式[method] GET POST PUT DELETE
< form action enctype method >
POST: 只有在Form表单method=post时候
特点: 参数隐藏, 请求体中
参数大小没有限制, 可以是文件
GET: 直接访问, 超链接, method=get等
特点: 参数是添加在url后面 ? 连接
参数大小有限制
/day02_war_exploded/index.html: 资源地址URI
HTTP/1.1: 协议和版本
请求头: map, 客户端的基本信息
请求体: post请求方式提交的参数
Http响应 response
响应行: HTTP/1.1 200
HTTP/1.1: 协议和版本
200: 状态码 正常 [status]
304: 访问缓存
404: 资源未找到
500: 服务器端代码(java代码)异常
302: 重定向
响应头: map, 服务器端封装的数据
响应体: 服务器响应内容
一个页面[html代码]
一个文件
一些数据…
2.动态页面 Servlet规范 Server + Applet
1.自定义类, 实现Servlet接口
2.着重实现3个方法
3.注册Servlet 应用的web.xml
< servlet >
< servlet-name >自定义名字
< servlet-class >全限定类名
< /servlet >
< servlet-mapping >
< servlet-name >上面的名字[自定义名字]
< url-pattern >/地址[自定义地址]
< /servlet-mapping >
4.访问: http://localhost:8080/day02_war_exploded/hello
3.servlet的生命周期
init: 对象创建后调用, 默认第一次访问资源时创建
通过< load-on-startup >整数< /load-on-startup >
让对象在服务器启动时创建
service: 每一次访问资源时调用
destroy: 对象销毁之前调用, 服务器关闭[或者卸载应用]时销毁
4.url-pattern的书写
<!-- 1.精确匹配: 只能通过 /hello 访问 -->
<!-- 一个servlet资源可以对应多个url链接地址 -->
<url-pattern>/hello</url-pattern>
<!-- 2.使用通配符匹配(目录匹配) 可以通过 /hello/任意地址 来访问 -->
<url-pattern>/hello/*</url-pattern>
<!-- 3.后缀匹配 可以通过 任意名字.user 来访问 -->
<url-pattern>*.user</url-pattern>
缺省的匹配 / tomcat本身自动配好的 [conf/web.xml]
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
当访问后缀为 .html .htm .jpg .css .js .png ...的静态资源
就使用默认的Servlet来搜索静态资源,
当找不到的时候, 就会搜索应用中的web.xml文件资源
两个web.xml文件都搜索不到, 就响应404
结论: web应用中访问的所有资源, 都是访问Servlet
5.路径
URL: http://localhost:8080/… 绝对路径
URI: 以 / 开始的就是绝对路径
URI -> URL 协议://ip:port/URI
/应用名/xx资源
6.注解取代xml文件
注解:@xx @interface
注解属性: 类型 属性名()[default]
- 属性没有默认值时,必须传参
- 只有当传入的属性只有一个,并且属性名是value的时候,属性名可以省略
- 属性类型是数组时,又只有一个值,可以不用{}
注解是不可以加载任意位置的,注解是可以解析的 --> 反射
注解作用:可以取代xml文件
javaEE从3.0开始支持注解
7.ServletConfig - init方法中的参数
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
8.ServletContext
获得Servlet对象
- config.getServletContext()
- request.getServletContext()
- this.getServletContext()
this - > HttpServlet
整个应用中, 只有一个ServletContext对象
所有servlet, 所有客户端 可以共享的
生命周期: 服务器启动时创建, 服务器关闭销毁 Listener
作用:
- 获得应用名
- 获得应用的初始值参数
<!-- 设置应用的初始化参数 -->
<context-param>
<param-name>configPath</param-name>
<param-value>classpath:config.properties</param-value>
</context-param>
- 获得资源中的绝对路径
src/a.txt
web/b.txt
web/WEB-INF/c.txt
day02工程/d.txt
- 存数据, 例如访问量, 阅读量
域对象: 存储数据的, 有范围的对象, map
ServletContext域的范围: 应用[服务器]运行期间
API: setAttribute(name, value)
value getAttribute(name)
removeAttribute(name)
name-String value-Object
查看上一次访问时间
9.HttpServlet
重写: doGet doPost
class HttpServlet extends GenericServlet
实现了service方法
service(HttpServletRequest, HttpServletResponse);
判断请求方式, 如果是get请求, 调用doGet方法
如果是post请求, 调用doPost方法
class GenericServlet implements Servlet
这里是引用
发送了10次请求, 访问了几次doGet(10), doPost(10), service(10), init(1), destroy(0)
创建了几个 servlet(1) 对象, 几个 request()10 对象, 几个 response(10)对象