Java Web学习笔记

Java Web项目(学了就忘?来实操一下)https://blog.csdn.net/qq_41822345/article/details/104403813


day1–xml&反射

  • XML(Extensible Markup Language,可扩展标记语言)
    1.为了灵活实现不同路径下执行不同的资源,我们需要使用XML进行配置。
    2.为了限定XML内容,我们需要使用xml约束(DTD或Schema)。 DTD:文档类型定义
    3.为了获得XML的内容,我们需要使用dom4j进行解析。

  • 命名空间:用来处理元素和属性的名称冲突问题。每个元素和属性都有自己的名称空间,就像每一个类都有自己所在的包一样。

  • XML解析方式:DOM、SAX、PULL → 解析器(比较繁琐的API) → 解析开发包(简化API)
    DOM(文档对象模型)、SAX(逐行解析)、PULL(Acdroid内置的,类似于SAX)
    解析器即不同解析方式的具体实现。
    常用解析开发包:dom4j、JDom、JAXP、jsoup

  • dom4j常用API:
    1.SaxReader对象
    read()加载xml文档
    2.Document对象
    getRootElement()获取根元素
    3.Element对象
    elements()、element()、getName()、attributeValue()、elementText()、getText()

  • 反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
    使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段Field进行操作。


day2–http&tomcat

  • Http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
    用于定义Web浏览器和Web服务器之间交换数据的过程。

  • Http协议的组成:
    Http请求协议:请求行、请求头、请求体
    Http响应协议:响应行、响应头、响应体
    HTTP消息的组成:
    客户端到服务器的请求  服务器到客户端的响应。

  • B/S架构和C/S架构
    Web通信:采用B/S架构,通过Http进行通信。通过在浏览器地址栏编写URL,向服务器发送一个请求,服务器根据请求进行相应的处理,处理完成之后,向浏览器作出一个响应:将服务器端资源发送给浏览器。

  • URL:互联网上的每一个文件(资源)都有一个唯一的URL。
    URL格式:协议://用户名:密码@域名:端口号/资源位置?参数=值#标志
    http:192.168.0.116:8080/index.jsp

  • web资源分为静态资源(比如HTML、CSS、JS、图片等)和动态资源(比如JSP/Servlet、ASP、PHP等。

  • 常见的Web服务器:Tomcat、WebSphere、JBoss、WebLogic
    Tomcat:开源免费的轻量级Web应用服务器,用于开发和调试JSP程序的首选。支持Servlet和JSP规范(在java中,规范就是接口。)
    apache web服务器和Tomcat web服务器一般整合使用。(前者用于处理html页面。后者主要用于处理servlet和jsp,也可以处理html,但没有前者强大)。


day3–Servlet

  • JavaWeb三大组件:Servlet、Filter、Listener

  • Servlet:Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容。

  • Servlet的作用:
    1.获取请求数据
    2.处理请求
    3.完成响应

  • Serlvet的实现类:javax.servlet.http.HttpServlet (doGet()、doPsot())
    HttpServlet类的方法
    1)init()
    2)doGet(HttpServletRequest request,HttpServletResponse response)
    3)doPost(HttpServletRequest request,HttpServletResponse response)
    4)destroy()

  • Servlet接口中的方法
    1)init(ServletConfig config)
    何时执行:servlet对象创建的时候执行
    ServletConfig : 代表的是该servlet对象的配置信息
    2)service(ServletRequest request,ServletResponse response)
    何时执行:每次请求都会执行
    ServletRequest :代表请求,认为ServletRequest 内部封装的是http请求的信息
    ServletResponse :代表响应,认为要封装的是响应的信息
    3)destroy()
    何时执行:servlet销毁的时候执行

  • Servlet的生命周期(面试题)
    1)Servlet何时创建
    默认第一次访问servlet时创建该对象。当在servlet的配置时加上一个配置 servlet对象在服务器启动时就创建。
    2)Servlet何时销毁
    服务器关闭servlet就销毁了
    3)每次访问必然执行的方法
    service(ServletRequest req, ServletResponse res)方法。
    问题:对XXXServlet进行了10次访问,init(),destory(),service(),doGet(),doPost()一共执行力多少次?request对象创建几个?response创建几个?

  • Servlet的生命周期:用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中的init()方法就会执行,任何一次请求服务器都会创建一个新的线程访问Servlet中的service方法,在service方法内部根据请求的方式不同调用doGet()或者doPost()方法。当Servlet中服务器中移除掉或者关闭服务器时,Servlet的实例就会被销毁,destroy()方法就会执行。

  • Servlet配置示例:

  <!---------servlet的类的配置--------->
  <servlet>
     <servlet-name>hello</servlet-name>
     <servlet-class>com.liuwen.servlet.QuickStartServlet</servlet-class>
     <init-param>
          <param-name>url</param-name>
          <param-value>jdbc:mysql:///myDB
     </init-param>
  </servlet>
  <!---------servlet的虚拟路径的配置--------->
  <servlet-mapping>
     <servlet-name>hello</servlet-name>
     <servlet-pattern>/quickStartServlet</servlet-pattern>
  </servlet-mapping>
  • ServletContext对象:
    1.什么是ServletContext对象
    ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,一个web应用只有一个ServletContext对象。
    问题:一个web应用有几个servlet对象?----多个

  • ServletContext对象的生命周期?
    创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态))
    销毁:web应用被卸载(服务器关闭,移除该web应用)

  • 怎样获得ServletContext对象
    1)ServletContext servletContext = config.getServletContext();
    2)ServletContext servletContext = this.getServletContext();

  • ServletContext的作用
    (1)获得web应用全局的初始化参数
    (2)获得web应用中任何资源的绝对路径(重要 重要 重要)
    方法:String path = context.getRealPath(相对于该web应用的相对地址);
    (3)ServletContext是一个域对象(重要 重要 重要)
    什么是域对象?什么是域?存储数据的区域就是域对象

  • ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向servletcontext域中存取数据,数据可以共享)
    域对象的通用的方法:
    setAtrribute(String name,Object obj);
    getAttribute(String name);
    removeAttribute(String name);

  • Servlet是线程安全的么?
       Servlet 默认是单例模式,在web 容器中只创建一个实例,所以多个线程同时访问servlet的时候,Servlet是线程不安全的。 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的。
       当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。
    Java Web学习笔记_第1张图片
       上图中的Thread1和Thread2调用了同一个Servlet1,所以此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)。多线程并不共享局部变量,所以要尽可能地在servlet中使用局部变量。


