文章目录

  • 前言
  • http协议笔记
  • JavaWEB笔记_1
  • JavaWEB笔记_2(JSP)
  • JavaWEB笔记_3(web项目)
  • Servlet
  • Tomcat笔记
  • 总结

前言

大家好,我是ChinaManor,直译过来就是中国码农的意思,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。

该JavaWeb学习笔记源自zcc同学,非常善于总结知识的一位同学,可以收藏起来慢慢学习

http协议笔记

协议 : 约定 网络传输协议:   `规范网络传输` 如 速率 . 传输码率 . 代码结构 . 传输控制TCP 三次握手        四次挥手简介 : http协议 http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息      以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式HTTP协议(HyperText Transfer Protocol,`超文本传输协议`)是因特网上应用最为广泛的一种网络传输协   议,       所有的WWW文件都必须遵守这个标准。HTTP是一个基于`TCP/IP`通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)HTTP 工作原理 :   完整的http协议  包含 请求 和 相应1.  HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求2. Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。3. Web服务器根据接收到的请求后,向客户端发送响应信息。4. HTTP默认端口号为`80`,但是你也可以改为8080或者其他端口。请求    请求行 请求头 空一行 请求体响应   响应行 响应头 空一行 响应体根据 HTTP 标准,HTTP 请求可以使用多种请求方法。`HTTP1.0` 定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。url 统一资源定位符/IP 端口  (服务器上资源路径)200 - 请求成功301 - `资源(网页等)被永久转移到其它URL`404 - 请求的资源(网页等)不存在500 - `内部服务器错误`

JavaWEB笔记_1

-------------------------------------------------------------------------------------------浏览器上能看到的一切内容,统称之为 WEB资源。静态WEB资源:代码不变,`最终展示效果就不变`。(HTML/CSS/JS/图片/声音/视频…)
动态WEB资源:效果的改变,由程序控制完整格式如下
协议名://域名:端口号/WEB资源位置?参数=值&参数=值协议名:http、https、ftp等 (`谷歌浏览器帮助你隐藏了该协议名,但协议名是存在于URL地址上`)域名:通过域名可以找到某个网站。域名最终会翻译成IP地址。 192.168.31.1
域名或IP地址,都可以访问WEB资源。 例如:www.czxy.comCMD命令行: 输入 ping 网址       可以看到该网址的ip地址端口号:程序必须使用端口号,才可以让另一个计算机访问。http协议的默认端:80例如:http://www.czxy.com       http://www.czxy.com:80/资源位置:用于描述WEB资源再服务器上的位置。例如:http://www.czxy.com/czxy.jpg参数=值:浏览器向服务器传递的数据(表单的get方式默认会采取这种方式/程序员也可以主动书写)例如:http://www.czxy.com/index.html?username=xxx&pwd=111--------------------------------------------------------------------------------------服务器就是一个软件,任何电脑只需要安装上了服务器软件,然后该电脑的指定目录下的资源就能提供对外访问提供计算服务的设备,服务类型有很多,常见的有:游戏服务,购物服务,新闻服务等1. `WebLogic`Oracle公司的产品,是目前应用最广泛的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。2. `WebSphere`IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最主要的软件平台,可用于企业开发、部署和整合新一代的电子商务应用。3. `GlassFish`最早是Sun公司的产品,后来被Oracle收购,开源,中型服务器。4. `JBoss`JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。5. `Tomcat`中小型的应用系统,免费开源,支持JSP和Servlet。--------------------------------------------------------------------------------------BaseServlet 相关方法将表单参数,封装到User对象中  User user = toBean(对象名.class);获取表单单值           getRequest().`getParameter`("name名称");获取表单多值(复选框)     getRequest().`getParameterValues`("name名称");获取整个参数列表            Map<String,String[]> map = request对象.getParameterMap();      --------------------------------------------------------------------------------------请求转发:服务器内部进行程序/资源跳转的方式(没有浏览器参与,只有服务器内部执行)简化格式: forward:/要跳转的程序或者页面 注意:forward:/   中的/  表示的就是web目录完整格式:   getRequest().`getRequestDispatcher`(“/要跳转的程序或者页面”).forward(request,response);请求转发使用环境 :1、快速跳转服务器内某个资源或某个其他的servlet2、若需要访问受保护目录资源(请求转发无 次数限制,经过多次转发,多次转发因为是在服务器内部,速度极快)请求转发中,必须获取RequestDispatcher对象(资源封装器)该对象用于封装当前项目下(web目录)所有的资源(包含受保护目录)意味着:请求转发只能跳转当前项目内任意资源。     意味着:请求转发不能跳转外网。另一种资源跳转方式:`请求重定向  302`若不存在请求转发,不能通过request域对象,进行数据传递的。1、  请求转发是服务器内部程序跳转,浏览器是不知道的2、    请求转发中会传递request和response对象3、    在多次请求转发中,使用的是同一个request对象请求转发间的数据传递-request作用域1. setAttribute(key,value);    向request作用域中存储一个键值对相当于map.put(key,value);2. getAttribute(key);      从request作用域中获取值(Object类型)获取不到,返回null相当于map.get(key);3. removeAttribute(key); 从request作用域中删除某个键值对相当于map.remove(key);--------------------------------------------------------------------------------------WEB-FIN下web.xml配置<!--a.注册我们的servlet--><servlet><!-- 给我们的servlet起名称 --><servlet-name>ServletDemo1</servlet-name><!-- 告诉tomcat我们的servlet所在路径  全限定名(包名+类名) --><servlet-class>com.itheima.servlet.ServletDemo1</servlet-class></servlet><!--b.为我们的servlet提供访问路径--><servlet-mapping><servlet-name>ServletDemo1</servlet-name><!-- 设置浏览器访问的路径 路径自定义 --><url-pattern>/demo1</url-pattern></servlet-mapping>访问路径配置url-pattern配置方式共有三种:1.`完全路径`匹配:以 / 开始,要求域名后的访问路径,必须和配置的路径完全一致,才能匹配到      例如:  /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6  适用于:针对性访问某个servlet2.`目录`匹配:以 / 开始 需要以 * 结束.  要求域名后的访问路径,目录名必须和配置的路径目录名完全一致,才能匹配到。 例如: /*  (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*  适用于:目录名一致,就进行匹配。 (权限校验 /user /vip)3.`扩展名`匹配:不能以 / 开始 以 * 结束的. 要求域名后的访问路径,扩展名必须和配置的路径扩展名完全一致,才能匹配到。例如: *.do , *.action 、*.jpg   适用于:只要扩展名一致,即匹配。(对图片/资源进行针对性的权限处理。  *.jpg,*avi)以上三种匹配,若未按照格式进行书写,项目启动时,会报LifecycleException     ***** 错误的写法 : /*.do4.`缺省`路径/   通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet某个servlet加入该设置后,访问该项目的.jpg或.avi或.html等资源时,都会直接访问该servlet。除非你需要在资源加载前,做一些判断操作,然后手动给用户加载资源,否则不要用缺省路径Servlet相关配置:url-pattern:一个servlet可以设置多个url-pattern完全路径匹配>目录匹配>扩展名匹配>缺省路径--------------------------------------------------------------------------------------
浏览器发请求方式:
   get①地址栏直接写路径:http://localhost:8080/项目名/servlet路径?method=方法名②location.href     : location.href=”/项目名/servlet路径?method=方法名”;    post:<form method=”post” action=”/项目名/servlet路径”><input type=”hidden” name=”method” value=”方法名”/>访问servlet的某个方法时:写清servlet路径   `传递参数method=方法名`
--------------------------------------------------------------------------------------启动时创建servlet前置知识:Servlet生命周期
   Servlet对象何时产生:第一次访问该对象(一般情况下,某个servlet在服务器中只有一个实例对象)
   Servlet对象何时销毁:服务器正常关闭时问题:若某个servlet过大,用户第一次访问该servlet时,servlet因为没有创建对象,第一个用户第一次访问时,servlet会先创建对象,再调用方法。第一个用户第一次访问,servlet如果很大,创建对象速度就会很慢。为了解决第一个用户等待servlet对象创建,空白时间,优化用户体现。把servlet产生的生命周期提前:提前到项目创建时:<load-on-startup>2</load-on-startup>  大于1的正整数。  优先级虽然很高,但已经被tomcat相关组件使用了。ServletConfig配置  一个servlet有一个servletConfig对象,该对象封装了servlet标签下的配置信息servletConfig对象就是某个servlet的身份证。是在servlet创建时,一起创建出来的getInitParameter(name)    String  获得Servlet的初始化参数的getServletContext() ServletContext  获得ServletContext对象的引用getServletName()   String  获得Servlet在web.xml中配置的name的值。及<servlet-name>标签配置内容。作用:
   获取项目配置信息; (用法和servletConfig相似)
   项目内进行信息共享;(域对象,用法和request相似。HashMap<String,Object>)--------------------------------------------------------------------------------------请求转发间的数据传递-request作用域1. `setAttribute`(key,value); 向request作用域中存储一个键值对相当于map.put(key,value);2. `getAttribute`(key);  从request作用域中获取值(Object类型)获取不到,返回null相当于map.get(key);3. `removeAttribute`(key); 从request作用域中删除某个键值对相当于map.remove(key);ServletContext全局应用程序共享对象: ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。getServletContext();               ServletContex中的获取方式setAttribute(String name,Object object)      向ServletContext中存数据getAttribute(String name)            从ServletContext中取数据removeAttribute(name)            从ServletContext中移除数据--------------------------------------------------ServletContext和Request一样都可以作为域对象进行数据传递。
       request:请求转发中进行数据传递。(一次请求,还未产生响应)
       ServletContext:在当前项目任意位置,传递数据(不限于请求)request:生命周期短,作用范围小(仅限于某次请求)创建:接收到任意某个请求作用范围:请求产生----响应未结束(某次请求中,多见于请求转发)销毁:该请求产生响应
   ServletContext:生命周期长,作用范围广(限于项目内容任意资源)创建:服务器正常启动时作用范围:服务器正常启动期间,项目内任意位置都可以进行数据共享和传递(JSP、servlet)销毁:服务器正常关闭时----------------------------------------------------------------------------------------------------------------------------------------request对象作用1、存在于某个请求—响应 之间的作用域对象(可以获取、设置、删除),可以在请求转发中传递数据   作为作用域,传递数据时,里面有HashMap<String,Object>2. request对象产生时,把浏览器发来的请求行、请求头、请求体三部分信息进行封装。三部分请求信息禁止在服务器端直接修改(设计时的一个安全考虑)操作request中的请求信息,只有读取数据操作合法的请求行   请求方式 请求路径?参数列表 协议名/版本号请求头   String getHeader(String name)       如果获取不到某个头信息,返回为null  该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值请求体    整个表单数据,封装JavaBean:    JavaBean 对象 = toBean(JavaBean.class);      要求:JavaBean类实现序列化接口,成员变量名必须和参数名保持一致   适用于:大量数据需要接受单独获取某个参数信息:       String value = request对象.getParameter(“参数名”);      //若参数不存在,返回nullString[] value = request对象.getParameterValues(“参数名”);        //若参数不存在,返回nullMap<String,String[]> map = request对象.getParameterMap();        获取整个参数列表http请求信息,在服务器接收到请求时,就会被封装成HttpServletRequest对象,把请求的行、头、体所有数据,作为二进制字节流保存。    //封装了请求的行、头、体,该字节流不可修改、替换    ServletInputStream sis = getRequest().getInputStream();http请求信息是被封装到request对象中,若尝试在服务器端对请求信息进行任何修改,服务器会报异常。--------------------------------------------------------------------------------------response对象  1. Response对象是用来封装http响应信息,程序员可以在servlet上,对已有的response对象进行操作,向 响应行、头、体编入信息。ServletResponse接口   HttpServletResponse接口 (tomcat已经为我们写好了实现类,响应信息封装时,创建tomcat实现类对象,操作的响应对象,就是tomcat写好的实现类)    和request同生共死操作-响应行     1. setStatus(int status);//写入任意 码给浏览器(2xx,3xx,4xx,5xx)    若未设置状态码,且服务器运行正常,Web服务器会默认产生一个状态码为200的状态行。2. sendError(int sc,String errorMsg);       建议该方法仅发送4xx和5xx状态码。操作-响应头       1. void addHeader(String name, String value)         void setHeader(String name, String value)  这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段2. void setCharacterEncoding(String charset)     该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。3. void setContentType(String type)            该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置                                      为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8操作-响应体   1. getOutputStream()   向响应体输出二进制字节流信息。2.    getWriter()        向响应体输出字符流信息。【字符串及前端代码输出】    若输出前端代码,则会被浏览器解析执行       //一般要设置码表,才不会乱码(两句中其中一句)  因为BaseServlet中有以下代码            //getResponse().setCharacterEncoding("utf-8");            //getResponse().setContentType("text/html;charset=utf-8");注意:            一个响应体,只能被一种流操作(字符宇节)若同时获职两种流, servlet执行报错读取WEB程序下的资源   相对路径出发目录:    当前项目根目录。    Servlet中读取资源文件,读取的是: 该目录资源使用绝对路径:getServletContext().getRealPath(“/”);--------------------------------------------------------------------------------------请求重定向1.  手动书写     //1.1、编写302状态码  getResponse().setStatus(302);   //1.2、编写location响应头 getResponse().setHeader("location","/项目名/资源路径?参数列表");2. 完整书写格式      getResponse().sendRedirect("/项目名/资源路径?参数列表");3. 简化格式      return “redirect:/资源路径?参数列表”--------------------------------------------------请求转发-地址:/资源路径?参数列表当前项目内-完成格式:/项目名/资源路径?参数列表     当前项目内-简化写法:/资源路径?参数列表    外网写法:http://网址  请求转发:只有一次请求一次响应,产出一个request对象,可以使用request作用域传递数据(服务器内部进行转发的过程中,浏览器完全不知情。地址栏也不会改变)
       请求重定向:让浏览器自动敲回车。请求重定向一次,产生两个请求。两个request,不能使用request作用域传递数据。(依赖浏览器进行跳转。地址栏会发生改变)请求重定向:请求外网 / 需改变地址栏路径,统一用重定向,请求转发:其他所有使用请求转发即可1、 请求转发使用request对象,重定向使用response对象 2、   请求转发使用服务器端路径(服务器内部跳转,/资源名?参数列表),重定向使用客户端路径(浏览器跳转:/项目名/资源名?参数列表)3、  请求转发不能跳转外网,重定向可以4、   请求转发是服务器内部的跳转,不依赖网速,跳转速度极快。重定向是依赖浏览器的跳转,严重依赖网速,跳转速度略慢5、 请求转发:请求一次,响应一次。  占用资源少重定向:重定向N次,响应n+1次。占用大量资源6、    请求转发可以访问受保护目录资源,重定向不能7、  请求转发不会改变地址栏路径,重定向会改变路径。8、    请求转发可以使用request作用域,重定向不能--------------------------------------------------延迟请求重定向    1. getResponse().setHeader(“refresh”,”秒数;url=/项目名/资源名?参数列表”);2. getResponse().setHeader(“refresh”,”秒数;url=http://网址”);       请求转发可以和重定向的结合   请求重定向不能和延迟重定向组合使用。          --------------------------------------------------------------------------------------会话技术1. 为什么要去使用会话技术?        ①后期很多功能都要由会话技术辅助②已学的域对象无法完成类似数据共享传递(两个不同的请求,request无法进行数据共享)2. 会话是什么?会话:浏览器开启---浏览器和服务器进行多次请求响应---浏览器关闭   浏览器从开启 到 关闭,我们称为一次会话; 生活中,就是两人一次电话。3. 会话技术是什么?作用?会话技术:用于保存和传递 会话中产生的数据   保存在浏览器/客户端的会话技术:cookie   保存在服务器端的会话技术:sessionCookie会话技术   Cookie:是保存在浏览器/客户端 的会话技术     Cookie可以理解为:服务器写给浏览器的一张小纸条。(小纸条由浏览器保存) 键值对。    name:zhangsan   pwd:1231、   服务器编写cookie,读取cookie 2、  浏览器保存cookie,发送cookie3、   浏览器和服务器之间cookie传递  依赖请求头、响应头///创建cookie 响应cookienew Cookie(“键”,”值”);            //创建cookie对象    键和值必须都是字符串getResponse().addCookie(cookie对象);        //响应cookie对象//读取cookiegetRequest().getCookies();  返回cookie数组(封装了请求头所有的cookie)若一个cookie都没有,该数组为null,一般要配合非空判断Cookie对象.getName(); 获取键 (String)  Cookie对象.getValue(); 获取值 (String)//删除  修改 cookie      cookie中key值相同会被覆盖,删除cookie可以给cookie的最大存活时间设置为0       setMaxAge(0);使用注意       1. cookie的默认保存:是和浏览器的关闭与否有关,和服务器关闭与否无关  服务器关闭与否,不会影响cookie保存。  浏览器关闭与否才会影响cookie保存。(浏览器关闭,会话结束,默认保存在内存中cookie就会消失)2. cookie是由http协议制定,只要使用http协议,就可以使用cookie。浏览器、手机端3. cookie保存是有上限。Value值数据量有上限,总cookie数量有上限,某网站向浏览器保存的cookie量有上限4. cookie不能直接保存中文    原因:cookie依赖http头(响应头、请求头)进行数据传递    头默认编码、解码码表:iso8859-1 常见解决方案:保存数据时URL编码    1. 响应 Cookie k1 = new Cookie("name", URLEncoder.encode("张三","utf-8"));   2. 读取  String value = URLDecoder.decode(c.getValue(),"utf-8");------------------------------------------------------    临时cookie:保存在浏览器内存中的cookie(默认)       特点是:浏览器关闭,cookie就会销毁        持久化cookie:保存在浏览器对应的硬盘上(持久化cookie)   特点:只有过期cookie,才会销毁   浏览器即使关闭,cookie也会保存下来设置cookie的存活时间。 秒 setMaxAge(int expiry)            -1  默认。保存在浏览器的内存中浏览器必须打开着的,浏览器关闭cookie销毁0   让cookie立即销毁(用来通知浏览器销毁某个cookie)>0的正整数 0 只要正整数大于0的,就会存活在浏览器对应的硬盘上,不以浏览器的关闭为销毁。而是时间到期,就会自动销毁相同的cookie设置,新的会覆盖旧的 浏览器打开/刷新时,才会有判断和销毁过期cookie的操作。   谷歌浏览器看cookie的过期时间需要加上8个小时Cookie的有效路径:地址栏访问路径 若等于或包含 某个cookie的有效路径,该cookie就会被发送给服务器。       setPath(java.lang.String uri)设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。
   例如:setPath("/web/a/b");http://localhost:8080/web/a/b/oneServlet,可访问(当前路径)http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径)http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)
   常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问ookie若隶属于某个模块,为了让该模块的cookie方便管理,会设置有效路径。用户模块cookie: /项目名/user/ 商品模块cookie: /项目名/product/ cookie对象.setPath(request对象.getContextPath()+”/”);唯一标识     需要进行cookie的新旧覆盖操作:新cookie和旧cookie,唯一标识相同,才能相互覆盖。新cookie和旧cookie,唯一标识不同,就是分别保存两个cookie。唯一标识:域名+有效路径+cookie名通常  Cookie的域名不需要手动设置,都是idea自动设置。(跨域访问、跨域cookie共享,才会设置域名。  setDomain(“”))通常  cookie若未分模块保存,有效路径也就无需设置,都是idea自动设置。    只需要保证,域名和有效路径相同的情况下,使用cookie名区分cookie------------------------------------------------------   --------------------------------------------------------------------------------------session简述 保存在服务器端的会话技术。   浏览器和服务器协作才能完成session数据的保存和读取操作。request:一次请求范围(请求转发)session:会话范围 (用户登录、好友列表、信息、权限)ServletContext:整个项目范围1、浏览器必须保存JSESSIONID(若该cookie丢失、销毁,会导致找不到原来的session对象,会重新获取新session, 新的JSESSIONID)2、session依赖于cookie,若禁用了cookie,会导致session机制失效。Session:创建:会话开启,第一次调用getSession()方法销毁:1、服务器的非正常关闭服务器正常关闭,数据会被保存在硬盘上,服务器启动会重新加载回来2、调用invalidate() ,就会立即主动销毁session对象3、30分钟未访问session对象,session对象销毁ServletContext:   服务器启动创建,服务器正常关闭销毁。 Request:   创建:接收到任意一个请求;     销毁:这次请求产生了响应同一个会话中,可以使用session进行数据传递(同个会话中,多次请求,使用的都是同一个session)若浏览器删除JSESSIONID,会导致找不到原来的session对象,会获取一个新session,新session中没有原来的数据String getId() 用于返回与当前HttpSession对象关联的会话标识号JSESSIONID的cookie是临时cookie,浏览器关闭就销毁。若需要将JSESSIONID改为持久化cookie,需要获取sessionidnew Cookie(“JSESSIONID”,session.getId());设置生存时间,可以持久化保存boolean isNew()  判断当前HttpSession对象是否是新创建的void invalidate()   用于强制使Session对象无效。   强制销毁对应session对象。void setAttribite(String name,Object value) 用于将一个对象与一个名称关联后存储到当前的HttpSession对象中String getAttribute()            用于从当前HttpSession对象中返回指定名称的属性对象void removeAttribute(String name)     用于从当前HttpSession对象中删除指定名称的属性-------------------------------------------------------------------------------------------MVC设计模式  简述  MVC:软件设计模式。方便维护和扩展。  模型M:算法和数据封装。JavaBean 视图V:数据收集和展示。JSP      控制器C:请求处理、程序跳转。Servlet三层架构
       1.  表示层: 又称为 web层,与浏览器进行数据交互的。   2. 业务逻辑层:    又称为service层,专门用于处理业务逻辑的。    2. 数据访问层:    又称为dao层,与数据库进行数据交换的。将数据库的一条记录与JavaBean进行对应。根据MVC设计模式,依据三层架构cn.czxy                            公司域名倒写cn.czxy.xxx                       项目名称cn.czxy.xxx.yyy                         子模块cn.czxy.xxx.yyy.dao                      子模块dao层接口cn.czxy.xxx.yyy.dao.impl                   子模块dao层实现类cn.czxy.xxx.yyy.service                   子模块service层接口cn.czxy.xxx.yyy.service.impl                   子模块service层实现类cn.czxy.xxx.yyy.domain                    子模块JavaBean (子模块yyy可省略)cn.czxy.xxx.yyy.web.servlet                  子模块web层,servletcn.czxy.xxx.yyy.web.filter                    子模块web层,filtercn.czxy.xxx.utils                      工具cn.czxy.xxx.exception                     自定义异常cn.czxy.xxx.constant                   常量-------------------------------------------------------------------------------------------过滤器简述      过滤器:是JavaWeb的三大组件之一(servlet、Filter、listener)   过滤器:实现了Filter接口的Java类。   过滤器作用:   ①过滤、处理请求        ②拦截请求(springMVC --- 拦截器)/*   目录匹配(目录拦截) 对项目下所有的请求,进行拦截小结:过滤器执行时,每执行一次,都是执行一次doFilter生命周期&原理&放行创建:服务器启动时创建。 (会执行该Filter的`init`方法)销毁:服务器正常关闭时销毁。 (会执行该Filter的`destory`方法)1、先执行过滤器,再执行servlet(资源)2、只有过滤器放行了,才会执行后面的目标资源过滤器web.xml配置      <filter><filter-name>PermissionFilter</filter-name><filter-class>cn.czxy.demo.filter.PermissionFilter</filter-class></filter><filter-mapping><filter-name>PermissionFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>FORWARD</dispatcher></filter-mapping> url-pattern的配置与servlet中的配置一样:* 三种配置:     完全路径拦截》》目录拦截》》扩展名拦截* 完全路径拦截: 以 / 开始   /aaa /aaa/bbb    例如:/hehe/d1* 目录拦截:             以 / 开始   /*  /aaa/*      例如:/*    /user/*   /product/** 扩展名拦截:        不能以 / 开始  *.do  *.jsp  *.action     例如:*.jsp   *.avi针对某个servlet进行拦截  servlet-name的配置,通过url-pattern拦截一个Servlet的资源.也可以通过servlet-name标签进行拦截.    dispatcher的配置(拦截类型)* REQUEST  :默认值.(拦截浏览器发给服务器的请求)* FORWARD  :拦截服务器内部的请求转发。(内部跳转到某个重要资源)* ERROR     :拦截跳转到错误页面.全局错误页面.  * INCLUDE    :拦截在一个页面中包含另一个页面.过滤器链及原理过滤器链:多个过滤器进行请求时,依次执行。过滤器链执行顺序:Filter-mapping放置顺序有关。 从上到下依次执行。1、 若路径匹配,多个过滤器按照Filter-mapping放置顺序依次执行(从上到下)2、    过滤器链上,放行代码,执行下一个过滤器/执行目标资源3、  目标资源执行完毕后,还会倒着执行 放行之后的代码FilterConfig FilterConfig对象是Filter的身份证。过滤器上的资源跳转 HttpServletRequest对象:    getRequestDispatcher(“/资源路径”).forward(request,response);HttpServletResponse对象:   sendRedirect(“/项目名/资源路径”);sendRedirect(“http://外网路径”);补充其他方法        request.getRequestURI()获取当前请求路劲-------------------------------------------------------------------------------------------

JavaWEB笔记_2(JSP)

--------------------------------------------------------------------------------------------------------------------------概述 JSP本质是一个Servlet JSP是Java独有,除了可以书写HTML/CSS/JS代码,更支持书写Java代码和EL表达式等强大功能。扩展名: .jspJSP运行原理    .jsp文件 -> 翻译 -> .java文件 -> .class文件    修改后的第一次执行该JSP时,才会有翻译和编译过程。JSP是如何被读取到文件:   1. 浏览器:/项目名/hello.jsp2. 服务器接收路径,创建request和response对象3. 进行路径匹配。完全路径匹配,匹配不到目录匹配,匹配不到扩展名匹配,匹配到了  tomcat自带的JSPServlet4. JSPServlet执行时,会根据访问路径,读取JSP文件。读取不到,404读取到了,判断该JSP是否已经被访问。如果已经被访问,直接调用。如果修改后未被访问,进行翻译过程,把JSP文件,翻译成.java文件把.java文件编译成.class文件,以servlet方式执行.class文件JSP基本语法   <% java 代码(变量、方法、语句等)%>声明表达式:<%! 定义变量 %> 会把代码放置在翻译后JSP文件 成员位置。JSP注释        <%-- jsp注释--%>        <%   //java注释    %>       <!-- html注释-->Jsp文件源码 html源码      翻译后的        Java文件jsp注释     有       无       无java注释     有       无       有html注释     有       有       有JSP上尽量使用JSP注释--------------------------------------------------------------------------------------------------------------------------JSP不仅可以编写前端代码,而且可以直接编写Java代码JSP嵌入Java代码      书写Java代码格式:  <%   java代码   %><% String str = "O(∩_∩)O~"; //建议使用 out.write() 替代System.out.println();   //out.write()可以直接输出到页面上 out.write(str);%>1. <%--  EL表达式:不能用于HTML,只能用于JSP   --%>   ${username}  方式一:${键名}2. <% String username = (String) request.getAttribute("username");  out.write(username); %>JSP页面导包 JSP可以进行导包操作。使用import属性。  一个页面可以书写N多个import属性。<%@ page import="com.czxy.demo2.domain.Person" %><%@ page import="java.util.ArrayList" %><%@ page contentType="text/html;charset=UTF-8" language="java" %>JSP和HTML区别JSP:可以编写前端代码,可以编写Java代码。EL表达式。自定义标签 是一个动态资源,本质是一个特殊的servlet(request.getRequestDispatcher("/路径").forward(request,response);HTML:仅是一个前端静态资源,仅可以书写前端代码。
--------------------------------------------------------------------------------------------------------------------------JSP指令 为了设置 JSP 页面中的一些信息, Sun 公司提供了 JSP 指令。 JSP 2.0 中共定义了 page、 include 和 taglib 三种指令,每种指令都定义了各自的属性。page指令       <%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>1. pageEncoding    当前页面 指定页面编码格式2. contentType 有效的文档类型 客户端浏览器根据该属性判断文档类型,例如:HTML 格式为 text/html       纯文本格式为 text/plain   JPG 图像为 image/jpeg  GIF 图像为 image/gif   Word 文档为 application/msword3. import        任何包名、类名 指定在 JSP 页面翻译成的 Servlet 源文件中导入的包或类。 import 是唯一可以声明多次的 page 指令属性。 一个 import 属性可以引用多个类,中间用英文逗号隔开。include 指令 实际开发中,经常涉及到一个 JSP 引入另一个 JSP 的代码。这时我们就需要使用 include 指令 <%@ include file="被包含的文件地址"%>taglib 指令    该指令 用于引入标签库--------------------------------------------------------------------------------------------------------------------------JSP `九大内置对象` 在 JSP 页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web 应用程序的开发, JSP2.0 规范中提供了 9 个隐式(内置)对象,它们是 JSP 默认创建的,可以直接在JSP 页面中使用。`四个域对象`:application、session、request、pageContext两个特殊:response、page三个其他:out,config,exceptionout       javax.servlet.jsp.JspWriter         用于页面输出request       javax.servlet.http.HttpServletRequest       得到用户请求信息,response        javax.servlet.http.HttpServletResponse      服务器向客户端的回应信息config      javax.servlet.ServletConfig         服务器配置,可以取得初始化参数session       javax.servlet.http.HttpSession          用来保存用户的信息application    javax.servlet.ServletContext            所有用户的共享信息page       java.lang.Object                指当前页面转换后的Servlet类的实例pageContext javax.servlet.jsp.PageContext           JSP的页面容器exception       java.lang.Throwable         表示JSP页面所发生的异常,在错误页中才起作用若需要使用第九个内置对象,需要设置当前JSP为专业错误展示页面。   isEerrorPage="true";----------------------------------------------------pageContext对象    1. 获取其他八大内置对象   JspWriter getOut()          用于获取out隐式对象Object getPage()         用于获取page隐式对象ServletRequest getRequest()     用于获取request隐式对象ServletResponse getResponse()    用于获取response隐式对象HttpSession getSession()        用于获取session隐式对象Exception getException()     用于获取exception隐式对象ServletConfig getServletConfig()   用于获取config隐式对象ServletContext getServletContext()    用于获取application隐式对象操作其他域数据              void setAttribute(String name,Object value,int scope)   用于设置pageContext对象的属性Object getAttribute(String name,int scope)      用于获取pageContext对象的属性void removeAttribute(String name,int scope)     删除指定范围内名称为name的属性void removeAttribute(String name)          删除所有范围内名称为name的属性Object findAttribute(String name)          从4个域对象中查找名称为name的属性     //从小到大找:先寻找pageContext 再寻找request,再寻找session,最后寻找application  //只要能找到该键值对,立刻返回值,寻找停止    //如果找不到,就会返回null ${参数名}  替代了    pageContext.findAttribute(“参数名”);   PageContext.PAGE_SCOPE:      表示页面范围(pageContext)  PageContext.REQUEST_SCOPE:   表示请求范围(request)  PageContext.SESSION_SCOPE:   表示会话范围(session)  PageContext.APPLICATION_SCOPE:   表示Web应用程序范围(servletContext)2. 作为一个最小域对象使用(了解)out对象  JspWriter类的对象。 字符流对象。用于向响应体输出字符。他和response.getWriter.write("");   的区别是  后置后优先刷新到前者的缓冲区上方  之后jsp 会发前者的缓存区刷新进页面 所以会出现 后者的数据展示在前段 前者的数据展示的指定位置----------------------------------------------------JSP四大作用域       Servlet三大作用域:    ServletContext,HttpSession,HttpServletRequestJSP四大作用域:     application    session    request    pageContextPageScope   当前页面中有效     pageContext PageContextRequestScope 一次请求范围      request     HttpServletRequestSessionScope  一次会话范围      session     HttpSessionApplicationScope 应用范围            application ServletContextpage:  表示当前页,通常没用。jsp标签底层使用。
   request:表示一次请求。通常一次请求就一个页面,但如果使用请求转发,可以涉及多个页面。
   session: 表示一次会话。可以在多次请求之间共享数据。
   application:表示 一个web应用(项目)。可以整个web项目共享,多次会话共享数据。先尝试使用request域,若request域过小,再加大域范围,使用session;若session域过小,再加大域范围,使用application域------------------------------------------------------------------------------------------------------------------------------------------------------------------------------EL表达式     简述:   EL( Expression Language) 目的:为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更加简化 格式:由于 EL 可以简化 JSP 页面的书写,因此,在 JSP 的学习中,掌握 EL 是相当重要的。要使用 EL 表达式,首先要学习它的语法。 EL 表达式的语法非常简单,都是以“${”符号开始,以“}”符号结束的,具体格式如下:${表达式}   ${1+1}环境:必须写于 JSP 文件中, HTML 中无法使用 EL 表达式--------------------------------域对象数据读          基本数据类型/String               ${域容器中的 key名称}数组/List 集合(JavaWEB建议使用完整格式的泛型)        若索引越界,EL表达式内部有try catch处理,不会把异常抛出来,变为空字符串获取整个集合:        ${域容器中的 key名称}      获取索引为1的元素:   ${域容器中的 key名称[1]}Map        格式1: ${map集合.键名} 格式2(仅适用于特殊键名):${map集合[“键名”] }  格式3:${map集合.get(“键名”) } JavaBean        获取属性格式1: ${javaBean对象.属性名}获取属性格式2:    ${javaBean对象.getXxx()}调用自定义方法:   ${javaBean对象.方法名(参数)}方法的返回值,会被EL表达式使用 或 会被直接打印在页面上复合形式:   和java 一样    调用对象API     任意工具类,快速使用EL表达式:(若某个工具不能new,无法使用该方法) pageContext.setAttribute(“键名”,new 工具类());   ${键名.方法(参数)}数据运算            和java 一样    无论哪种运算符,运算结果都会直接展示页面 / 可以被其他表达式使用   empty运算符:如果判断为空,返回true   若非空,返回false       为空:  1.对象为null   2.字符串为""  3.集合长度为0 常见EL表达式对象      请求参数    param   获得一个参数 相当于request.getParameter()JSP上下文对象    pageContext pageContext的域对象  ${pageContext.request.contextPath} 用于获取项目名 例如:/day03cookie  cookie  用于获取cookie 格式:${cookie.cookie名.value} 例如:获取cookie名为username的值:${cookie.username.value}--------------------------------JSTL标签       使用              1、导入两个jar包2、若某个JSP需要使用核心标签,通过帮助导入进来(导报)If判断:<c:if>            test    if语句的布尔表达式。为true,进入if    为false,不进if    和EL表达式连用。If…elseif…else判断:<c:choose> 相当于if…else if…else结构:<c:choose><c:when test=””></c:when><c:otherwise></c:otherwise ></c:choose><c:choose> 声明当前位置,使用一个if…elseif…else结构<c:when> 必须位于c:choose中,相当于 if语句 / else if语句,可以写1个~多个<c:otherwise>必须位于c:choose中,相当于else语句,可以写0个~1个test   if语句的布尔表达式。为true,进入if    为false,不进if  和EL表达式连用。   和c:if的test是一样的增强for:<c:forEach>items   必有属性    需要遍历的数组/集合  和EL表达式连用var 必有属性每次遍历出来的元素,保存一个临时变量varStatus  遍历的状态变量.index 当前遍历的索引.count 当前遍历的次数.first   是否为第一次遍历.last   是否为最后一次遍历begin  循环从哪个索引开始end    循环到哪个索引结束step   每次循环完毕,索引加几。step默认为1遍历Map集合:keySet和entrySet   c:forEach 标签遍历Map集合时,底层使用的是entrySet,每遍历一个键值对,获取到该键值对对象Entry内部遍历时:${entry.key} 获取键                ${entry.value}获取值集合为空:<c:forEach>标签内会进行非空判断,若集合不存在,就不会进行任何遍历。(Java的增强for遍历null,会报异常)【建议:自己用c:if再前面做好非空判断】----------------------------------------------------------------------------------------------------------------------------------------------------------

JavaWEB笔记_3(web项目)

--------------------------------------------------------------------------------------------------------------------------登录 1. 登录2. 退出  3. 验证码4. 记住用户名 密码5. 记录用户上次登录时间6. 自动登录------------------------------------------------增  1.  单挑增加2. 批量增加删    1.  单挑删除2. 批量删除改    1. 基础修改(回显修改)查    1.  查询所有2. 模糊查询------------------------------------------------文件下载     下载:服务器---响应体---》浏览器英文文件名: 默认都是可以被请求到的(服务器都会通过响应体发给浏览器)中文文件名: 默认 tomcat无法直接访问到。返回404  解决方案:自己写一个专门处理中文文件名 下载的 servlet无论以下哪种情况,文件都是通过响应体 发送给 浏览器 若文件 浏览器可以直接打开,浏览器打开展示    若文件 浏览器无法直接打开,浏览器提供下载窗口toomcat服务器内部使用的是 iso-8859-1       解码上传文件名乱码解决: new String("乱码".getBytes("iso8859-1"),"utf-8");让浏览器强制弹出下载窗口   响应头: Content-Disposition:attachement;filename=文件名(该文件名 就是下载框体中默认显示的文件名) 注意:必须放在响应体操作之前。浏览器解码时:utf-8解码 响应头进行编码时,默认进行iso8859-1       解决方案: 1、响应头编码改为utf-8 2、根据浏览器的不同,使用工具代码将数据进行UTF-8编码后写出到响应头URL编码------------------------------------------------验证码 生成验证码图片,展示在登录表单中为了加快浏览器访问速度   相同的访问路径,一般会在浏览器上留下缓存。    浏览器检测到访问路径没有发生改变,会要求浏览器使用缓存展示,而不会去请求服务器1、浏览器设置,不用缓存(不可能给所有用户都设置)    2、跳过缓存:只要让每次的访问路径不完全相同。------------------------------------------------权限校验  ------------------------------------------------购物车--------------------------------------------------------------------------------------------------------------------------

Servlet

Servlet就是运行在web服务器上的java小程序 本质就是一个java类,一个类要想通过浏览器被访问到,那么这个类必须直接或间接实现Servletr接口作用        1.接收浏览器请求2.处理请求3.相应请求Servlet1.实现servlet接口,重写servlet方法2.编写配置文件    注册serlvet   绑定路径3.测试    协议 ip :端口 项目名称/绑定路径
========================================================================Servlet3.0:注解方式实现1.编写一个类实现servlet接口重写Service(request,response)方法2.在servlet类上添加  @WebServlet(name = "Demo" ,urlPatterns = "/demo")name: 起名称urlPatterns: 访问路径
========================================================================Servlet2.5:1.编写一个类实现servlet接口重写Service(request,response)方法2.编写配置文件(web.xml)注册servlet绑定路径<!--a.注册我们的servlet--><servlet><!-- 给我们的servlet起名称 --><servlet-name>ServletDemo1</servlet-name><!-- 告诉tomcat我们的servlet所在路径  全限定名(包名+类名) --><servlet-class>com.itheima.servlet.ServletDemo1</servlet-class></servlet><!--b.为我们的servlet提供访问路径--><servlet-mapping><servlet-name>ServletDemo1</servlet-name><!-- 设置浏览器访问的路径 路径自定义 --><url-pattern>/demo1</url-pattern></servlet-mapping>3.测试http://localhost:8080/项目名称/绑定路径
========================================================================Servlet:接口(掌握★)`init`:初始化 (掌握★) service :提供服务(掌握★)`destroy`:销毁(理解)`getServletConfig`():获取当前Servlet的配置对象(了解)`getServletInfo`():获取Servlet信息========================================================================Servlet 接口:GenericServlet 抽象类:HttpServlet 抽象类:最终实现方式: 继承HttpServlet,重写doGet 和 doPost 方法

Tomcat笔记


---------------------------------------web 服务器  用于发布资源接受请求  在处理请求之前 将请求 对象化 Request        响应请求 在处理响应之前 将响应 对象话 ResponseWindows下部署不能有中文目录Tomcat需要java环境   需要配置环境变量---------------------------------------网络协议三要素  ip  协议(tcp 三次握手安全  utp 速度快 不安全  ssh安全外壳协议)  端口Tomcat(Web服务器软件)    浏览器访问 通过 ip  端口协议  -----   访问 服务器中的 tomcat  . tomcat 在访问 项目资源tomcat整合IDEA       1. 下载tomcat  在IDEA中 配置Tomcat路径  以及其他环境参数  jre 默认访问路径 浏览器等2. 配置javaWEB项目  配置访问路径3. 浏览器测试访问(启动后 Idea 回将tomcat的核心配置文件 复制一份 到IDEA指定目录中(相当于一共新的简化tomcat  这个目录是IDEA自动生            成的很难改)  (目的是Idea运行web项目不影响本地tomcat) )   (tomcat会自动将 加载 web文件中的所有    web文件名被项目名替代 , src下的calss文件会放到web下 WEB-INF下)tomcat项目部署  3种方式        1.直接部署在tomcat本地webapps下2.修改server.xml配置文件 指定访问目录3.配置独立的xml文件(无需重启服务 自动加载和卸载项目)(第三种方式最多 IDEA也是采用此方式)Tomcat基础Tomcat架构Tomcat服务器配置Tomcat  jsp引擎  JasperWeb应用配置Tomcat管理配置JVM配置Tomcat集群Tomcat安全Tomcat性能调优Tomcat附件功能

总结

以上便是JavaWeb核心技术学习笔记 ,喜欢的小伙伴欢迎一键三连!!!
我是manor,一枚相信技术改变世界的码农,我们下期再见~

[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记相关推荐

  1. 一万六千字的MySQL数据库操作详细教学,看完别说你不会

    1.做测试为什么需要学习数据库? (1)只有会数据库操作,才能更全面准确的开展功能测试: (2)测试环境搭建:web系统里有数据库,你就必须会数据库,从而搭建好环境,开展测试: (3)为性能测试做准备 ...

  2. 三万六千字通关MySQL面试

    本文作者:ThinkWon,感谢提供这么详细的资源. 数据库基础知识 为什么要使用数据库 数据保存在内存 优点:存取速度快 缺点:数据不能永久保存 数据保存在文件 优点:数据永久保存 缺点:1)速度比 ...

  3. hashmap取值_一万六千字的HashMap深度剖析

    概论 HashMap 是无论在工作还是面试中都非常常见常考的数据结构.比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache ...

  4. 大学毕业论文字数有上限吗,我写了一万六千字,指导老师让我删掉一万字关键第二天就要交,怎么办?...

    毕业论文的字数是有学校规定限制的,一般本科的字数为8000-12000字, 也有一些学校的字数要求是2万以上,不同学校的要求不同,建议你下载下 本校的毕业写作规范,上面会有明细的要求,包括写多少字,查 ...

  5. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

  6. 华为澄清:公司副总裁未发表中美技术还差两万五千里表述

    近日,自媒体文章<华为副总裁:我们与美国技术还差两万五千里>传出,文中提到华为公司董事.高级副总裁陈黎芳,近日在华为新员工座谈会上讲话说到"经过我们这30年奋力追赶,我们与美国距 ...

  7. 从两万七千个切片构建虚拟人类:人体数字化的今天与未来

    人体究竟有多奇妙? 在4.5平方米的皮肤下,我们拥有300万个汗腺,1600万个毛囊.我们的心脏如同永动机一样,不断地收缩舒张运送血液. 我们知道学界一直致力于大脑数字化的研究,那么人体的数字化是否同 ...

  8. 转发——————《黄金问题3---一万五千字教你如何全面爱护你的膝盖》(正文+1楼回复必看)...

    <黄金问题3---一万五千字教你如何全面爱护你的膝盖>(正文+1楼回复必看)  由 mathiasych 发表在 虎扑篮球· 健身和运动健康 http://bbs.hupu.com/fit ...

  9. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 前置知识:小学生都能看懂的群论从入门到升天教程 <群论全家桶> 一道简单的题目 Probl ...

最新文章

  1. 网络编程学习笔记(Unix域套接口地址)
  2. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...
  3. linux安装mysql不成功怎么处理_Linux上安装MySQL时出现不兼容的解决办法
  4. 前端学习(2739):重读vue电商网站49之第三方库使用CDN
  5. Squid优化完全手册(2)
  6. 蓝桥杯 ALGO-145 算法训练 4-1打印下述图形
  7. Windows Server2016+SQL Server 2016 Cluster安装及配置
  8. 常量表达式(constexpr)
  9. 技术帝出没:对做梦推的强力回复们
  10. (生物信息学)R语言与统计学入门(四)——Fisher检验
  11. Java 读取Word标题(目录)
  12. Android 工程打包资源文件-OBB文件设置
  13. 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】
  14. 说说部署网站的奇葩事
  15. java 动态规划找零钱_动态规划之找零钱问题
  16. Maven命令之--mvn help:system
  17. 【Ansys Workbench】—优化设计简介
  18. 四维图新地图坐标_四维图新:工信部商请公司提供电子地图相关数据
  19. SAS:主成分分析(Principal Component Analysis,PCA)
  20. 三层架构:表示层——业务逻辑层——数据访问层

热门文章

  1. 网页打印之分页打印,去掉页码
  2. 3.2.1 ai and machine learning for coders Laurence Moroney 学习笔记(三)chapter3-检测图像中的特征-3.2 建立CNN区分人和马
  3. java178-终篇?静态代理?动态代理?
  4. 基于阿里云MQTT物联网平台视频监控
  5. 服务器的地址信息,服务器地址信息
  6. 腾讯音乐、Spotify站上新起跑线
  7. python安装flask框架_Python Flask框架的安装
  8. 词向量表示和句向量、文章向量计算方法
  9. java 随机生成简体汉字_Java代码实现随机生成汉字的方法|chu
  10. 二进制安装mysql及MySQL增删改查