Servlet: server applet
- Servlet就是一个接口,定义在Java类被浏览器访问到的规则
- 将来我们自定义一个类,实现Servlet接口,复写方法
配置Servlet
在web.xml中配置
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.zhiqin.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的标签体内容。
- 若果有,则找到对应的全类名
- tomcat会将字节码文件加载进内存,并创建对象
- 调用其 方法
Servlet中的方法
-
被创建 init()初始化方法 在Servlet被创建时执行,只会执行一次
-
提供服务 service()提供服务方法 每一次Servlet被访问时执行,执行多次
-
被销毁 destroy() 销毁方法 在服务器正常关闭时执行,只执行一次
Servlet是什么时候被创建:
-
默认情况下,第一次被调用时创建
-
可以在web.xml中手动配置Servlet被创建的时机
Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
这就会导致,对个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量,要定义局部变量,即使定义了成员变量,也不要进行修改值操作。
Servlet 3.0
- 好处 :支持注解配置,可以不需要web.xml了
- 步骤:
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类
- 复写方法
- 在类上使用注解进行配置
@WebServlet(“资源路径”)
Idea会为每一个tomcat部署的项目单独建立一份配置文件
*查看控制台的log:Using CATALINA_BASE: “C:\Users\Administrator.IntelliJIdea2019.3\system\tomcat\Unnamed_myHTML”
Servlet 的体系结构
Servlet是接口,下面有两个实现类GenericServlet抽象类和HttpServlet类
Servlet相关配置
urlpartten: Servlet访问路径
- 一个Servlet可以定义多个访问路径:@WebServlet({"/d4","/dd4","/ddd4"})
- 路径定义规则:
1./xxx
2./xx/xx
3 *.xx
request和response
- request和response对象由服务器创建,来给我们使用
- request获取请求消息,resopnse来设置响应消息
requset功能
获取请求行消息:
GET /day14/demo1?name=zhangsan HTTP/1.1
-
获取请求行消息:GET
String getMethod() -
获取虚拟目录:/day14
String getContextPath() -
获取Servlet路径:
String getServletPath() -
获取get方式请求参数;name=zhangsan
String getQUeryString() -
获取请求URI:/day14/demo1
String getRequestURI()
StringBuffer getRequestURL() -
获取协议和版本 HTTP/1.1
String getProtocol() -
获取客户机的IP地址:
String getRemoteAddr()
获取请求头消息
- String getHeader(String name)
- Enumeration getHeaderNames()
获取请求体信息
只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
-
获取流对象
BufferedReader getReader():获取字符输入流,自能操作字符数据
ServletInputStream getInputStream()获取字节输入流,可以操作所有类型数据 -
再从流中拿数据
获取参数的通用方法
- String getParameter(String name) 根据参数名称获取参数值
- String[] getParamterValues(String name) 根据参数名称获取参数的数组
- Emumeration getParamterNames() 获取所有请求参数名称
- Map<String,String[]> getParamterMap() 获取所有参数map集合
请求中中文乱码问题:
解决: request.setCharacterEncoding(“utf-8”);
请求转发
request.getRequestDispatcher("requestDemo9").forward(request,response);
特点:
- 浏览器地址栏路径不发生变化
- 只能转发当前服务器内部资源
- 转发是一次请求
共享数据
域对象:一个有作用域的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttribute(String name) 通过键获取数据
- void removeAttribute(String name) 通过键移除数据
BeanUtils工具类
用于封装JavaBean
JavaBean:标准的Java类,用于封装数据
标准Java类的要求:
1.类必须被public修饰
2.必须提供空参的构造器
3.成员变量必须用private修饰
4. 提供公共的setter和getter方法
提供的方法:
setProperty()
getProperty()
populate(Object obj,Map map) 将map集合的键值对信息封装到对应的JavaBean对象中
状态码
- 1xx 服务器接收客户端消息但没有接收完成,等待一段时间后,发送1xx状态吗
- 2xx 成功
- 3xx 302:重定向 304:访问缓存
- 4xx 客户端错误 404:请求路径没有对应的资源或权限不够 405:请求方式没有对应 doXxx方法
- 5xx:服务器端错误
重定向
response.sendRedirect("/responseDemo2");
特点
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求,不能使用request对象来共享数据
动态获取虚拟目录
在Servlet中
绝对路径:
response响应数据在浏览器上出现乱码:
解决:
ServletContext对象