day4–response

  • 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应的response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。

  • 响应状态码的方法:setStatus(int status)、sendError(int sc)
    响应消息头的方法:addHeader()\setHeader()、addIntHeader()\setIntHeader()、setContentLength()、setContentType()、setLocale()、setCharacterEncoding()(后面几个方法用于解决乱码问题)
    响应消息体的方法:getOutPutStream()(用于输出二进制字节数组)、getWriter()(输出字符文本)

  • 实例1、文件下载 必须设置Content-Type(实体内容的MIME类型)头、必须设置Content-Disposition(接收程序处理数据的方式)头
      原理:当点击下载超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。
      IE浏览器下载中文文件的时候采用URL编码,Firefox浏览器下载中文文件采用Base64编码。
      乱码问题:respose对象(HttpServletResponse)的字符输出流采用ISO-8859-1编码,IE浏览器默认使用GB2312编码。
      乱码解决思路:第一种:HttpServletResponse对象使用utf-8编码(response.setCharacterEncoding(“utf-8”)),通知浏览器使用utf-8解码。(response.setHeader(“utf-8”))
       第二种:response.setContentType(“utf-8”)

  • 实例2、验证码的生成(伪代码如下)
    VerfyCodeServlet{
    1.使用BufferedImage创建图片
    2.使用Graphics绘制内容
    绘制显示区域
    绘制随机字符(随机颜色)
    绘制干扰线
    3.使用ImageIO将BufferedImage写到浏览器
    必须使用response.OutPutStream()
    }


