Servlet:
JSP:Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。 JSP是一种Java servlet
servlet:Server Applet的简写 运行在服务器的小程序 用于解析动态代码实现网页动态效果类似ASP实现对服务器库中表数据的CRUD操作
JSP更擅长表现于页面显示,servlet更擅长于逻辑控制;jsp经编译后就变成了Servlet;
生命周期:服务器加载Sevrlet、请求时创建Sevrlet、init()初始化、service()处理用户请求(可多次调用)、destory()销毁
原理:服务器解析请求资源 寻找jsp页面,找到后将其编译为.java并生成.class字节码文件(也就是Servlet 他才能被访问到而java不能)
JSP做表现层 尽量不在其中写java代码 写的话可以用EL表达式 配合 JSTL标签 替换java语句
EL表达式 Expression Language 表达式语言 简化JSP页面java代码的书写 ${表达式}
${域名.键名}:从指定域中获得指定键值 ${requestScope.name}
键
名
:
从
最
小
域
向
大
查
找
是
否
有
该
键
对
应
值
对
象
:
{键名}:从最小域向大查找是否有该键对应值 对象:
键名:从最小域向大查找是否有该键对应值对象:{键名.键名.属性名}:调用对象getter方法获得对象属性值
Map集合:${键名.键名.key名}
JSTL JavaServerPages Tag Library JSP标准标签库*
需要导入JSTL的jar包、引入标签库<%@ taglib prefix=“c” uri="" >、使用标签
<c:if test=“EL表达式” ></c:if>…
<c:choose><c:when test=“EL表达式”>展示数据</c:when>…<c:otherwise>展示数据</c:otherwise> 相当于switch
<c:forEach begin=“开始值” end=“结束值” var=“临时变量” step=“步长” varStatus=“循环状态对象”>…<c:forEach>
<c:forEach items=“容器对象EL表达式表示” var=“容器元素临时变量” varStatus=“循环状态对象”>…<c:forEach>
JSP对象pageContext PageContext 当前页面共享数据 也可获取其他八个对象
request HttpServletRequest 一次请求
response HttpServletResponse 一次响应
session HttpSession 一次会话多个请求间
application ServletContext 所有用户间共享数据
page Object 当前页Servlet对象 this
config ServletConfig Servlet配置对象x
exception Throwable 异常对象
作用域page(当前页)、request(同一个请求中 forward转发)、session(同一个会话中使用)、application(在所有应用程序中有效)
会话技术:
一次会话(浏览器第一次发送请求直到有一方断开为止)中包含多次请求和响应。在一次会话的范围内,多次请求响应中共享数据
客户端cookie 将数据保存在客户端
创建cookie对象,绑定数据 new Cookie(String ma,e,String value)
发送cookie response.addCookie(Cookie cookie)
获取cookie拿到数据 Cookie[] request.getCookies()
细节处理:可以一次发送多个cookie,创建多个cookie对象多次发送
默认情况下,浏览器关闭后cookie被销毁;持久化 cookie对象.setMaxAge(int Seconds),参数正:时间/负:默认值/零:删除信息
Tomcat8之后cookie支持存储中文,但特殊字符(空格等)仍然不支持,建议URL编码存出解析
在Tomcat服务器中部署了多个项目, 默认不能共享。setPath(“Path”)设置cookie获取范围,setPath("/")所有项目都可以共享
不同tomcat服务器间通过设置setDomain(String path)同一域名 多服务器可共享
特点和作用:浏览器对单个cookie大小(4kb)、同一域名下cookie数量都有限制(20)
用于存储少量非敏感数据,在不登陆情况下服务器对客户端的身份识别
案例:cookie发送获取CookieDemo1/2 记住上次访问时间CookieDemo3
服务端session 将数据保存在服务器 依赖于cookie的请求和响应信息保存sessionID保证一次会话使用的是同一session
创建session对象 HttpSession session = request.getSession();
设置session对象 session.setAttribute(“msg”,“hello session”);
获取session对象 Object msg = session.getAttribute(“msg”);
细节处理:客户端关闭服务器不关闭两次获取session不是同一个(默认 也可设置cookie键为JSESSSIONID持久化)
客户端不关闭服务器关闭两次获取session不是同一个,但要确保数据不丢失
Session钝化:服务器关闭前将session序列化到硬盘上
Session活化:服务器重启后将session反序列化到内存中
服务器自动执行 虽然对象地址值不同但数据保存成功
session销毁时间 服务器关闭/session对象调用invalidate()/默认30分钟失效(可设置)
特点和作用:存储任意类型 任意大小的数据 存在服务器端
cookie与session区别:
session服务器端 没有大小限制 数据安全,cookie客户端 有大小限制 相对不安全
HTTP
基于TCP/IP与请求响应模型 (请求行GET/login.html HTTP/1.1 、 请求头 浏览器向服务器发送自身信息、请求体 封装POST请求参数)
POST(参数在请求体中 没有长度限制)/GET(参数在请求行中URL后 长度限制 相对不安全)
session服务器端 没有大小限制 数据安全,cookie客户端 有大小限制 相对不安全
状态码:1xx请求未完成 2xx请求成功 3xx重定向/访问缓存 4xx客户端错误 5xx服务器端错误
传输协议 基于TCP/IP 请求响应消息组成格式规则 基于请求响应模型,一次请求对应以此响应
Request、Response对象由tomcat服务器创建后传给service方法并调用 来获取、处理页面数据,返回处理结果
请求行: 请求方式 / 请求URL / 请求协议 / 版本
GET/login.html HTTP/1.1
七种请求方式 两种常用 POST(参数在请求体中 没有长度限制)/GET(参数在请求行中URL后 长度限制 相对不安全)
请求头: 请求头名称:请求头值 浏览器告诉服务器自身的一些信息 版本、请求状态、语言环境、请求地址
服务器解析请求头获取值响应对应操作(例如基于浏览器版本进行不同操作 User-Agent)
Referer: 防盗链(视频网站付费电影 判断请求地址是否合法) / 统计流量来源(请求地址来自哪里)
请求体: 封装POST请求参数
响应行: 请求协议 / 版本 响应状态码 状态码描述
HTTP状态码:1xx请求未完成 2xx请求成功 3xx请求重定向/访问缓存 4xx客户端错误(404请求路径无资源/405请求方式无对应方法)
5xx服务器端错误(500服务器异常)
响应头: 响应头名称:响应头值 服务器告诉浏览器响应信息
Content-Type 本次响应体数据格式及编码格式
Content-disposition 以什么格式打开响应体数据(in-line当前页面打开/attachment;filename=xxx 以附件形式打开下载)
响应体: 真实的传输的数据 HTML页面本身
1、<请求>消息数据格式:HttpServletRequest
HttpServletResponse(获取请求消息):获取请求行、请求头、请求体数据 对应各种方法返回的都是String类型数据
(1)getMethod()获取请求方式、getContextPath()获取虚拟目录、getServletPath()获取文件路径、getQueryString()获取get方式请求
参数、getRequestURI/URL()获取请求URL、getProtocol()获取HTTP协议版本、getRemoteAddr()获取客户机IP地址 --请求行数据
(2)getHeader(String name)通过请求头名(例如Referer)获取值再判断防止盗链(返回字符串.contains("正确地址"))
getHeaderNames()获取所有请求头名称 --请求头数据
(3)POST请求体封装在流对象中,需要先获取流再从流中拿数据
BufferedReader getReader()获取字符输入流、ServletInputStream getInputStream()获取字节输入流
通用方法(Get/Post) 只写一份代码再get/post中标注this.doPost/doGet(request,response)
(1)获取请求参数 String getParameter(String name)根据参数名称获取参数值 账户名密码
String[] getParameterValues(String name)根据参数名称获取参数值数组 复选框
Enumeration<String> getParameterNames()获取所有请求的参数名称
Map(String,String[]) getParameterMap()获取所有参数的Map集合
中文乱码:request.setCharacterEncoding("utf-8");
(2)请求转发 一种在服务器内部的不同页面间资源跳转方式
RequestDispatcher getRequestDispatcher(String path)获取RequestDispatcher对象在用其进行转发
forward(ServletRequest request,ServletResponse response) 转发信息
request.getRequestDispatcher(String path).forward(ServletRequest request,ServletResponse response)
(3)共享数据 request域对象:在域作用范围内共享数据,一次请求 不同页面间传值
setAttribute(String name,Object obj)存储数据
getAttribute(String name)通过键获取值
removeAttribute(String name)通过键移除键值对
(4)获取ServletContext
ServletContext getServletContext()
2、<响应>消息数据格式:HttpServletResponse
HttpServletResponse(设置响应消息):
(1)设置响应行 setStatus(int sc)设置状态码
(2)设置响应头 setHeader(String name,String value)设置响应头
(3)设置响应体 获取输出流 getWriter() getOutputStream()
使用输出流输出到浏览器
(1)请求转发/重定向:
请求转发:即request.getRequestDispatcher().forward(),地址、资源不变,一次请求 对象保存转发给其他页面 相对路径
请求重定向:即response.sendRedirect(),地址、访问资源改变,两次请求 请求对象不会保存 绝对路径
(1)路径写法:相对路径 不可确定唯一资源 .开头 明确当前资源与目标资源之间的相对位置关系 ../上一级
绝对路径 可确定唯一资源 /开头 明确给谁用 客户端需要加虚拟目录 服务器不需要 常用
动态获取虚拟目录 String s = req.ContentPath(); response.sendRedirect(s+"/资源路径")
虚拟目录 访问服务器时使用 可在Run-Edit...中设置
(1)输出字符数据 resp.setContentType("text/html;charset=utf-8");获取流之前设置 reps数据前设置响应体 保证不发生中文乱码
PrintWriter pw = resp.getWriter(); pw.Write("<h1>Hello</h1>") 可自动解析标签
(1)输出字节数据 resp.setContentType("text/html;charset=utf-8");获取流之前设置 reps数据前设置响应体 保证不发生中文乱码
ServletOutputStream sos = resp.getOutputStream(); sos.write("图片等".getBytes());
(1)验证码 本质是图片 防止恶意注册 动态生成 代码:CheckCodeServlet
new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); ImageIO.write();