Web基础(Java前端基础)

Web基础(Java前端基础)

2023年6月27日发(作者:)

Web基础(Java前端基础)1、Javaweb1.1 基本概念web开发:web,代表⽹页(⽹站)的意思,静态web:列如静态web页⾯设计使⽤的:html,css。静态web性质:提供给所有⼈看的数据始终不会发⽣变化。动态web⽐如:淘宝、⽹易云、⼏乎所有的⽹站都使⽤动态web。它提供给所有⼈看到的数据始终会发⽣变化,每个⼈在不同的时间,不同的地点看到的信息各不相同。技术栈:Servlet/JSP,ASP,PHP。在Java中,动态web资源开发的技术称为Javaweb。1.2 web应⽤程序web应⽤程序:可以提供浏览器访问的程序:、.....多个web资源,这些web资源可以被外界访问,对外界提供服务。我们所访问的任何⼀个页⾯或者资源,都存在这个世界的某⼀个⾓落的计算机上。URL:在WWW上,每⼀信息资源都有统⼀的且在⽹上唯⼀的地址。地址就叫URL。这个统⼀的web资源会被放在同⼀个⽂件夹下,web应⽤程序—>Tomcat:服务器⼀个web应⽤由多部份组成(⽐如:静态web,动态web)Web组成:前端:html,css,js技术:jsp,servletJava程序jar包配置⽂件(Properties)Web应⽤程序编写完毕后,若想提供给外界访问,需要⼀个服务器来统⼀管理。 1.3 静态web*.htm,*html,这些都是⽹页的后缀,如果服务器上⼀直存在这些东西,我们就可以直接进⾏读取,通络。概念图:静态web存在的缺点:1、web页⾯⽆法动态的更新,所有⽤户看到的都是同⼀个页⾯。2、它⽆法和数据库交互(数据库⽆法持久化,⽤户⽆法交互)Javascript:Javascript中的轮播图,点击特效:就是伪动态页⾯。Javascript:在实际开发中,它⽤的最多。SBScript 1.4 动态web页⾯会动态的展⽰:web的页⾯展⽰的效果因⼈⽽异。概念图:客户端连接到服务器:服务器中有⼀个专门处理的web,这个web可以动态的连接资源(这个资源是连接到数据库的)这个动态web资源在连接到⼀个WebServer(Server连接着我们的硬盘:⽐如C盘、D盘也叫做⽂件系统)通过Server响应我们的客户端。动态web缺点:加⼊服务器的动态web资源如果出现了错误,我们需要重新编写我们的后台程序,重新发布。(就是常见的:停机维护)优点:1、web页⾯可以动态更新,所有⽤户看到的不是同⼀个页⾯。2、它可以与⽤户交互(数据持久化:注册,商品信息,⽤户信息...)2、web服务器Web服务器⼀般指⽹站服务器,是指驻留于因特⽹上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置⽹站⽂件,让全世界浏览;可以放置数据⽂件,让全世界下载。⽬前最主流的三个Web服务器是Apache、 Nginx 、IIS。2.1 技术讲解1、ASP:(动态服务器页⾯)ASP它是微软的:ASP也是国内最早流⾏的。它在HTML中嵌⼊了VB的脚本,ASP+COM。在ASP开发中,基本⼀个页⾯都有⼏千⾏业务代码,页⾯及其让⼈眼花缭乱。ASP的维护成本⾼。2、PHP:(超⽂本预处理器)PHP专门开发web(前端)的软件。优点:开发速度很快,功能很强⼤,可以跨平台操作,代码也很简单。(在我国70%的都是中⼩型⽹站,WP是⼀个开源的博客引擎,也可以去做⼀些⽹站)缺点:⽆法乘载⼤访问量的情况(有局限性)3、JSP/Servlet:B/S:Browser/Server,浏览器和服务器模式。C/S:Client-Server,客户端和服务器。sun公司主推的B/S架构。基于Java语⾔的(所有的⼤公司,或者⼀些开源的组件,都是⽤Java写的)它的语法像ASP:⽽学ASP的⼈就可以⽅便的转JSP。(加强市场的竞争度)优点:可以乘载三⾼问题带来的影响。(三⾼:⾼并发,⾼可⽤,⾼性能)2.2 web服务器服务器就是⼀种被动的操作,⽤来处理⽤户的⼀些请求和给⽤户⼀些响应信息。1、IIS:IIS是微软的:ASP是本⼟的,也是Windows中⾃带的服务。2、Tomcat图⽚:⾯向百度了解Tomcat:Tomcat是Apache 软件基⾦会(Apache Software Foundation)的Jakarta 项⽬中的⼀个核⼼项⽬,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,⽽且免费,因⽽深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为⽐较流⾏的Web 应⽤服务器。Tomcat 服务器是⼀个免费的开放源代码的Web 应⽤服务器,属于轻量级应⽤,在中⼩型系统和并发访问⽤户不是很多的场合下被普遍使⽤,是开发和调试JSP 程序的⾸选。对于⼀个Java初学web的⼈来说,它是最佳的选择。⽽Tomcat 实际上运⾏JSP 页⾯和Servlet。Tomcat最新版本为10.0.52.3 下载模板适⽤于所有下载软件。列如下载tmocat模板:1、安装 or 解压。2、了解配置⽂件及⽬录结构。3、了解下载的这个东西的作⽤。3、Tomcat3.1 Tomcat安装tomcat官⽹:下载:

3.2 Tomcat启动和配置

⽂件夹作⽤: 3.3 启动和关闭Tomcat1、进⼊bin⽂件找到开启:Tomcat默认端⼝号: 2、配置环境变量(可选)4、Http超⽂本传输协议(Hyper Text Transfer Protocol,HTTP)是⼀个简单的请求-响应协议,它通常运⾏在TCP(协议)之上。4.1 什么是HTTPHTTP(超⽂本传输协议)是⼀个简单的请求-响应协议,通常运⾏在TCP之上。常见的⽂本:html,字符串,....常见的超⽂本:图⽚、⾳乐、视频、定位、地球......http端⼝:80Https:是安全的Https端⼝:4434.2 Http的两个时代http1.0:HTTP/1.0:客户端可以与web服务器连接后,只能获得⼀个web资源。在请求过程中,请求不到就会断开连接。http2.0:HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。4.3 Http请求请求过程:客户端—>发请求(Request)—>服务器—>百度—控制台-⽹络: 1、请求⾏请求⾏中的请求⽅式:GET请求⽅式:Get,Post,列如hml中的:HEAD,DELETE,Get:请求能够携带的参数⽐较少,⼤⼩会限制,会在浏览器的URL地址栏显⽰数据内容,不安全,但是⾼效。Post:请求能够携带的参数没有限制,⼤⼩没有限制,不会在浏览器的URL地址栏显⽰数据内容,安全,但是不⾼效。2、消息头12345Accept:text/htmlAccept-Encoding:gzip,deflate,brAccept-Language:zh-CN,zh:q=0.9 语⾔Cache-Control:max-age=0Connection:keep-alive123456Accept: // 告诉浏览器,它所⽀持的数据类型Accept-Encoding: // ⽀持哪种编码格式 列如:GBK,UTF-8,GB2312,ISO8859-1Accept-Language: // 告诉浏览器,它的语⾔环境Cache-Control: // 缓存控制Connection: // 告诉浏览器,请求完成是断开还是保持连接Host: // 主机 4.4 Http响应响应过程:服务器—>响应—>客户端—>百度—>控制台—>⽹络:1234Cache-Control:private // 缓存控制Connection:keep-Alive // 连接Content-Encoding:gzip // 编码Content-Type:texr/html // 类型1、响应体

12345678Accept: // 告诉浏览器,它所⽀持的数据类型Accept-Encoding: // ⽀持哪种编码格式 列如:GBK,UTF-8,GB2312,ISO8859-1Accept-Language: // 告诉浏览器,它的语⾔环境Cache-Control: // 缓存控制Connection: // 告诉浏览器,请求完成是断开还是保持连接Host: // 主机Refresh: // 告诉客户端,多刷新⼀次Location: // 让⽹页重新定位2、响应状态码

200:请求响应成功。 常见的:2003xx:请求重定向。重定向的意思是:重新定位到我给你设置的位置上。4xx:找不到资源。 常见的:404意思是资源不存在,找不到该资源。5xx:服务器代码错误。 常见的:500 502:⽹关错误。5、Maven我为什么要学这个技术?1、在Javaweb开发中,需要使⽤⼤量的jar包,⽽这个jar包需要我们⼿动去导⼊。2、如何能够让⼀个东西⾃动帮我导⼊和配置这个jar包。Maven可以:由此,Maven诞⽣了!5.1 Maven(项⽬架构管理⼯具)我们⽬前就是⽤Maven来⽅便导⼊jar包的。Maven的核⼼思想:约定⼤于配置。什么意思呢?maven中有约束,你不要去违反它的约束。Maven会规定好你该如何去编写我们的Java代码,必须要按照这个规范来。5.2 下载安装Maven官⽹:我下载的是Mavne3.6.3版本 下载后解压即可。5.3 配置环境变量在我们的系统环境变量中进⾏如下配置:M2_HOME :maven⽬录下的bin⽬录MAVEN_HOME:maven的⽬录在系统的path中配置:%MAVEN_HOME%bin最后在命令提⽰符中输⼊mvn -version测试Maven是否成功安装成功。保证必须确定配置完毕。5.4 阿⾥云镜像在apache-maven-3.6.3conf⽬录下的中配置阿⾥云镜像代码。镜像:mirrors作⽤:加速我们的下载。国内建议使⽤阿⾥云的镜像。代码:123456 alimaven central aliyun maven/nexus/content/groups/public5.5本地仓库1、在本地的仓库。2、远程的仓库。在apache-maven-3.8.4conf下的中建⽴⼀个本地仓库:localRepository。 C:UsersleiDesktopjavaapache-maven-3.6.3maven-repors⽤户Desktopjavaapache-maven-3.8.4maven-repo5.6 在IDEA中使⽤Maven1、可选设置 5.7 创建⼀个普通的Maven项⽬ 项⽬结构:

使⽤Web应⽤如果没有以下两个⽂件夹就新建两个⽂件夹-Java和resources。 5.8 在idea中标记⽂件夹功能⽅法⼀: ⽅法⼆: 5.9 在IDEA中配置Tomcat 解决错误: 5.10 pom⽂件是Maven的核⼼配置⽂件。介绍(代码介绍):829363738394041 4.0.0 e maven01 1.0-SNAPSHOT war

maven01 Maven Webapp UTF-8 <>1.7 <>1.7 junit junit 4.11 test 导⼊jar包 maven由于它的约定⼤于配置,我们之后可能遇到我们写的配置⽂件,⽆法被导出或者⽣效的问题。解决⽅案:在build中配置resources,来防⽌我们资源导出失败的问题。1718192021 src/main/resources **/*.properties **/*.xml false src/main/java **/*.properties **/*.xml false 5.11 IDEA操作1、maven仓库的使⽤地址:在maven⽬录的lib下找到这两个jar包,在地址中去搜索(搜索到的:⼀般⽤⼈数使⽤最多的那个) 6、Servlet写servlet前简单说下Servlet的⽣命周期。servlet的⽣命周期就是从创建到毁灭的过程:Servlet 初始化后调⽤ init () ⽅法。Servlet 调⽤ service() ⽅法来处理客户端的请求。Servlet 销毁前调⽤ destroy() ⽅法。最后,Servlet 是由 JVM 的垃圾回收器进⾏垃圾回收的。 我们⽬前最新的xml:123456789

6.1 Servlet简介Servlet就是sun公司开发动态web的⼀门技术。Sun在这些API中提供⼀个接⼝叫做:Servlet,如果你下开发⼀个Servlet程序,只需要完成两个⼩步骤:1、编写⼀个类,实现Servlet接⼝。2、把开发好的Java类部署到web服务器中。我们把实现了Servlet接⼝的Java程序叫做,Servlet。6.2 HelloServletServlet接⼝Sun公司有两个默认的实现类:HttpServlet,GenericServlet1、构建⼀个普通的Maven项⽬,删掉⾥⾯的src⽬录,我们的学习就在这个项⽬⾥⾯建⽴Moudel:这个空的⼯程就是Maven主⼯程。2、关于Maven⽗⼦⼯程的理解:⽗项⽬中会有:123 servlet-02 ⼦项⽬中会有:12345 javaweb-03-maven e 1.0-SNAPSHOT ⽗项⽬中的Java⼦项⽬可以直接使⽤:相当于⼦项⽬继承了⽗项⽬所有,⽐如导⼊的依赖。3、Maven环境优化1.修改为最新标签。2.将maven的结构搭建完整4、编写⼀个Servlet程序1.编写⼀个普通类。2.实现Servlet接⼝,这⾥我们直接继承HttpServlet。111213public class HelloServlet extends HttpServlet{ // 由于get,post只是请求实现的不同的⽅式,可以相互调⽤,因为业务逻辑都⼀样。 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = ter(); // 响应流 ("hello,servlet"); }

@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}5、编写Servlet的映射为什么需要映射?我们写的是Java程序,但是要通过浏览器访问,⽽浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需给他⼀个浏览器能够访问的路径: hello ervlet hello hello 6、配置Tomcat:注意:配置项⽬发布的路径。7、启动测试。6.3 Servlet运⾏原理Servlet是由web服务器调⽤,web服务器在接收浏览器请求后会: 6.4 mapping问题1、1个Servlet可以指定⼀个映射路径。12345 hello /hello 2、1个Servlet可以指定多个映射路径。111213 hello /hello hello /hello1 hello /hello2 3、1个Servlet可以指定通⽤映射路径。12345 hello /hello/* 4、默认请求。12345 hello /* 5、可以指定⼀些后缀或前缀等等....123456 hello *.zhangsan 6、mapping优先级问题指定了固有的映射路径优先级最⾼,如果找不到就会⾛默认的处理请求。123456789 error ervlet error /* 6.5 ServletContextweb容器在启动的时候,它会为每个web程序都创建⼀个对应的ServletContext对象,它代表了当前的web应⽤。1、共享数据我在这个Servlet中保存的数据,可以在另⼀个 Servlet中拿到。解释:在⽂件中设置张三的名字,通过GetServlet拿到,并在其中设置编码格式和⽂本格式,访问hello,通过hello拿到username时,在去访问get,拿到hello结果,和打印出⾃⼰的结果。11121314public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// tParameter(); 初始化参数// vletConfig(); Servlet配置// vletContext(); Servlet上下⽂ ServletContext context = vletContext(); String username = "张三"; // 数据 ribute("username",username); // 将⼀个数据保存在了ServletContext中,名字为:username,值为,username

n("hello"); }}1718public class GetServlet extends HttpServlet {

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = vletContext(); String username = (String) ribute("username");

tentType("text/html"); racterEncoding("utf-8"); ter().print("名字:"+username);

}

@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}}配置映射路径: 17 hello ervlet hello /hello

getc vlet getc /getc 测试访问结果。2、获取初始化参数12345 url jdbc:mysql://localhost:3306/mybatis 1234567 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = vletContext();

String url = tParameter("url"); ter().print(url); }3、请求转发123456789 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

ServletContext context = vletContext(); n("进⼊了ServletDemo04");// RequestDispatcher requestDispatcher = uestDispatcher("/gp"); // 转发的请求路径// d(rep,resp);// 调⽤forward实现请求转发 uestDispatcher("/gp").forward(req,resp); }概念图:上⾯的是请求转发过程。下⾯的是重定向过程。 4、读取项⽬⽂件Properties1、在Java⽬录下新建Properties2、在resources⽬录下新建Properties发现:都被打包到了同⼀个路径下,这个路径就是class路径。我们俗称classpath。思路:需要⼀个⽂件流。测试返回结果:通过类来找到⽂件,获取值。12username=root123123password=123456asdadaspublic class ServletDemo05 extends HelloServlet{

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = vletContext().getResourceAsStream("/WEB-INF/classes/com/lei/servlet/ties"); Properties prop = new Properties(); (is); String user = perty("username"); String pwd = perty("password");

ter().print(user+":"+pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }}访问测试结果ok。6.6 HttpServletResponseweb服务器接收到客户端的http请求,针对这个请求,分别创建⼀个代表请求的HttpServletRequest对象,代表响应的⼀个HttpServletResponse对象。如果要获取客户端请求过来的参数:找到HttpServletRequest如果要给客户端响应⼀些信息:HttpServletResponse1、简单分类 下载⽂件

(1)负责向浏览器发送数据的⽅法。(2)负责向浏览器发送响应头的⽅法。(3)响应的状态码。2、常见应⽤向浏览器输出消息。下载⽂件:1.要获取下载⽂件的路径。2.下载的⽂件名叫什么?3.设置想办法让浏览器能够⽀持下载我们需要的东西。4.获取下载⽂件的输⼊流。5.创建缓冲区。6.获取OutputStream。7.将FileOutputStream流写⼊到buffer缓冲区。8.使⽤OutputStream将缓冲区中的数据输出到客户端!⽂件下载案例82930public class FileServlet extends HttpServlet {

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.要获取下载⽂件的路径。 String realPath = "C:UsersleiIdeaProjectsjavaweb-03-mavenresponessrcmainresources张三.png"; n("下载⽂件的路径:"+realPath);// 2.下载的⽂件名叫什么? String fileName = ing(dexOf("") + 1);// 3.设置想办法让浏览器能够⽀持下载我们需要的东西。中⽂⽂件名,让去编码,否则有可能乱码 der("Content-Disposition","attachment;filename="+ (fileName,"utf-8"));// 4.获取下载⽂件的输⼊流。 FileInputStream in = new FileInputStream(realPath);// 5.创建缓冲区。 int len = 0; byte[] buffer = new byte[1024];// 6.获取OutputStream。 ServletOutputStream out = putStream();// 7.将FileOutputStream流写⼊到buffer缓冲区。使⽤OutputStream将缓冲区中的数据输出到客户端! while((len=(buffer))>0){ (buffer,0,len); } (); (); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}}3、验证码功能代码实例(通过映射,进⼊URL显⽰结果)829363738394647public class ImageServlet extends HttpServlet {

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 如何让浏览器五秒⾃动刷新⼀次 der("refresh","3");

// 在内存中创建图⽚ BufferedImage image = new BufferedImage(80,20,_INT_RGB);

// 得到图⽚ Graphics2D g = (Graphics2D)phics(); // 笔 // 设置图⽚的背景颜⾊ or(); ct(0,0,80,20); // 给图⽚写数据 or(); t(new Font(null,,20)); ring(makeNum(),0,20);

// 告诉浏览器这个请求⽤图⽚的⽅式打开 tentType("image/png"); // ⽹站存在缓存,不然浏览器缓存 eHeader("expires",1); der("Cache-Control","no-cache"); der("Pragma","no-cache");

// 把图⽚写给浏览器 boolean write = (image,"jpg", putStream()); } // ⽣产随机数 private String makeNum(){ Random random = new Random(); String num = t(99999999) + ""; StringBuffer sb = new StringBuffer(); for (int i = 0; i <(); i++) { ("0"); } String s = ng() + num; return num; }

@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}}4、实现重定向B⼀个web资源收到A客户端请求后,他会通知A客户端去访问另外⼀个web资源C,这个过程叫做重定向。重定向⽅法: void sendRedirect(String var1) throws IOException;原理图: 重定向测试:12345 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

direct("/r/img"); }使⽤重定向的时候可能会404找不到资源问题:解决404: direct(textPath()+"/"); // 404解决⽅法,找不到路径5、说说重定向和转发的区别相同的⼀点:页⾯都会实现跳转。不同点:请求转发的时候,url不会产⽣变化。重定向的时候,url地址栏会发⽣变化。6.7 HttpServletRequestHttpServletRequest代表客户端的请求,⽤户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过HttpServletRequest的⽅法,可以获得客户端的所有信息。1、获取前端传递的参数和请求转发

⼀个返回字符串类型,⼀个返回数组类型。 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = ameter("username"); String password = ameter("password"); String[] hobbys = ameterValues("hobbys");

n("========================"); n(username); n(password); n(ng(hobbys)); n("========================");

// 通过请求转发 // /代表当前的web应⽤ uestDispatcher("/").forward(req,resp); }7、Cookie、Session7.1 Cookie、SessionCookie、Session(英⽂翻译为:⼩饼⼲、会话)会话:⽤户打开⼀个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话,有状态会话:⼀个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态的会话。列如:⼀个⽹站,怎么证明你来过?客户端 服务端1.服务端给客户端⼀个信件,客户端下次访问服务端带上信件就可以了:cookie2.服务器知道你来过了,下次你来的时候我来匹配你:session 7.2 保存会话的两种技术cookie:客户端技术(响应,请求)session:服务器技术,利⽤这个技术,可以保存⽤户的会话信息,我们可以把信息或数据放在session中。常见的:⽹站登录之后,你下次就不⽤再登录了,第⼆次访问直接就登上去了。可能会遇到的Java错误:7.3 Cookie

客户端可以使⽤多个请求,⽽这些请求都发往服务器,在服务器返回给客户端的时候会带上cookie。1、从请求中拿到cookie信息。2、服务器响应给客户端cookie。⽤到的⽅法:⼀个⽹站Cookie是否存在上线?⼀个Cookie只能保存⼀个信息。⼀个web站点可以给浏览器发送多个Cookie,但是最多只能放20个Cookie。Cookie⼤⼩有限制:4kb。300个Cookie,浏览器上限。删除Cookie:不设置有效期,关闭浏览器,⾃动失效。设置有效期为0。设置Cookie为0代码:12345678 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 创建⼀个Cookie,名字必须要和删除的名字⼀致 Cookie cookie = new Cookie("LastLoginTime",tTimeMillis()+""); // Cookie有效期为0 Age(0); kie(cookie); }7.4 SessionSession⽤法⼀:使⽤Session:客户端对服务器发送请求的时候,会有⼀个登记SessionID的,这个ID是唯⼀的,也是我们⽤户拿到的,⽽这个服务器中的Session可以存东西。

什么是Session?服务器会给每⼀个⽤户(浏览器)创建⼀个Session对象。⼀个Session独占⼀个浏览器,只要浏览器没有关闭,这个Session就存在。⽤户登录之后,整个⽹站它都可以访问。作⽤:保存⽤户的信息。列如:保存blbl的观看记录。Session和Cookie的区别:Cookie是把⽤户的数据写给⽤户的浏览器,浏览器保存(可以存多个)Session把⽤户的数据写道⽤户独占Session中,服务器保存(保存重要的信息,减少服务器资源的浪费)Session对象由服务器创建Session使⽤场景:保存⼀个登录⽤户的信息购物车信息在整个⽹站中经常会使⽤的数据,我们将它保存在Session中 1. 使⽤Session:1718192public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 解决乱码问题 racterEncoding("GBK"); racterEncoding("GBK"); tentType("text/html;charset=utf-8");

// 得到session HttpSession session = sion();

// 给session中存东西 ribute("name",new Person("张三",18));

// 获取session的id String sessionid = ();

// 判断session是不是新创建的 if (()){ ter().write("session创建成功,ID为:"+sessionid); }else { ter().write("session已经存在服务器中,ID为:"+sessionid); } }}2. 得到Session:17public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 解决乱码问题 racterEncoding("GBK"); racterEncoding("GBK"); tentType("text/html;charset=utf-8");

// 得到session HttpSession session = sion();

Person person = (Person)ribute("name");

n(ng());

}}3. 注销Session:123456789public class SessionDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = sion(); Attribute("name"); // ⼿动注销Session date(); }}4. 设置会话⾃动过期:在中配置Session⽤法⼆:web容器在启动的时候,它会为每个web程序都创建⼀个对应的ServletContext对象,它代表了当前的web应⽤。通过ServletContext对象获取信息。8、JSPJSP(全称JavaServer Pages)是由[Sun Microsystems]( Microsystems)公司主导创建的⼀种标准。8.1 什么是JSPJSP(全称JavaServer Pages):Java服务器端页⾯,也和servlet⼀样,⽤于动态web技术。最⼤的特点:写JSP就像在写HTML与HTML的区别:HTML只给⽤户提供静态的数据。JSP页⾯中可以嵌⼊Java代码,为⽤户提供动态数据。8.2 JSP原理

思路:JSP到底怎么执⾏的代码层⾯没有任何问题。服务器内部⼯作:tomcat中只有⼀个work⽬录。IDEA中使⽤Tomcat的会在IDEA的tomcat中⽣产⼀个work⽬录。JSP:我的电脑地址:C:Users⽤户Desktopjavaapache-tomcat-10.0.14workCatalinalocalhostROOTorgapachejsp会发现页⾯转变成了Java程序。JSP原理:浏览器向服务器发送请求,不管访问什么资源,其实都是在访问ServletJSP最终也会被转化成⼀个Java类。JSP本质上就是⼀个Servlet。源码⽅法:12345678// 初始化public void _jspInit() { }// 销毁 public void _jspDestroy() { }// JSPService public void _jspService(HttpServletRequest request, HttpServletResponse response)JSP原理图:在JSP页⾯中:只要是Java代码就会原封不动的输出。如果是HTML代码,就会被转化为:("rn");这样的格式,输出到前端。8.3 JSP基础语法任何语⾔都有⾃⼰的语法,Java中有,JSP作为Java技术的⼀种应⽤,它有⾃⼰的扩充的语法。Java所有语法都⽀持。EL表达式:${ }作⽤:1、获取数据2、执⾏运算3、获取web开发的常⽤对象1234567<%--使⽤EL表达式输出 ${}--%>

取出的值为:

${name1}

${name2}

${name3}

${name4}

${name5}

JSP表达式12345<%-- jsp表达式作⽤:⽤来将程序的输出,输出到客户端<%= 变量或表达式%>--%><%= new ()%>jsp脚本⽚段123456789
<%--jsp脚本 ⽚段--%><% int sum = 0; for (int i = 1; i < 100; i++) { sum += i; } n("

Sum="+sum+"

");%>脚本⽚段的再实现jsp声明11<%! static { n("Loading Servlet!"); }

private int globalVal = 0; public void lei(){ n("进⼊了⽅法lei!");

}%>JSP声明:会被编译到JSP⽣成的Java的类中!其他的,就会被⽣成到_jspServlet⽅法中!在JSP,嵌⼊Java代码即可!注释:JSP的注释不会在客户端显⽰。HTML的注释会在客户端显⽰。JSP指令拼接前端页⾯:

8.4 JSP九⼤内置对象PageContext 作⽤:存东西Request 作⽤:存东西ResponseSession 作⽤:存东西Application [ ServletContext ] 作⽤:存东西config [ ServletConfig ]outpageexception存信息的四⼤内置对象:ribute("name1","张三1号"):保存的数据只在⼀个页⾯中有效。ribute("name2","张三2号"):保存的数据只在⼀次请求中有效,请求转发会携带这个数据。ribute("name3","张三3号"):保存的数据只在⼀次会话中有效,从打开浏览器到关闭浏览器。 ribute("name4","张三4号"):保存的数据只在服务器中有效,从打开服务器到关闭服务器。8293031323334<%--内置对象--%><% ribute("name1","张三1号"); // 保存的数据只在⼀个页⾯中有效 ribute("name2","张三2号"); // 保存的数据只在⼀次请求中有效,请求转发会携带这个数据 ribute("name3","张三3号"); // 保存的数据只在⼀次会话中有效,从打开浏览器到关闭浏览器 ribute("name4","张三4号"); // 保存的数据只在服务器中有效,从打开服务器到关闭服务器%>

<%--脚本⽚段代码,会被原封不动的⽣成到.要求:这⾥⾯的代码必须保证Java语法的正确性--%><%// 通过pageContext来取出我们保存的值,我们通过寻找的⽅式 // 寻找⽅式的作⽤域:从底层到⾼层(作⽤域) String name1 = (String)tribute("name1"); String name2 = (String)tribute("name2"); String name3 = (String)tribute("name3"); String name4 = (String)tribute("name4"); String name5 = (String)tribute("name5"); // 不存在

%><%--使⽤EL表达式输出 ${}--%>

取出的值为:

${name1}

${name2}

${name3}

${name4}

<%= name5%>>

// 转发<% d("/");%>8.5 JSP标签、JSTL标签、EL表达式使⽤JSTL和EL需要导⼊的包:1112 jstl-api 1.2 taglibs standard 1.1.2 jsp标签: JSTL表达式使⽤前需要导⼊核⼼标签:JSTL标签库的使⽤就是为了弥补HTML标签的不⾜,它⾃定义许多标签,可以供我们使⽤,标签的功能和Java代码⼀样。具体使⽤: JSTL核⼼标签:(1)

<%--定义⼀个变量为score,它的值为85--%>

你真棒 不错的 继续努⼒ 认真学习

(2)

<% ArrayList people = new ArrayList<>(); (0,"张三"); (1,"李四"); (2,"赵五"); (3,"王六"); (4,"三七"); ribute("list",people);%>

<%-- var:每⼀次遍历出来的变量 items:要遍历的对象 begin:从哪个下标开始 end:到哪个下标结束 step:步长,⼀次⾛⼏个元素--%>

JSTL标签库:JSTL标签使⽤步骤:1、引⼊对应的taglib核⼼标签。2、使⽤其中的⽅法。3、在tomcat中也需要导⼊jstl的包,否则会报错,jstl解析错误。可能出现的问题:在使⽤jstl核⼼标签的时候显⽰500错误。解决⽅案,把包导⼊到tomcat当前版本的lib⽬录下,以及包也⽤同样的⽅式导⼊到lib⽬录下。9、JavaBean它是⼀个实体类:JavaBean有特定的写法:必须要有⼀个⽆参构造属性必须私有化必须有对应的get/set⽅法它⼀般⽤来和数据库的字段做映射 ODM:ORM:对象关系映射sql表对应Java类sql字段对应Java属性sql⾏记录对应Java对象10、MVC三层架构经典MVC模式中,M是指业务模型,V是指⽤户界⾯,C则是控制器,使⽤MVC的⽬的是将M和V的实现分离,从⽽使同⼀个程序可以使⽤不同的表现形式。其中,View的定义⽐较清晰,就是⽤户界⾯。什么是MVC:Model view Contorller 模型、视图、控制器原理图: ⽤户直接访问控制层,可⽀持就可以直接操作数据库:MVC这三层的作⽤:Model:1、业务处理:业务逻辑(Service)2、数据持久化:CRUD(Dao)view:1、展⽰数据2、提供链接发起Servlet请求(像css中的:a...)Controller:1、接收⽤户的请求:(⽐如:req:请求参数、Session信息..)2、交给业务层处理对应的代码3、控制视图的跳转具体流程:⽤户登录-->接收⽤户的登录请求-->处理⽤户的请求-->交给业务层处理登录业务-->Dao层查询⽤户名和密码是否正确-->查询数据库11、Filter过滤器1. 我对过滤器的理解:

过滤器本质上是过滤⼀些没必要出现的数据,⽐起servlet,过滤器本⾝出现的场景更加⽅便。⽐如:我要过滤到⽤户登录的信息,我可以在过滤器中加⼊,在⽤户登录的时候的字符编码格式统⼀,⽤户是否登录输⼊不能为空。相⽐于servlet,因为servlet实现这个作⽤也可以,但是要实现这些作⽤,⼀定要在每个servlet中写上这些判断,才能使⽤。⽽过滤器这时候就可以⽅便我们写下这些能作⽤的代码,将所有servlet下的类都过滤⼀遍,就不需要⼀次次的去servlet中写了。2. 过滤器测试的代码:路径原理:在中去⾛路径,在⾛路径的时候要去,pom中去寻找映射路径,找到在pom中的servlet路径,但找到servlet路径的时候,如果这时候有filter,那么就先⾛filter的路径,因为filter权限更⾼,在寻找完后,在⾛向servlet路径,最后实现。17181920 CharacterEncodingFilter terEncodingFilter CharacterEncodingFilter /*

SysFilter ter SysFilter /auisdfulsgaduf/* 3. 过滤器的作⽤:⽤来过滤⽹站的数据⼀般⽤来:1、处理中⽂乱码2、登录验证概念图: 4. Filter:开发步骤1、导包在⾥⾯导⼊需要的依赖。2、编写过滤器:主要步骤:

编写过滤器代码:1718192627public class CharacterEncodingFilter implements Filter { // 初始化:web服务器启动的时候就初始化了。 @Override public void init(FilterConfig filterConfig) throws ServletException { n("CharacterEncodingFilter初始化"); }

// chain:链 // 1、过滤中的所有代码,在过滤特定请求的时候都会执⾏,随时等待过滤对象 // 2、必须要让过滤器继续通⾏ er(request,response); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { racterEncoding("gbk"); racterEncoding("gbk"); tentType("text/html;charset=utf-8");

n("CharacterEncodingFilter执⾏前..."); er(request,response);// 让我们的请求继续⾛,如果不写,我们的程序到这⾥就会拦截停⽌ n("CharacterEncodingFilter执⾏后..."); } // 销毁 @Override public void destroy() { n("CharacterEncodingFilter销毁");

}}注意点:编写过滤器的时候导⼊的包是t包Filter。3、实现Filter接⼝,重写对应的⽅法即可。4、在中配置Filter过滤器123456789 CharacterEncodingFilter terEncodingFilter CharacterEncodingFilter /servlet/* 12、监听器实现⼀个监听器效果:1、编写⼀个监听器。2、实现监听器的接⼝。82936373839404142// 统计⽹站在线⼈数:统计sessionpublic class OnlineCountListener implements HttpSessionListener {

// 创建session监听 // ⼀但创建⼀个session就会触发⼀次事件 @Override public void sessionCreated(HttpSessionEvent se) { ServletContext ctx = sion().getServletContext();

n(sion().getId());

Integer onlineCount = (Integer)ribute("OnlineCount"); if (onlineCount==null){ onlineCount = new Integer(1); }else { int count = ue(); onlineCount = new Integer(count+1); } ribute("OnlineCount",onlineCount);

} // 销毁session监听 // ⼀但销毁⼀个session就会触发⼀次事件 @Override public void sessionDestroyed(HttpSessionEvent se) { ServletContext ctx = sion().getServletContext();

Integer onlineCount = (Integer)ribute("OnlineCount"); if (onlineCount==null){ onlineCount = new Integer(0); }else { int count = ue(); onlineCount = new Integer(count-1); } ribute("OnlineCount",onlineCount);

} // session销毁 // 1、⼿动销毁 sion().invalidate(); // 2、⾃动销毁

}⾃动销毁Session实现:在xml中设置Session销毁时间为⼀分钟即可。123 1 3、中注册监听器1234 CountListener 监听作⽤及实现场景:列如:监听⽤户登录和下线的情况。13、JDBC复习概述:我们选⽤不同数据库的时候,连接会有不同的代码和驱动,这时候我们连接不同的数据库就要去区分不同数据库的代码,⽽解决的⽅案就是,在数据库上⾯在加上⼀层JDBC,让JDBC来处理连接不同数据库的这些事情,这样就很⽅便了。让不同数据库的代码,就⾛不同的数据库。⽐如:我们学习的MySQL、Oracle。复习JDBC:六⼤步骤1、配置数据库2、加载驱动3、连接数据库4、向数据库发送sql的对象statement ,进⾏CURD5、编写sql6、关闭释放829363738package ;

import .*;

public class TestJdbc { public static void main(String[] args) throws ClassNotFoundException, SQLException {

// 配置数据库 // 防⽌中⽂乱码useUnicode=true&characterEncoding=UTF-8 String url = "jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true"; String username = "root"; String password = "123456";

// 加载驱动 e(""); // 连接数据库 connection代表数据库了 Connection connection = nection(url, username, password); // 向数据库发送sql的对象Statement,进⾏CRUD Statement statement = Statement(); // 编写sql String sql = "select * from user;"; // 执⾏查询sql,返回⼀个resultSet结果集 ResultSet resultSet = eQuery(sql); while (()){ n("id="+ect("id")); n("name="+ect("name")); n("password="+ect("password")); n("email="+ect("email")); n("birthday="+ect("birthday")); } // 关闭连接,释放资源 (); (); ();

}}试试预编译sql(prepareStatement)因为它⽐较安全:171819 // 编写sQL String sql = "insert into user(id,`name`,`password`,`email`,birthday) value (?,?,?,?,?)"; // 预编译 PreparedStatement preparedStatement = eStatement(sql); (1,5); ing(2,"2"); ing(3,"1153541"); ing(4,"123@"); e(5,new Date(new ().getTime()));

int i = eUpdate(); if (i>0){ n("插⼊成功"); }

// 关闭连接,释放资源 (); ();JDBC事务:

111213 oCommit(false); // 关闭⾃动提交 // 编写sQL String sql = "update test set money = money-100 where id =1"; eStatement(sql).executeUpdate(); // 执⾏更新 // 提交事务 ();// 提交 n("success"); // 如果错误就回滚 catch (SQLException e) {

ck();// 回滚

tackTrace(); }

();// 关闭,释放资源junit单元测试导⼊的包12345 junit junit 4.12 这个注解的作⽤:只要加了这个注解就可以不⽤写main⽅法了,就可以直接运⾏。1234567 import ; // 需要导⼊的包

@Test // 注解 public void tedt(){ n("你好呀!"); }

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687865786a52051.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信