day5–request

  • 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。HttpServletRequset接口中定义了获取请求行、请求头、请求消息体的方法。

  • 获取请求行的相关方法:getMethod()(获取请求方式)、getContextPath()(获取web应用程序路径)、getRemoteAddr()(获取IP地址)
    获取请求头的相关方法:getHeader()、getContentType()、getCharacterEncoding()
    获取请求参数的相关方法:getParameter()、getParameterValues()、getParameterNames()、getParameterMap()

  • 重定向和转发的区别(redirect/forward):
    1.重定向的地址栏会发生变化,而转发不会;
    2.重定向是两次请求两次响应,转发是一次请求一次响应;
    3.重定向可以跳转到任意网站,转发只能在服务器内部进行转发;
    4.重定向路径需要加工程名,转发路径不用加工程名。


day6–Cookie和Session

  • 会话:指的是一个客户端(浏览器)与Web服务器之间里连续发生的一系列请求和响应过程。eg:一次整个购物过程就是一个会话。
      因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分客户端)

  • 为什么要用Cookie和Session来保存会话中产生的数据?而不用HttpServletRequest对象或者Servlet对象?
      HttpServletRequest对象或者Servlet对象都可以都数据进行保存。但是:
      ①使用HttpServletRequest:Web服务器端针对客户端的每次Http请求,都会创建一个HttpServletRequest请求,该对象只保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,购买请求中的数据将会丢失。
      ②使用ServletContext:由于同一个Web应用共享一个ServletContext对象,因此,结账时无法分辨哪些商品是哪些用户购买的,而会将所有用户所购买的商品进行结算,这显然也是不行的。

  • Cookie:Cokie是将用户的信息保存到客户端浏览器的一个技术,当下次访问的时候,浏览器会自动携带Cookie(在请求头携带)的信息过来到服务器端。

  • Cookie执行流程:当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器,一旦用户浏览器接收到该信息,就会把它保存在浏览器额缓冲区中,当需要再次访问服务器的时候,就会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器分辨出当前请求是哪个用户发送的。

  • Cookie的使用:
    服务器创建Cookie:new Cookie(name,value)
    将Cookie发送给浏览器:HTTPServletResponse.addCookie(Cookie cookie)
    接收浏览器所携带的Cookie:HTTPServletRequest.getCookies()

  • Session:Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSessionId。

  • Session执流程:甲乙两个用户购买东西。当甲访问购物网站时,服务器会为甲创建一个Session对象(存在服务器端),该对象会存放甲所购买的商品的信息。同时,服务器将甲用户Session对象的ID属性
    以Cookie(Set-Cookie:JSessionId)形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,服务器端会根据浏览器发送的请求消息头中Cookie的信息,即ID属性找到为甲所创建的Session对象,并由该对象所存放的商品信息进行结算。

  • 1.怎样获得属于本客户端的session对象(内存区域)?
    HttpSession session = request.getSession();
    2.怎样向session中存取数据(session也是一个域对象)?
    session.setAttribute(String name,Object obj);
    session.getAttribute(String name);
    session.removeAttribute(String name);
    3.session对象的生命周期?
    创建:第一次执行request.getSession();
    销毁:服务器关闭、session失效/过期(默认30分钟)、手动销毁session.invalidate();
    session作用范围:默认一次会话中

  • Cookie和Session的区别?(或者这样提问:有了Cookie为什么还要用Session?)
    Cookie是存到客户端的技术,有大小和个数的限制的,Session是存到服务器端的技术,没有大小和个数的限制。另外,Cookie相对于Session来说不安全。

  • Sevlet三个作用域总结对比:ServletContext、HttpSession、HttpServletRequest


