应对后续公司开发需求进行的针对性提炼复习和学习(二)JSP Servlet部分

白昊乾
2023-12-01

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();
 类似资料: