一. Servlet
1.1 概述
Servlet是运行在Java服务器的小程序。
它提供了一套使Java类可以被浏览器(tomcat)所识别的规则(接口)。
1.2 使用步骤
1、创建类实现Servlet接口
2、实现抽象方法
3、在web.xml配置映射文件
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.qf.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
1.3 执行步骤
1、前端页面点击提交按钮,将表单信息提交到指定的action
2、action中的地址会在web.xml中查找是否有与之匹配的中的
3、如果有则查找是否有对应的中的与的一致
4、如果有则执行该下的
5、将此servlet类进行了编译,编译的文件在\WEB-INF\classes\xxx
6、当这个servlet第一次被访问时,执行init方法,并执行service方法
1.4 servlet的生命周期
1、init:第一次访问servlet时进行初始化工作
2、service:每次访问servlet时执行,进行获取请求,作出响应
3、destroy:服务器正常关闭时执行,进行资源的释放
1.5 HttpServlet
HttpServlet继承GenericServlet实现Servlet
二. Request
2.1 获取请求参数
1、getParameter(name):通过name值获取唯一的value值
2、getParameterValues(name):通过name值获取value字符串数组
3、getParameterMap():获取所有提交参数的键值对组成的map集合
问题:
中文乱码问题
页面提交的编码格式的utf-8,而tomcat默认的编码是iso8859-1,
iso8859-1不支持中文,所以产生乱码。
解决:
request.setCharacterEncoding(“utf-8”);
2.2 请求转发
步骤:
1、获取请求转发器,并明确跳转的目标地址
request.getRequestDispatcher(path);
2、执行转发器的转发功能
dispatcher.forward(req,resp);
细节:
1、请求转发只能访问服务器内部资源
2、地址栏不发生变化
3、请求转发只执行了一次请求
2.3 共享数据
域对象:可以在指定生命周期内共享数据的对象
Request域:作用范围仅在一次请求中
如果使用的是请求转发,那么转发后的页面可以获取域中的数据;
如果使用的是重定向,那么重定向后的页面无法获取域中的数据,因为重定向执行了两次请求,而请求转发是在一次请求内的。
通用方法:
1、setAttribute(String,Object):向域中存储键值对
2、getAttribute(String):通过键获取值
3、removeAttribute(String):根据键删除键值对
三. Response
3.1 响应行
- 版本/协议:HTTP/1.1
- 响应状态码:描述响应的信息,3位数,设置状态码用response.setStatus(状态码)
- 1xx:表示服务器接收到了客户端的数据,但是没有接收完毕
- 2xx:成功
- 200 ok
- 3xx:重定向
- 302:重定向
- 304:访问缓存
- 4xx:
- 404 not found:访问资源不存在
- 405 Method Not Allowed:指定的访问方式没有对应的doXxx方法
- 5xx:服务器内部错误
- 500 Internal Server Error:服务器内部发生异常
- 状态码描述
3.2 响应头
格式:
键:值
常见的响应头:setHeader(键,值)
1、location:表示重定向的位置
重定向:
- 设置响应行的状态码为302
- response.setStatus(302)
- 设置重定向的位置
- response.setHeader(“location”,“地址”)
简单的写法:
response.sendRedirect("/day24_3response/r2");
2、content-type:告知浏览器本次响应以何种编码响应
设置响应的编码格式:
response.setHeader(“content-type”,“text/html;charset=utf-8”);
简单的写法:
response.setContentType(“text/html;charset=utf-8”);
3.3 响应体
响应的数据
1、使用字符输出流
response.getWrite().write();
2、使用字节输出流
response.getOutputStream().write();
四. 请求转发和重定向
4.1 请求转发
RequestDispatcher dispatcher = request.getRequestDispatcher("地址");
dispatcher.forward(request,respon);
4.2 重定向
response.sendRedirect("地址");
4.3 区别:
请求转发地址栏不变,重定向改变
请求转发只请求了一次,重定向请求了两次
请求转发后的页面可以获取请求域中的数据,重定向不能
重定向可以访问外部资源,请求转发不能
请求的性能优于重定向
五. ServletContext
概述:它是整个web工程的对象,是web中最大的接口,每个web应用有且只有一个ServletContext对象,它在项目部署到服务器时创建,服务器关闭才被释放
ServletContext的获取:
1、request.getSerlvetContext();
2、this.getServletContext();
5.1 获取全局的初始化参数
在web.xml中配置
<context-param>
<param-name>name</param-name>
<param-value>zs</param-value>
</context-param>
通过getInitParameter(name)获取对应的值
5.2 它是一个域对象
1、setAttribute(String,Object):向域中存储键值对
2、getAttribute(String):通过键获取值
3、removeAttribute(String):根据键删除键值对
只有在服务器关闭或者remove了才会释放ServletContext域对象中的数据
5.3 获取项目中任何资源的绝对路径
方法:getRealPath(路径)
1、WebCotent下的资源
context.getRealPath("/img/a.txt");
context.getRealPath("/WEB-INF/b.txt");
2、src下的资源
注意:src下的资源是java源码,java源码会被编程在WEB-INF下的classes中
context.getRealPath("/WEB-INF/classes/c.txt");