Day7–JSP

  • JSP:(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术。JSP文件中,Html代码和Java代码共存(Html代码用于实现网页的静态内容显示,Java代码用于实现网页的动态内容显示)。
      JSP技术所开发的Web应用程序是基于Java的,它以一种简洁而快捷的方法从Java程序生成Web页面。它有:
    跨平台、业务代码相分离、组件重用、预编译。
    JSP页面和HTML页面没有什么区别,在页面代码最上方多了一条page指令。
    <%@ page language=“java” contentType=“text/html”;charset=“UTF-8” pageEncoding=“UTF-8”%>

  • Servlet:在Java代码中嵌入html(擅长编写Java代码); jsp:在html中嵌入Java代码(擅长页面显示)。

  • JSP的工作模式是请求/响应模式,其运行过程如下:(JSP文件→Servlet文件→.class文件)
    ①客户端发出请求,请求访问JSP文件;
    ②JSP容器会先将Jsp文件转换成一个Java Servlet源程序(并检查有无错误?有错则返回错误信息)
    ③JSP容器将转换成功的Java Servlet文件编译为字节码文件(.class文件)。该文件就是一个Servlet。
    总结:JSP就是Servlet。

  • JSP脚本元素(是指嵌套在<% 和 %>之间的一条或多条Java程序代码。)主要包含三种:
    JSP Scriptlets:<% java代码 %>
    JSP声明语句:<% 定义变量或方法 %>
    JSP表达式:<%=expression %>

  • JSP指令主要包含三种:
    page指令:<% page 属性名=“属性值1” 属性名=“属性值2” …%> 用于描述JSP页面特性
    include指令:<%@ include file=“被包含的文件地址”%> 用于JSP页面包含一个文件(静态包含)
    taglib指令:<%@ taglib uri=“标签库地址” prefix=“前缀”%> 用于引入(jstl、struts2)标签库

  • 静态包含和动态包含的区别:
    静态包含:<%@ include file=""%> 当前页面和被包含的页面,合并后生成一个Servlet源码。
    动态包含: 当前页面和被包含的页面,分别生成Servlet源码和字节码,运行时,由tomcat进行合并输出。

  • JSP内置对象(9个):
    out 用于页面输出
    request 得到用户请求信息
    response 服务器向客户端的响应信息
    config 服务器配置初始化参数
    session 保存用户信息
    application 保存所有用户的共享信息
    page 当前页面转换后的Servlet类的实例
    pageContext JSP页面容器
    exception 异常

  • pageContext对象:它不仅提供了获取其它8个隐式对象的方法,还提供了存储数据的功能(通过操作属性)
    它的作用范围有4个值:            描述        作用域名称       域对象类型
    pageContext.PAGE_SCOPE       表示页面范围      pageContext      PageContext
    pageContext.REQUEST_SCOPE    表示请求范围      request       HttpServletRequest
    pageContext.SESSION_SCOPE     表示会话范围       session       HttpSession
    pageContext.APPLICATION_SCOPE 表示Web应用程序范围    application     ServletContext


day8–JSP模式&EL&jstl

  • EL(Express Lanuage):一种简单的数据访问语言。目的:为了使JSP写起来更加简单。

  • EL最主要的作用是获得四大域中的数据,格式: 表 达 式 E L 获 得 p a g e C o n t e x t 域 中 的 值 : { 表达式 } EL获得pageContext域中的值: ELpageContext{pageScope.key};
    EL获得request域中的值: r e q u e s t S c o p e . k e y ; E L 获 得 s e s s i o n 域 中 的 值 : {requestScope.key}; EL获得session域中的值: requestScope.key;ELsession{sessionScope.key};
    EL获得application域中的值:${applicationScope.key};

  • EL内置对象(11个)
    pageScope,requestScope,sessionScope,applicationScope ---- 获取JSP中域中的数据
    param,paramValues ---- 接收参数。相当于request.getParameter()、request.getParameterValues()
    header,headerValues ---- 获取请求头信息。相当于request.getHeader(name)
    initParam — 获取全局初始化参数。相当于this.getServletContext().getInitParameter(name)
    cookie ---- WEB开发中cookie。相当于request.getCookies()、cookie.getName()、cookie.getValue()
    pageContext ---- WEB开发中的pageContext。 pageContext获得其他八大对象

  • jstl(JSP Standard Tag Library)JSP标准标签库,可以嵌入在jsp页面中使用标签形式完成业务逻辑等功能。
    使用taglib指令导入Core(核心)标签库:
    <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
    在JSP文件中使用这个标签库某个标签时,都必须加这个前缀。eg:

  • Core标签库:if标签

        body cntent

    Core标签库:forEach标签

            body cntent

  • MVC设计模式:一种软件架构模式,是一种分离业务逻辑与现实界面的设计方法。
    Controller控制器(Servlet):对请求进行处理,负责请求转发。
    View视图(JSP):图形界面设计。
    Model模型(JavaBean):编写程序应用功能、实现算法、数据库管理等。
    Java Web学习笔记_第2张图片

  • (MVC是理论基础,实际开发用如下分层模式)
    经典三层体系架构:表示层(web)、业务逻辑层(service)、数据访问层(dao)
    表示层:又称web层,与浏览器进行数据交互。
    业务逻辑层:又称service层,专门用于处理业务数据。
    数据访问层:又称dao层,与数据库进行数据交换。(负责将数据库的一条记录与JavaBean进行对应)


day9–JDBC案例-条件&分页

  • 条件查询原理:     web层               service层             dao层
              1.获取用户输入的数据;       1.接收wen层的实体对象    1.接收service层的数据
              2.将输入数据封装为实体Bean; 2.完成业务查询             2.sql拼写,完成DB查询
              3.传递实体对象给service层;   3.将数据传给dao层 (难点:sql怎么写.因为条件不固定)

  • 分页查询sql:格式:select * from table limit ?,?;
    参数1:startIndex
    参数2:pageSize 其中:startIndex = (pageNumber-1)*pageSize
    eg:select * from table limit 10,5; //第3页,每页显示5条。


day10–监听器

  • 监听器(listener)就是监听某个对象的的状态变化的组件。

  • 8个监听器(6+2):
    ServletContext域 HttpSession域 ServletRequest域 (6个)
    域对象的创建与销毁 xxxxxxxListener
    域对象的属性变化 xxxxxxxxxxxxxxxAttributeListener
    生命周期 ServletContext域 HttpSession域 ServletRequest域
    何时创建 服务器启动创建 第一次调用request.getSession时创建 每一次请求都会创建
    何时销毁 服务器关闭销毁 服务器关闭销毁;session过期;手动销毁 请求结束

  • 监听器的编写步骤(重点):
    a、编写一个监听器类实现listener接口
    b、覆盖监听器的方法
    c、需要在web.xml中进行配置—注册

  • 另外两个特殊监听器(无需配置web.xml)
    绑定与解绑的监听器HttpSessionBindingListener;钝化与活化的监听器HttpSessionActivationListener

  • 邮箱服务器:
    接受邮件的协议:POP3(110) IMAP
    发送邮件的协议:SMTP(25)

  • 邮箱的发送过程:
    Java Web学习笔记_第3张图片


day11–过滤器

  • 过滤器(filter)是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理。(实现对请求资源的过滤功能。可以检查请求信息,也可以处理响应信息)

  • Filter的作用? 应用场景:自动登录、解决全站乱码、屏蔽非法文件、进行响应数据压缩等
    1)公共代码的提取
    2)可以对request和response中的方法进行增强(装饰者模式/动态代理)
    3)进行权限控制
    eg:自动登录原理:
    ①用户登录成功后,如果之前勾选了自动登录,则会使用cookie记录用户信息(以“用户名@密码”形式);
    ②当用户第二次访问首页时,编写的过滤器来处理浏览器中cookie记录的用户信息,实现自动登录。
    eg:解决乱码问题原理:
          过滤器Filter
          执行前处理请求(定义编码形式)
          放行
          执行前处理响应数据

  • 过滤器的编写步骤(重点):
    a、编写一个过滤器类实现Filter接口
    b、实现接口中尚未实现的方法(着重实现doFilter方法)
    c、在web.xml中进行配置(主要是配置要对哪些资源进行过滤)

  • Filter的API
    1)init(FilterConfig) 2)destory()方法 3)doFilter方法

  • Filter对象的生命周期:
    Filter何时创建:服务器启动时就创建该filter对象
    Filter何时销毁:服务器关闭时filter销毁


你可能感兴趣的:(四.Java项目篇,六.Java框架篇)