Servlet
-
概念: 运行在服务端的小程序(服务器的连接器)
servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则 -
快速入门:
1. 创建JavaEE项目 2. 定义一个类,实现Servlet接口 3. 实现接口中的抽象方法 4. 配置Servlet,在web.xml中配置 -
执行原理:
1. 当服务器接收到客户端浏览器的请求后,会解析请求url路径,获取访问的servlet的资源路径 2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容 3. 如果有,则再找到对应<servlet-class>全类名 4. tomcat会将字节码文件加载进内存,并且创建其对象 5. 调用其方法 -
Servlet生命周期
1. 被创建: 执行init方法,只执行一次 Servlet什么时候被创建? 1. 默认情况下,第一次被访问时,Servlet被创建 2. 可以配置执行Servlet的创建时机 在<servlet>标签下配置 1. 第一次被访问时,创建 <load-on-startup>的值为负数 2. 在服务器启动时,创建 <load-on-startup>的值为0或正整数 2. 提供服务: 执行service方法,执行多次 每次访问Servlet时,service方法都会被调用一次 3. 被销毁: 执行destory方法,只执行一次 Servlet被销毁时执行。服务器关闭时,Servlet被销毁 只有服务器正常关闭时,才会执行destory方法 destory方法在Servlet被销毁之前执行,一般用于释放资源 -
Servlet3.0
好处: 支持注解配置。可以不需要web.xml 步骤: 1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml 2. 定义一个类,实现Servlet接口 3. 重写方法 4. 在类上使用@webServlet注解,进行配置 @webServlet("资源路径") -
IDEA与tomcat的相关配置
1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件 查看catalina.base路径 2. 工作空间目录和tomcat部署的web目录 tomcat真正访问的是tomcat部署的web项目,tomcat部署的web项目对应着工作空间项目的web目录下的所有资源 WEB-INF目录下的资源不能被浏览器直接访问 -
Servlet相关配置
1. urlpartten: servlet访问路径 1. 一个Servlet可以定义多个访问路径: @webServlet({"/d4", "/dd4"}) 2. 路径定义规则: 1. /xxx: 匹配路径 2. /xxx/xxx: 多层路径,目录结构 3. *.do: 扩展名匹配 -
Request 1. 请求行
// 1. 请求方法 String method = req.getMethod(); // 2. 虚拟目录 String contextPath = req.getContextPath(); // 3. servlet目录 String servletPath = req.getServletPath(); // 4. uri,url String requestURI = req.getRequestURI(); StringBuffer requestURL = req.getRequestURL(); // 5. 客户端地址 String remoteAddr = req.getRemoteAddr(); String remoteHost = req.getRemoteHost(); // 6. http协议 String protocol = req.getProtocol(); // 7. get请求参数 String queryString = req.getQueryString(); 2. 请求头 getHeader(String name): 获取请求头 3. 获取请求体数据 请求体: 只有Post请求方式才有请求体,在请求体中封装了Post请求的请求参数 步骤: 1. 获取流对象 BufferedReader getReader(): 获取字符输入流, 只能操作字符数据 ServletInputStream getInputStream(): 获取字节输入流,可以操作所有类型数据 2. 再从流中拿数据-
其他功能
1.获取请求参数通用方式
1. String getParameter(String name): 根据参数名称获取参数值 2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组 3. Enumeration<String> getParameterNames(): 获取所有请求的参数名称 4. Map<String, String[]> getParameterMap(): 获取所有参数的map集合 中文乱码问题: get方式: tomcat 8 已经将get方式乱码问题解决 post方式: 会乱码 解决: 在获取参数前,设置request的编码request.setCharacterEncoding("utf-8")-
请求转发
-
步骤:
- 通过request对象获取请求转发器对象: RequestDispatch getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发: forward(ServletRequest request, ServletResponse response)
-
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求
-
-
共享数据
域对象: 一个有作用范围的对象,可以在范围内共享数据
request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
1. void setAttribute(String name, Object obj)存储数据 2. Object getAttribute(String name): 通过键获取值 3. void removeAttribute(String name): 通过键移除键值对 -
获取servletContext
ServletContext getServletContext()
-
-
-
Response
-
响应消息: 服务端发送给客户端的数据
数据格式:
1. 响应行 1. 组成: 协议/版本 响应状态码 状态码描述 2. 响应状态码: 服务器告诉客户端浏览器本次请求和响应的一个状态 1. 状态码都是3位数字 2. 分类: 1. 1xx: 服务器收到客户端消息,但是没有接收完成,等待一段时间后,发送1xx状态码 2. 2xx: 成功,代表200 3. 3xx: 重定向,代表302(重定向), 304(访问缓存) 4. 4xx: 客户端错误,404(请求路径没有对应资源),405: 请求方式没有对应的doxxx方法 5. 5xx: 服务端错误,代表: 500(服务器内部出现异常) 2. 响应头 1. 格式: 头名称: 值 2. 常见的响应头 1. Content-type: 服务器告诉客户端本次响应体数据格式以及编码格式 2. Content-disposition: 服务器告诉客户端以什么格式打开响应体数据 值: in-line: 默认值,在当前页面内打开 attachment;filename=xxx: 以附件的形式打开响应体,文件下载 3. 响应空行 4. 响应体: 传输的数据 -
Response对象
功能: 设置响应消息
1. 设置响应行 1. 格式: HTTP/1.1 200 OK 2. 设置状态码 setStatus(int sc) 2. 设置响应头 setHeader(String name, String value) 3. 设置响应体 1. 获取输出流 字符输出流 PrintWrite getWrite() 字节输出流: ServletOutputStream getOutputStream 2. 使用输出流,将数据输出到客户端浏览器案例:
1. 重定向: 资源跳转的方式 代码实现: 1. 设置状态码302 response.setStatus(302) 2. 设置响应头location response.setHeader("location", "/**/**") 简单方式 response.sendRedirect("/**/**") 重定向的特点: redirect 1. 地址栏发生变化 2. 重定向可以访问其他站点(服务器资源) 3. 重定向是俩次请求。不能使用request来共享数据 转发的特点: forward 1. 转发地址栏路径不变 2. 转发只能访问当前服务器下的资源 3. 转发是一次请求,可以使用request对象来共享数据-
路径写法
-
相对路径: 通过相对路径不可以确定唯一资源
找到当前资源和目标资源之间的相对位置关系 * ./: 当前目录 * ../: 后退一级目录 -
绝对路径: 通过绝对路径可以确定唯一资源
判断定义的路径是给谁用的,判断请求将来从哪发出 1. 给客户端浏览器使用: 需要加虚拟目录(项目的访问路径) 2. 给服务器使用: 不需要加虚拟目录 转发路径
-
-
服务器输出字符数据到浏览器
步骤:
1. 获取字符输出流 2. 输出数据 注意: 乱码问题: 1. PrintWrite pw = response.getWrite();获取流的默认编码为ISO-8859-1 2. 设置该流的默认编码 3. 告诉浏览器响应体使用的编码 // 简单形式,设置编码,在获取流之前 response.setContentType("text/html;charset=utf-8")
-
-
-
ServletContext对象
1. 概念: 代表整个Web应用,可以和程序的容器(服务器)来通信 2. 获取: 1. 通过request对象获取 request.getServletContext() 2. 通过HttpServlet获取 getServletContext() 3. 功能 1. 获取MIME功能 MIME类型: 在互联网通信过程中定义的一种文件数据类型 获取: String getMimeType(String file) 2. 域对象: 共享数据 1. setAttribute(String name, Object value) 2. getAttribute(String name) 3. removeAttribute(String name) servletContext对象范围: 所有用户所有请求的数据 3. 获取文件的真实(服务器)路径 1. 方法: String getRealPath(String path) // web目录下资源访问 String b = context.getRealPath("/b.txt"); // WEB-INF目录下的资源访问 String c = context.getRealPath("/WEB-INF/c.txt") // src目录下的资源访问 context.getRealPath("/WEB-INF/Classes/a.txt")