厦门seo网站,互联网营销成功案例,wordpress文章首字下沉,设计派官网Java Web
1、基本概念
1.1、前言
web开发#xff1a;
web#xff0c;网页的意思#xff0c;www.baidu.com静态web html#xff0c;css 提供给所有人看的数据始终不会发生变化动态web 淘宝#xff0c;几乎是所有的网站 提供给所有人看的数据始终会发生变…Java Web
1、基本概念
1.1、前言
web开发
web网页的意思www.baidu.com静态web htmlcss 提供给所有人看的数据始终不会发生变化动态web 淘宝几乎是所有的网站 提供给所有人看的数据始终会发生变化每个人在不同的时间不同的地点看到的信息各不相同 技术栈Servlet/JSPASPPHP
在Java中动态web资源开发的技术统称为JavaWeb
1.2、web应用程序
web应用程序可以提供浏览器访问的程序
a.html、b.html...多个web资源这些web资源可以被外界访问对外界提供服务能访问到的任何一个页面或者资源都存在于这个世界的某一个角落的计算机上URL这些统一的web资源会被放在同一个文件夹下web应用程序--Tomcat:服务器一个web应用由多部分组成静态web动态web htmlcssjs jspservlet Java程序 jar包 配置文件Properties
web应用程序编写完毕后若想提供给外界访问需要一个服务器来统一管理
1.3、静态web
*.htm*.html这些都是网页的后缀如果服务器上一直存在这些东西我们就可以直接进行读取。需要网络静态web存在的缺点 Web页面无法动态更新所有用户看到的都是同一个页面 轮播图点击特效伪动态 JavaScript[实际开发中用的最多] VBScript 它无法和数据库交互数据无法持久化用户无法交互
1.4、动态web
页面会动态展示“web的页面展示的效果因人而异” 缺点
假如服务器的动态web资源出现了错误我们需要重新编写我们的后台程序 重新发布 停机维护
优点
Web页面可以动态更新所有用户看到的都不是同一个页面它可以和数据库交互数据持久化注册商品信息用户信息......
分析原理看源码
2、web服务器
2.1、技术详解
ASP
微软国内最早流行的就是ASP在HTML中嵌入了VB脚本ASP COM;在ASP开发中基本一个页面都有几千行的业务代码页面极其混乱 维护成本高 C# IIS
h1h1h1h1h1h1h1%System.out.println(hello)%h1h1h1h1
h1
php:
PHP开发速度很快功能很强大跨平台代码很简单70%WP无法承载大访问量的情况局限性
JSP/Servlet:
B/S架构浏览器和服务器
C/S架构客户端和服务器
SUN公司主推的B/S架构基于Java语言的所有的大公司或者一些开源的组件都是用Java写的可以承载三高问题带来的影响高并发高可用高性能语法像ASP方便ASP--JSP加强市场强度
2.2、web服务器
服务器是一种被动的操作用来处理用户的一些请求和给用户一些相应信息
IIS
微软的ASP...,Windows中自带的
Tomcat 面向百度编程
Tomcat是Apache 软件基金会Apache Software Foundation的Jakarta 项目中的一个核心项目最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现因为Tomcat 技术先进、性能稳定而且免费因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可成为比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器属于轻量级应用服务器在中小型系统和并发访问用户不是很多的场合下被普遍使用是开发和调试JSP 程序的首选。对于一个Java初学web的人来说它是最佳的选择。
Tomcat 实际上运行JSP 页面和Servlet。Tomcat最新版本为10.0.23。
......
工作3-5年之后可以尝试手写Tomcat服务器
下载Tomcat
安装 or 解压了解配置文件及目录结构这个东西的作用
java的根加载机制从rt.jar包来的
3、Tomcat
3.1、安装Tomcat
tomcat官网Apache Tomcat® - Welcome! 解压 3.2、Tomcat启动和配置
文件夹作用 temp临时文件 work工作目录
启动。关闭Tomcat 访问测试http://localhost:8080/
可能遇到的问题
Java环境变量没有配置闪退问题需要配置兼容性乱码问题配置文件中设置
3.3、配置 可以配置启动的端口号
tomcat的默认端口号为8080 MySQL3306 http80 https443 Connector port8080 protocolHTTP/1.1connectionTimeout20000redirectPort8443maxParameterCount1000/
可以配置主机的名称
默认的主机名为localhost -- 127.0.0.1 默认网站应用存放的位置weiwebapps Host namelocalhost appBasewebappsunpackWARstrue autoDeploytrue
面试题
请你谈一谈网站时如何进行访问的
输入一个域名点击回车检查本机的C:\Windows\System32\drivers\etc\host配置文件下有没有这个域名映射 1.有直接返回对应的IP地址,这个地址中有我们需要访问的web程序可以直接访问 127.0.0.1 www.jibu.com 2.没有去DNS服务器找找到的话就返回找不到就返回找不到
3.4、发布一个web网站
不会就先模仿
将自己写的网站放到服务器Tomcat中指定的web应用的文件夹webapps下就可以访问了
网站应该有的结构
-- webapps : Tomcat服务器的web目录-ROOT-jibustudy : 网站的目录名- WEB-INF -classes java程序-libweb应用所依赖的jar包-web.xml网站的配置文件- index.html 默认的首页- static-css-style.css-js-img-......
4、Http
4.1、什么是HTTP
HTTP超文本传输协议是一个简单的请求-响应协议它通常运行在TCP之上。
文本html字符串...超文本图片音乐视频定位地图......80
Https安全的
443
4.2、两个时代
http1.0 HTTP/1.0客户端可以与web服务器连接后只能获得一个web资源断开连接。http2.0 HTTP/1.1客户端可以与web服务器连接后可以获得多个web资源。
4.3、Http请求
客户端---发请求Request---服务器
百度
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/post方法
Status Code: 200 OK 状态码200
Remote Address: 39.156.66.14:443 远程地址
Referrer Policy: strict-origin-when-cross-origin 协议
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q0.9 语言
Cache-Control: max-age0
Connection: keep-alive
1、请求行
请求行中的请求方式GET请求方式GetPostHEADDELETEPUTTRACT ... get请求能够携带的参数比较少大小有限制会在浏览器的URL地址栏显示数据内容不安全但高效 post请求能够携带的参数没有限制大小没有限制不会在浏览器的URL地址栏显示数据内容安全但不高效
2、消息头
Accept告诉浏览器它所支持的数据类型
Accept-Encoding支持哪种编码格式 GBK UTF-8 GB2312 IS08859-1
Accept-Languag告诉浏览器它的语言环境
Cache-Control缓存控制
Connection告诉服务器请求完成是断开还是保持连接
HOST主机... 4.4、Http响应
服务器---响应---客户端
百度
Cache-Control: private 缓存控制
Connection: keep-alive 连接保持连接
Content-Encoding: gzip 编码
Content-Type: text/html; charsetutf-8 类型1、响应体
Accept告诉浏览器它所支持的数据类型
Accept-Encoding支持哪种编码格式 GBK UTF-8 GB2312 IS08859-1
Accept-Languag告诉浏览器它的语言环境
Cache-Control缓存控制
Connection告诉服务器请求完成是断开还是保持连接
HOST主机...
Refresh告诉客户端多久刷新
Location让网页重新定位;
2、响应状态码
200请求相应成功 200
3xx请求重定向
重定向你重新到我给你的新位置去
4xx找不到资源 404
资源不存在
5xx服务器代码错误 500 502网关错误
常见面试题
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示出来经历了什么
5、Maven
为什么要学习maven这个技术
在JavaWeb开发中需要使用大量的jar包我们手动去导入如何能够让一个东西自动帮我导入和配置这个jar包 由此Maven诞生了。
5.1、Maven项目架构管理工具
我们目前用来就是方便导入jar包的
Maven的核心思想约定大于配置
有约束不要去违反。
Maven会规定好该如何去编写Java代码必须要按照这个规范来
5.2、下载安装Maven
官网Maven – Welcome to Apache Maven 下载完成后解压即可
5.3、配置环境变量
在我们的系统环境变量中配置如下配置
M2_HOME maven目录下的bin目录MAVEN_HOME maven的目录在系统的path中配置 MAVEN_HOME 测试maven是否安装成功保证必须配置完毕
5.4、修改一下配置文件 阿里云镜像
镜像mirrors 加速我们的下载国内建议使用阿里云的镜像
mirroridaliyunmaven/idmirrorOf*/mirrorOfname阿里云公共仓库/nameurlhttps://maven.aliyun.com/repository/public/url
/mirror
5.5、本地仓库
在本地的仓库远程仓库
建立一个本地仓库localRepository localRepositoryD:/maven/local/localRepository
5.6、在IDEA中使用Maven
启动IDEA创建一个Maven项目 3、等待项目初始化完毕 4、观察maven仓库中多了什么东西
5、IDEA中的maven设置
注意IDEA项目创建成功后看一下maven配置。 IDEA配置maven注意经常在IDEA中会出现一个问题就是项目自动创建完成后它这个maven主路径会使用IDEA默认的我们如果发现了这个问题手动改为本地的。
5.7、创建一个普通的Maven项目 这个只有在Web应用下才会有 5.8、在IDEA中标记文件夹功能 打开项目结构 5.9、在IDEA中配置Tomcat 必须要的配置为什么会有这个问题我们访问一个网站需要指定一个文件夹的名字 、
启动tomcat 5.10、pom文件
pom.xml是maven的核心配置文件 !--Maven版本和头文件--
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd!--这里就是我们刚才配置的GAV--modelVersion4.0.0/modelVersiongroupIdcom.jibu/groupIdartifactIdjavaweb-01-maven/artifactId
!--package项目的打包方式
jarJava应用
warJavaWeb应用
--packagingwar/packagingversion1.0-SNAPSHOT/version!--配置--properties!--项目的默认构建编码--projiect.build.sourceEncodingUTF-8/projiect.build.sourceEncoding !--编码版本--maven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.target/properties!--项目依赖--dependencies!--具体依赖的jar包配置文件--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/version/dependency/dependencies!--项目构件用的东西--buildfinalNamejavaweb-01-maven/finalName/build
/projectmaven由于它的约定大于配置我们之后可能遇到我们写的配置文件无法被导出或者生效的问题解决方案 !--在build中配置resources来防止我们资源导出失败的问题--buildresourcesresourcedirectorysrc/main/resources/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringtrue/filtering/resourceresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringtrue/filtering/resource/resources/build 5.11、IDEA操作 maven中jar包的联系关联图 5.12、解决遇到的问题
IDEA和maven不兼容 降级mavenTomcat闪退 Java项目没关导致8080端口被占用IDEA每次都要重复配置mavenmaven默认web项目中的web.xml版本问题替换为webapp4.0版本和tomcat一致 ?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0metadata-completetrue/web-app Maven仓库的使用 地址https://mvnrepository.com/
6、Servlet
Servlet接口Sun公司有两个默认的实现类HttpServletGenericServlet
6.1、Servlet简介
Servlet就是sun公司开发动态web的一门技术Sun公司在这些API中提供一个接口叫做Servlet如果你想开发一个Servlet程序只需要完成两个小步骤 编写一个类实现Servlet接口 把开发好的Java类部署到web服务器中。
把实现了Servlet接口的Java程序叫做Servlet
6.2、HelloServlet
构建一个普通的Maven项目删掉里面的src目录以后我们的学习就在这个项目里面建立Moudel这个空的工程就是Maven主工程关于Maven父子工程的理解 父项目中会有 modulesmoduleservlet-01/module/modules 子项目中 parentgroupIdcom.jibu/groupIdartifactIdjavaweb-02-servlet/artifactIdversion1.0-SNAPSHOT/version/parent 父项目中的jar包子项目可以直接使用 son extends father Maven环境优化 修改web.xml为最新的 将maven的结构搭建完整编写一个servlet程序 1.编写一个普通类 2.实现Servlet接口这里我们直接继承HttpServlet public class HelloServlet extends HttpServlet {//由于get或者post只是请求实现的不同的方式可以相互调用业务逻辑都一样Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//ServletOutputStream outputStream resp.getOutputStream();PrintWriter writer resp.getWriter();//响应流writer.print(Hello,Servlet);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
} 编写Srevlet的映射 为什么需要映射我们写的是Java程序但是要通过浏览器访问而浏览器需要连接web服务器所以我们需要在web服务中注册我们写的Servlet还需要给它一个浏览器能够访问的路径 !--注册Servlet--servletservlet-namehello/servlet-nameservlet-classcom.jibu.servlet.HelloServlet/servlet-class/servlet!--Servlet的请求路径--servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mapping 配置Tomcat 注意配置项目发布的路径就可以了启功测试
6.3、Servlet原理
Servlet是由Web服务器调用web服务器在收到浏览器请求之后会 6.4、Mapping问题
一个Servlet可以指定一个映射路径 servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/*/url-pattern/servlet-mapping 一个Servlet可以指定多个映射路径 servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mappingservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello2/url-pattern/servlet-mappingservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello3/url-pattern/servlet-mappingservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello4/url-pattern/servlet-mappingservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello5/url-pattern/servlet-mapping 一个Servlet可以指定通用映射路径 servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/*/url-pattern/servlet-mapping 默认请求路径 !--默认请求路径--servlet-mappingservlet-namehello/servlet-nameurl-pattern/*/url-pattern/servlet-mapping 指定一些后缀或者前缀等等... !--可以自定义后缀请求映射注意点*前面不能加项目映射的路径hello/sfeff.jibu--servlet-mappingservlet-namehello/servlet-nameurl-pattern*.jibu/url-pattern/servlet-mapping 优先级问题 指定了固有的映射路径优先级最高如果找不到就会走默认的处理请求 !--404--servletservlet-nameerror/servlet-nameservlet-classcom.jibu.servlet.ErrorServlet/servlet-class/servletservlet-mappingservlet-nameerror/servlet-nameurl-pattern/*/url-pattern/servlet-mapping
6.5、ServletContext
web容器在启动的时候它会为每个web程序都创建一个对应的ServletContext对象它代表了当前的web应用
1、共享数据
我在这个Servlet中保存的数据可以在另一个servlet中拿到
public class HelloServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//this.getInitParameter(); 初始化参数//this.getServletConfig(); Servlet配置//this.getServletContext(); Servlet上下文ServletContext context this.getServletContext();String username 李骏; //数据context.setAttribute(username,username); //将一个数据保存在了ServletContext中名字为username值为username}
}
public class GetServlet extends HelloServlet{Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();String username (String) context.getAttribute(username);resp.setContentType(text/html);resp.setCharacterEncoding(utf-8);resp.getWriter().print(名字username);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}servletservlet-namehello/servlet-nameservlet-classcom.jibu.servlet.HelloServlet/servlet-class/servletservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mappingservletservlet-namegetc/servlet-nameservlet-classcom.jibu.servlet.GetServlet/servlet-class/servletservlet-mappingservlet-namegetc/servlet-nameurl-pattern/getc/url-pattern/servlet-mapping
测试访问结果
2、获取初始化参数 !--配置一些web应用初始化参数--context-paramparam-nameurl/param-nameparam-valuejdbc:mysql://localhost:3306/mybatis/param-value/context-param
public class ServletDemo03 extends HelloServlet{Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();String url context.getInitParameter(url);resp.getWriter().print(url);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}3、请求转发 servletservlet-namesd4/servlet-nameservlet-classcom.jibu.servlet.ServletDemo04/servlet-class/servletservlet-mappingservlet-namesd4/servlet-nameurl-pattern/sd4/url-pattern/servlet-mappingpublic class ServletDemo04 extends HelloServlet{Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();System.out.println(进入了ServletDemo04);//RequestDispatcher requestDispatcher context.getRequestDispatcher(/gp);//转发的请求路径//requestDispatcher.forward(req,resp);//调用forward方法实现请求转发context.getRequestDispatcher(/gp).forward(req,resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
} 4、读取资源文件
Properties
在Java目录下新建properties在resource目录下新建properties
发现都被打包到了同一个路径下classes我们俗称这个路径为classpath
思路需要一个文件流
usernameroot123
passwordheruibeuri
public class ServletDemo05 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {InputStream is this.getServletContext().getResourceAsStream(/WEB-INF/classes/com/jibu/servlet/aa.properties);Properties prop new Properties();prop.load(is);String user prop.getProperty(username);String pwd prop.getProperty(password);resp.getWriter().print(user:pwd);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
} servletservlet-namesd5/servlet-nameservlet-classcom.jibu.servlet.ServletDemo05/servlet-class/servletservlet-mappingservlet-namesd5/servlet-nameurl-pattern/sd5/url-pattern/servlet-mapping
访问测试即可
6.6、HttpServletResponse
web服务器收到客户端的http请求针对这个请求分别创建一个代表请求的HttpServletRequest对象代表响应的一个HttpServletResponse对象
如果要获取客户端请求过来的参数找HttpServletRequest如果要给客户端响应一些信息找HttpServletResponse
1、简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法 void setCharacterEncoding(String var1);void setContentLength(int var1);void setContentLengthLong(long var1);void setContentType(String var1);void setDateHeader(String var1, long var2);void addDateHeader(String var1, long var2);void setHeader(String var1, String var2);void addHeader(String var1, String var2);void setIntHeader(String var1, int var2);void addIntHeader(String var1, int var2);
响应的状态码 int SC_CONTINUE 100;int SC_SWITCHING_PROTOCOLS 101;int SC_OK 200;int SC_CREATED 201;int SC_ACCEPTED 202;int SC_NON_AUTHORITATIVE_INFORMATION 203;int SC_NO_CONTENT 204;int SC_RESET_CONTENT 205;int SC_PARTIAL_CONTENT 206;int SC_MULTIPLE_CHOICES 300;int SC_MOVED_PERMANENTLY 301;int SC_MOVED_TEMPORARILY 302;int SC_FOUND 302;int SC_SEE_OTHER 303;int SC_NOT_MODIFIED 304;int SC_USE_PROXY 305;int SC_TEMPORARY_REDIRECT 307;int SC_BAD_REQUEST 400;int SC_UNAUTHORIZED 401;int SC_PAYMENT_REQUIRED 402;int SC_FORBIDDEN 403;int SC_NOT_FOUND 404;int SC_METHOD_NOT_ALLOWED 405;int SC_NOT_ACCEPTABLE 406;int SC_PROXY_AUTHENTICATION_REQUIRED 407;int SC_REQUEST_TIMEOUT 408;int SC_CONFLICT 409;int SC_GONE 410;int SC_LENGTH_REQUIRED 411;int SC_PRECONDITION_FAILED 412;int SC_REQUEST_ENTITY_TOO_LARGE 413;int SC_REQUEST_URI_TOO_LONG 414;int SC_UNSUPPORTED_MEDIA_TYPE 415;int SC_REQUESTED_RANGE_NOT_SATISFIABLE 416;int SC_EXPECTATION_FAILED 417;int SC_INTERNAL_SERVER_ERROR 500;int SC_NOT_IMPLEMENTED 501;int SC_BAD_GATEWAY 502;int SC_SERVICE_UNAVAILABLE 503;int SC_GATEWAY_TIMEOUT 504;int SC_HTTP_VERSION_NOT_SUPPORTED 505;
2、下载文件
1.向浏览器输出消息 2.下载文件 1.要获取下载文件的路径 2.下载的文件名是啥 3.设置想办法让浏览器能够支持下载我们需要的东西 4.获取下载文件的输入流 5.创建缓冲区 6.获取OutputStream对象 7.将FileOutputStream流写入到buffer缓冲区 8.使用OutputStream流对象将缓冲区中的数据输出到客户端
public class FileServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.要获取下载文件的路径String realPath D:\\java\\code\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\李骏.png;System.out.println(下载文件的路径realPath);// 2.下载的文件名是啥String fileName realPath.substring(realPath.lastIndexOf(\\) 1);// 3.设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西,让中文文件名URLEncoder.encode编码否则有可能会乱码resp.setHeader(Content-disposition,attachment;filename URLEncoder.encode(fileName,utf-8));// 4.获取下载文件的输入流//D:\java\code\JavaWeb\javaweb-02-servlet\response\target\classes\李骏.pngFileInputStream in new FileInputStream(realPath);// 5.创建缓冲区int len 0;byte[] buffer new byte[1024];// 6.获取OutputStream对象ServletOutputStream out resp.getOutputStream();// 7.将FileOutputStream流写入到buffer缓冲区使用OutputStream流对象将缓冲区中的数据输出到客户端,while ((lenin.read(buffer))0){out.write(buffer,0,len);}out.close();in.close();}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
3、验证码功能
验证码怎么来的
前端实现后端实现需要用到Java的图片类生成一个图片
public class ImageServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//如何让浏览器3秒自动刷新一次resp.setHeader(refresh,3);//在内存中创建一个图片BufferedImage image new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//得到图片Graphics2D g (Graphics2D) image.getGraphics();//笔//设置图片的背景颜色g.setColor(Color.white);g.fillRect(0,0,80,20);//给图片写数据g.setColor(Color.BLUE);g.setFont(new Font(null,Font.BOLD,20));g.drawString(makeNum(),0,20);//告诉浏览器这个请求用图片的方式打开resp.setContentType(image/jpg);//网站存在缓存不让浏览器缓存resp.setDateHeader(expires,-1);resp.setHeader(Cache-Control,no-cache);resp.setHeader(Pragma,no-cache);//把图片写给浏览器ImageIO.write(image,jpg,resp.getOutputStream());}//生成随机数private String makeNum(){Random random new Random();String num random.nextInt(9999999) ;StringBuffer sb new StringBuffer();for (int i 0; i 7-num.length(); i) {sb.append(0);}String s sb.toString() num;return num;}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
} servletservlet-nameImageServlet/servlet-nameservlet-classcom.jibu.servlet.ImageServlet/servlet-class/servletservlet-mappingservlet-nameImageServlet/servlet-nameurl-pattern/img/url-pattern/servlet-mapping
4、实现重定向 B一个web资源收到客户端A请求后B它会通知A客户端去访问另一个web资源C这个过程叫重定向
常见场景
用户登录 void sendRedirect(String var1) throws IOException;
测试
public class RedirectServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*resp.setHeader(location,/r/img); resp.setStatus(302);//HttpServletResponse.SC_MOVED_TEMPORARILY*/resp.sendRedirect(/r/img);//重定向}
面试题
请你聊聊重定向和转发的区别
相同点 页面都会实现跳转
不同点 请求转发的时候url不会产生变化 重定向的时候url地址栏会发生变化 测试index.jsp
html
body
h2Hello World!/h2%--这里提交的路径需要寻找到项目的类路径--%
%-- ${pageContext.request.contextPath} 代表当前的项目--%
form action${pageContext.request.contextPath}/login methodget用户名input typetext nameusernamebr密码input typepassword namepasswordbrinput typesubmit
/form
% page contentTypetext/html; charsetutf-8 %
/body
/htmlpublic class RequestTest extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理请求String username req.getParameter(username);String password req.getParameter(password);System.out.println(username:password);//重定向的时候一定要注意路径问题否则404resp.sendRedirect(/r/success.jsp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1Success/h1/body
/htmlservletservlet-namerequest/servlet-nameservlet-classcom.jibu.servlet.RequestTest/servlet-class/servletservlet-mappingservlet-namerequest/servlet-nameurl-pattern/login/url-pattern/servlet-mapping
6.7、HttpServletRequest
HttpServletRequest代表客户端的请求用户通过Http协议访问服务器HTTP请求中的所有信息会被封装到HttpServletRequest通过这个HttpServletRequest的方法获得客户端的所有信息 获取前端传递的参数 并且请求转发 public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding(utf-8);resp.setCharacterEncoding(utf-8);String username req.getParameter(username);String password req.getParameter(password);String[] hobbies req.getParameterValues(hobbies);System.out.println();//后台接收中文乱码问题System.out.println(username);System.out.println(password);System.out.println(Arrays.toString(hobbies));System.out.println();System.out.println(req.getContextPath());//通过请求转发//这里的 / 代表当前的web应用req.getRequestDispatcher(/success.jsp).forward(req,resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle登录/title
/head
bodyh1登录/h1div%--这里表单表示的意思以post方式提交表单提交到我们的login请求--%form action${pageContext.request.contextPath}/login methodpost用户名input typetext nameusernamebr密码input typepassword namepasswordbr爱好input typecheckbox namehobbies value女孩女孩input typecheckbox namehobbies value代码代码input typecheckbox namehobbies value音乐音乐input typecheckbox namehobbies value电影电影brinput typesubmit/form
/div/body
/html面试题
请你聊聊重定向和转发的区别
相同点 页面都会实现跳转
不同点 请求转发的时候url不会产生变化 307 重定向的时候url地址栏会发生变化 302
7、Cookie、Session
7.1、会话
会话用户打开一个浏览器点击了很多超链接访问多个web资源关闭浏览器这个过程称之为会话
有状态会话一个同学来过教室下次再来教室我们就知道这个同学曾经来过称之为有状态会话你能怎么证明你是东部闭源的学生 你 东闭 1.发票 东闭给你发票 2.学校登记 东闭标记你来过了
一个网站怎么证明你来过 客户端 服务端 1.服务端给客户端一个信件客户端下次访问服务端带上信件就可以了cookie 2.服务器登记你来过了下次你来的时候我来匹配你session
7.2、保存会话的两种技术
cookie
客户端技术 响应请求
session
服务器技术利用这个技术可以保存用户的会话信息。我们可以把信息或者数据放在session中
常见场景网站登录之后你下次不用再登录了第二次访问直接就上去了
7.3、cookie 1、从请求中拿到cookie信息 2、服务器相应给客户端cookie
Cookie[] cookies req.getCookies();//获得cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获得cookie中的value
new Cookie(lastLoginTime, System.currentTimeMillis());//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookiepackage com.jibu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务器告诉你你来的时间把这个时间封装成为一个信件你下次带来我就知道你来了//解决中文乱码req.setCharacterEncoding(utf-16);resp.setCharacterEncoding(utf-16);PrintWriter out resp.getWriter();//Cookie,服务端从客户端申请Cookie[] cookies req.getCookies();//这里返回数组说明Cookie可能存在多个//判断Cookie是否存在if (cookies!null){//如果存在怎么办out.write(你上一次访问的时间是);for (int i 0; i cookies.length; i) {Cookie cookie cookies[i];//获取cookie的名字if (cookie.getName().equals(lastLoginTime)){//获取cookie中的值long lastLoginTime Long.parseLong(cookie.getValue());Date date new Date(lastLoginTime);out.write(date.toLocaleString());}}}else {out.write(这是你第一次访问本站);}//服务器给客户端响应一个cookieCookie cookie new Cookie(lastLoginTime, System.currentTimeMillis());//cookie有效期为1天cookie.setMaxAge(24*60*60);resp.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}cookie一般会保存在本地的用户目录下appdata
一个网站cookie是否存在上限。细节问题
一个Cookie只能保存一个信息一个web站点可以给浏览器发送多个cookie每个站点最多存放20个cookieCookie大小有限制4kb300个cookie浏览器的上限
删除Cookie
不设置有效期关闭浏览器自动失效设置有效期时间为0
//保存用户上一次访问的时间
public class CookieDemo02 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建一个cookie名字必须要和要删除的名字一致Cookie cookie new Cookie(lastLoginTime, System.currentTimeMillis());//将cookie有效期设置为零立马过期cookie.setMaxAge(0);resp.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}编码解码
URLDecoder.decode(cookie.getValue(),UTF-8)
URLEncoder.encode(李骏,utf-8) 7.4、Session重点 什么是Session
服务器会给每一个用户浏览器创建一个Session对象一个Seesion独占一个浏览器只要浏览器没有关闭这个Session就存在用户登录之后整个网站它都可以访问----保存用户的信息保存购物车的信息.... Session和Cookie的区别
Cookie是把用户的数据写给用户的浏览器浏览器保存可以保存多个Session把用户的数据写到用户独占的Session中服务器端保存保存重要的信息减少服务器资源的浪费Session对象由服务器创建
使用场景
保存一个登录用户的信息购物车信息在整个网站中经常会使用的数据我们将它保存在Session中
使用Session
package com.jibu.servlet;import com.jibu.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;public class SessionDemo01 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码问题resp.setCharacterEncoding(UTF-8);req.setCharacterEncoding(UTF-8);resp.setContentType(text/html;charsetutf-8);//得到SessionHttpSession session req.getSession();//给Session中存东西session.setAttribute(name,new Person(李骏,1));//获取Session的IDString sessionId session.getId();//判断Session是不是新创建的if (session.isNew()){resp.getWriter().write(session创建成功,ID:sessionId);}else {resp.getWriter().write(session已经在服务器中存在了,ID:sessionId);}//Session创建的时候做了什么事情
// Cookie cookie new Cookie(JSESSIONID,sessionId);
// resp.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
package com.jibu.servlet;import com.jibu.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionDemo02 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码问题resp.setCharacterEncoding(UTF-8);req.setCharacterEncoding(UTF-8);resp.setContentType(text/html;charsetutf-8);//得到SessionHttpSession session req.getSession();Person person (Person) session.getAttribute(name);System.out.println(person.toString());}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
package com.jibu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionDemo03 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session req.getSession();session.removeAttribute(name);//手动注销Sessionsession.invalidate();}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}会话自动过期web.xml配置 !--设置Session默认的失效时间--session-config!--15分钟后Session自动失效以分钟为单位--session-timeout15/session-timeout/session-config 8、JSP
8.1、什么是JSP
Java Server PagesJava服务端页面也和Servlet一样用于动态Web技术
最大的特点
写JSP就像在写HTML区别 HTML只给用户提供静态的数据 JSP页面中可以嵌入Java代码为用户提供动态数据
8.2、JSP原理
思路JSP到底怎么执行的
代码层面没有任何问题服务器内部工作 tomcat中有一个work目录 IDEA中使用Tomcat的会在IDEA的tomcat中生成一个work目录 发现页面转变成了java程序
浏览器向服务器发送请求不管访问什么资源其实都是在访问Servlet
JSP最终也会被转成一个Java类
JSP本质上就是一个Servlet
//初始化
public void _jspInit() {}
//销毁
public void _jspDestroy() {}
//JSPService
public void _jspService(HttpServletRequest request,HttpServletResponse response)判断请求内置一些对象 final javax.servlet.jsp.PageContext pageContext; //页面上下文javax.servlet.http.HttpSession session null; //sessionfinal javax.servlet.ServletContext application; //applicationContextfinal javax.servlet.ServletConfig config; //config 配置javax.servlet.jsp.JspWriter out null; //out final java.lang.Object page this; //page当前页HttpServletRequest request //请求HttpServletResponse response //响应 输出页面前增加的代码 response.setContentType(text/html); //设置响应的页面类型
pageContext _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
_jspx_page_context pageContext;
application pageContext.getServletContext();
config pageContext.getServletConfig();
session pageContext.getSession();
out pageContext.getOut();
_jspx_out out;以上的这些个对象我们可以在JSP页面中直接使用
在JSP页面中
只要是Java代码就会原封不动的输出
如果是HTML代码就会被转换为 out.write(html\r\n);
这样的格式输出到前端
8.3、JSP基础语法
任何语言都有自己的语法Java中有JSP作为Java技术的一种应用它拥有一些自己扩充的语法Java所有语法都支持
JSP表达式
%--JSP表达式
作用用来将程序的输出输出到客户端
% 变量或者表达式%
--%
% new java.util.Date()%JSP脚本片段
%--JSP脚本片段--%
%int sum 0;for (int i 1; i 100; i) {sumi;}out.println(h1sumsumh1);
%
脚本片段的再实现
%int x 10;out.println(x);
%
p这是一个JSP文档/p
%int y 20;out.println(y);
%
hr%--在代码中嵌入HTML元素--%
%for (int i 0; i 5; i) {
%
h1hello,word %i%% /h1
%}
%
JSP声明
%!static {System.out.println(Loading Servlet!);}private int globalVr 0;public void jibu(){System.out.println(进入了方法jibu);}
%
JSP声明会被编译到JSP生成Java的类中其他的就会被生成到_jspService方法中
在JSP中嵌入Java代码即可
%% 片段
%% 表达式输出一个值
%!% 定义全局的方法!--注释--
JSP的注释不会在客户端显示HTML就会
8.4、JSP指令
%page args...%
%include file%%--include会将两个页面合二为一--%%include filecommon/header.jsp%h1网页主体/h1%include filecommon/footer.jsp%hr%--JSP标签jsp:include:拼接页面,本质还是三个--%jsp:include page/common/header.jsp/h1网页主体/h1jsp:include page/common/footer.jsp/ 定制错误界面
% page contentTypetext/html;charsetUTF-8 languagejava %%--定制错误页面--%
%--% page errorPageerror/500.jsp %--%%--显示的声明这是一个错误页面--%
%page isErrorPagetrue %
%page pageEncodingUTF-8 %htmlheadtitleTitle/title
/head
body%int x 1/0;
%/body
/htmlerror-pageerror-code404/error-codelocation/error/404.jsp/location/error-pageerror-pageerror-code500/error-codelocation/error/500.jsp/location/error-page
8.5、9大内置对象
PageContext 存东西Request 存东西ResponseSession 存东西Application ServletContext 存东西config ServletConfigoutpage 几乎不用exception
pageContext.setAttribute(name1,李骏1号);//保存的数据只在一个页面中有效
request.setAttribute(name2,李骏2号);//保存的数据只在一次请求中有效请求转发会携带这个数据
session.setAttribute(name3,李骏3号);//保存的数据只在一次会话中有效从打开浏览器到关闭浏览器
application.setAttribute(name4,李骏4号);//保存的数据在服务器中有效从打开服务器到关闭服务器 request客户端向服务器发送请求产生的数据用户看完就没用了比如新闻用户看完没用了
session客户端向服务器发送请求产生的数据用户用完一会儿还有用比如购物车
application客户端向服务器发送请求产生的数据一个用户用完了其他用户还可能使用比如聊天数据
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body%--内置对象--%%pageContext.setAttribute(name1,李骏1号);//保存的数据只在一个页面中有效request.setAttribute(name2,李骏2号);//保存的数据只在一次请求中有效请求转发会携带这个数据session.setAttribute(name3,李骏3号);//保存的数据只在一次会话中有效从打开浏览器到关闭浏览器application.setAttribute(name4,李骏4号);//保存的数据在服务器中有效从打开服务器到关闭服务器
%%--脚本片段中的代码会被原封不动生成到.JSP.java
要求这里面的代码 必须要保证Java语法的正确性
--%
%//通过pageContext取出我们保存的值,我们通过寻找的方式来//从底层到高层作用域page-request-session-application//JVM:双亲委派机制String name1 (String) pageContext.findAttribute(name1);String name2 (String) pageContext.findAttribute(name2);String name3 (String) pageContext.findAttribute(name3);String name4 (String) pageContext.findAttribute(name4);String name5 (String) pageContext.findAttribute(name5); //不存在
%
%--使用EL表达式输出 ${} --%
h1取出的值为/h1
h3${name1}/h3
h3${name2}/h3
h3${name3}/h3
h3${name4}/h3
%--h3${name5}/h3--%
h3%name5%/h3/body
/html8.6、JSP标签、JSTL标签、EL表达式 !--JSTL 表达式依赖--dependencygroupIdjavax.servlet.jsp.jstl/groupIdartifactIdjstl-api/artifactIdversion1.2/version/dependency!--standard标签库--dependencygroupIdtaglibs/groupIdartifactIdstandard/artifactIdversion1.1.2/version/dependency
EL表达式${}
获取数据执行运算获取web开发的常用对象调用Java方法
JSP标签
%--jsp:include--%%--
http://localhost:8080/jsptag.jsp?namejibuage12
--%jsp:forward page/jsptag2.jspjsp:param namename valuejibu/jsp:param nameage value20/
/jsp:forward
%--取出参数--%名字%request.getParameter(name)%
年龄%request.getParameter(age)%
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足它自定义许多标签可以供我们使用标签的功能和Java代码一样
格式化标签 SQL标签 XML标签 核心标签掌握部分 JSTL标签库使用步骤
引入对用的taglib使用其中的方法在Tomcat也需要引入jstl的包否则会报错JSTL解析错误
c:if
% page contentTypetext/html;charsetUTF-8 languagejava %%--引入JSTL核心标签库我们才能使用JSTL标签 core--%
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %
html
headtitleTitle/title
/head
bodyh4if测试/h4hrform actioncoreif.jsp methodget%--EL表达式获取表单中的数据${param.参数名}--%input typetext nameusername value${param.username}input typesubmit value登录
/form%--判断如果提交的用户是管理员则登录成功--%
c:if test${param.usernameadmin} varisAdminc:out value管理员欢迎您/
/c:if%--自闭合标签--%
c:out value${isAdmin}//body
/htmlc:choose c:when
% page contentTypetext/html;charsetUTF-8 languagejava %
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %
html
headtitleTitle/title
/head
body%--定义一个变量score值为55 --%
c:set varscore value55/c:choosec:when test${score90}你的成绩为优秀/c:whenc:when test${score80}你的成绩为一般/c:whenc:when test${score70}你的成绩为良好/c:whenc:when test${score60}你的成绩为不及格/c:when
/c:choose/body
/htmlc:forEach
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %
% page importjava.util.ArrayList %
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body%ArrayListString people new ArrayList();people.add(0,张三);people.add(1,李四);people.add(2,王五);people.add(3,赵六);people.add(4,田七);request.setAttribute(list,people);
%%--
var,每一次遍历出来的变量
items,要遍历的对象
begin, 哪里开始
end, 到哪里
step, 步长
--%
c:forEach varpeople items${list}c:out value${people}/ br
/c:forEachhrc:forEach varpeople items${list} begin1 end3 step2 c:out value${people}/ br
/c:forEach/body
/html9、JavaBean
实体类
JavaBean有特定的写法
必须要有一个无参构造属性必须私有化必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM
ORM:对象关系映射
数据库表对应Java类字段---属性行记录---对象
people表
idnameageaddress1李骏1号3北京2李骏2号18北京3李骏3号100北京
class People{private int id;private String name;private int age;private String address;
}class A{new People(1,李骏1号,3,北京);new People(2,李骏2号,18,北京);new People(3,李骏3号,100,北京);
}
package com.jibu.pojo;//实体类 我们一般都是和数据库中的表结构一一对应
public class People {private int id;private String name;private int age;private String address;public People() {}public People(int id, String name, int age, String address) {this.id id;this.name name;this.age age;this.address address;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}public String getAddress() {return address;}public void setAddress(String address) {this.address address;}Overridepublic String toString() {return People{ id id , name name \ , age age , address address \ };}
}javabean.jsp
% page importcom.jibu.pojo.People %
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body%
// People people new People();
// people.setAddress();
// people.setId();
// people.setAge();
// people.setName();
%jsp:useBean idpeople classcom.jibu.pojo.People scopepage /jsp:setProperty namepeople propertyaddress value北京/
jsp:setProperty namepeople propertyid value1/
jsp:setProperty namepeople propertyage value3/
jsp:setProperty namepeople propertyname value棘布/%--%people.getAddress()%--%姓名jsp:getProperty namepeople propertyname/
idjsp:getProperty namepeople propertyid/
年龄jsp:getProperty namepeople propertyage/
地址jsp:getProperty namepeople propertyaddress//body
/html10、MVC三层架构
什么是MVCModel view Controller 模型、视图、控制器
10.1、早些年架构 用户直接访问控制层控制层就可以直接操作数据库
servlet--CRUD--数据库
弊端程序十分臃肿不利于维护 servlet的代码中处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码架构没有什么是加一层解决不了的
程序员调用
|
JDBC
|
MySQL Oracle SQLserver ...
10.2、MVC三层架构 Model 模型层
业务处理业务逻辑Service数据持久层CRUDDao
View
展示数据提供链接发起Servlet请求aformimg...
ControllerServlet
接收用户请求request请求参数Session信息...交给业务层处理对应的代码控制视图跳转
登录---接收用户的登录请求---
处理用户的请求(获取用户登录的参数usernamepassword)---
交给业务层处理登录业务(判断用户名密码是否正确事务)
---Dao层查询用户名和密码是否正确---数据库
11、Filter 重点
Filter过滤器用来过滤网站的数据
处理中文乱码登陆验证...... Filter开发步骤 1.导包 2.编写过滤器 1.导包不要错 2.实现Filter接口重写对应的方法即可
package com.jibu.filter;import javax.servlet.*;
import java.io.IOException;public class CharacterEncodingFilter implements Filter {//初始化web服务器启动就已经初始化了随时等待过滤对象出现Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println(CharacterEncodingFilter初始化);}//Chain : 链/*1.过滤器中的所有代码在过滤特定请求的时候都会执行2.必须要让过滤器继续同行filterChain.doFilter(servletRequest, servletResponse);* */Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding(utf-8);servletResponse.setCharacterEncoding(utf-8);servletResponse.setContentType(text/html;charsetutf-8);System.out.println(CharacterEncodingFilter执行前....);filterChain.doFilter(servletRequest, servletResponse);//让我们的请求继续走如果不写程序到这里就被拦截停止System.out.println(CharacterEncodingFilter执行后....);}//销毁web服务器关闭的时候过滤会销毁Overridepublic void destroy() {System.out.println(CharacterEncodingFilter销毁);}
}3.在web.xml中配置Filter filterfilter-nameCharacterEncodingFilter/filter-namefilter-classcom.jibu.filter.CharacterEncodingFilter/filter-class/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-name!--只要是 /servlet 的任何请求会经过这个过滤器--url-pattern/servlet/*/url-pattern/filter-mapping12、监听器
实现一个监听器的接口有N种
1.编写一个监听器 实现监听器的接口
package com.jibu.listener;import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;//统计网站在线人数统计session
public class OnlineCountListener implements HttpSessionListener {//创建session监听看你的一举一动//一旦创建一个session就会触发一个这个事件Overridepublic void sessionCreated(HttpSessionEvent se) {ServletContext ctx se.getSession().getServletContext();System.out.println(se.getSession().getId());Integer onlineCount (Integer) ctx.getAttribute(OnlineCount);if (onlineCount null) {onlineCount new Integer(1);}else {int count onlineCount.intValue();onlineCount new Integer(count1);}ctx.setAttribute(OnlineCount,onlineCount);}//销毁session监听//一旦销毁一个session就会触发一个这个事件Overridepublic void sessionDestroyed(HttpSessionEvent se) {ServletContext ctx se.getSession().getServletContext();Integer onlineCount (Integer) ctx.getAttribute(OnlineCount);if (onlineCount null) {onlineCount new Integer(0);}else {int count onlineCount.intValue();onlineCount new Integer(count-1);}ctx.setAttribute(OnlineCount,onlineCount);}/*Session销毁1.手动销毁 se.getSession().invalidate();2.自动销毁*/
}2.web.xml中注册监听器 !--注册监听器--listenerlistener-classcom.jibu.listener.OnlineCountListener/listener-class/listener
3.看情况是否使用
13、过滤器、监听器常见应用
监听器GUI编程中经常使用
package com.jibu.listener;import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;public class TestPanel {public static void main(String[] args) {Frame frame new Frame(中秋节快乐);//新建一个窗体Panel panel new Panel(null);//面板frame.setLayout(null);//设置窗体的布局frame.setBounds(300,300,500,500);frame.setBackground(new Color(0,0,255));//设置背景颜色panel.setBounds(50,50,300,300);panel.setBackground(new Color(0,255,0));//设置背景颜色frame.add(panel);frame.setVisible(true);//监听事件监听关闭事件frame.addWindowListener(new WindowListener() {Overridepublic void windowOpened(WindowEvent e) {System.out.println(打开);}Overridepublic void windowClosing(WindowEvent e) {System.out.println(关闭ing);System.exit(0);}Overridepublic void windowClosed(WindowEvent e) {System.out.println(关闭ed);}Overridepublic void windowIconified(WindowEvent e) {}Overridepublic void windowDeiconified(WindowEvent e) {}Overridepublic void windowActivated(WindowEvent e) {System.out.println(激活);}Overridepublic void windowDeactivated(WindowEvent e) {System.out.println(未激活);}});}
}用户登录之后才能进入主页用户注销后就不能进入主页了 1.用户登录之后向Session中放入用户的数据 2.进入主页的时候要判断用户是否已经登录要求在过滤器中实现
package com.jibu.listener;import com.jibu.util.Constant;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SysFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {/*if (req.getSession().setAttribute(Constant.USER_SESSION).levelvip1){response.sendRedirect(/vip1/index.jsp);}if (req.getSession().setAttribute(Constant.USER_SESSION).levelvip2){response.sendRedirect(/vip2/index.jsp);}if (req.getSession().setAttribute(Constant.USER_SESSION).levelvip3){response.sendRedirect(/vip3/index.jsp);}*///ServletRequest HttpServletHttpServletRequest request (HttpServletRequest) req;HttpServletResponse response (HttpServletResponse) resp;if (request.getSession().getAttribute(Constant.USER_SESSION)null) {response.sendRedirect(/error.jsp);}chain.doFilter(request,response);System.out.println(SysFilter is running...);}Overridepublic void destroy() {}
}LoginServlet
package com.jibu.servlet;import com.jibu.util.Constant;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取前端请求的参数String username req.getParameter(username);if (username.equals(admin)) { //登录成功req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());resp.sendRedirect(/sys/success.jsp);}else { //登录失败resp.sendRedirect(/error.jsp);}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}LogoutServlet
package com.jibu.servlet;import com.jibu.util.Constant;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LogoutServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Object user_session req.getSession().getAttribute(Constant.USER_SESSION);if (user_session null) {req.getSession().removeAttribute(Constant.USER_SESSION);resp.sendRedirect(/Login.jsp);}else {resp.sendRedirect(/Login.jsp);}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}success.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1主页/h1a href/servlet/logout注销/a/body
/htmlerror.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
h1错误/h1
h3没有权限用户名错误/h3a href/Login.jsp返回登录页面/a/body
/htmlLogin.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1登录/h1form action/servlet/login methodpostinput typetext nameusernameinput typesubmit
/form/body
/html定义常量
package com.jibu.util;public class Constant {public final static String USER_SESSION USER_SESSION;
}14、JDBC复习
什么是JDBC:Java连接数据库 需要jar包的支持
java.sqljavax.sqlmysql-conneter-java... 连接驱动必须要导入
实验环境搭建
CREATE TABLE users(id INT PRIMARY KEY,name VARCHAR(40),password VARCHAR(40),email VARCHAR(60),birthday DATE
);INSERT INTO users(id,name,password,email,birthday)
VALUES(1,张三,123456,zsqq.com,2000-01-01);
INSERT INTO users(id,name,password,email,birthday)
VALUES(2,李四,123456,lsqq.com,2000-01-01);
INSERT INTO users(id,name,password,email,birthday)
VALUES(3,王五,123456,wwqq.com,2000-01-01);SELECT * FROM users;
导入数据库依赖 dependencies!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency/dependencies
IDEA中连接数据库 JDBC固定步骤
1.加载驱动 2.连接数据库代表数据库 3.向数据库发送SQL的对象Statement : CRUD 4.编写SQL根据业务不同的SQL 5.执行SQL 6.关闭连接
package com.jibu.test;import java.sql.*;public class TestJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException {//配置信息//useUnicodetruecharacterEncodingutf-8 解决中文乱码String url jdbc:mysql://localhost:3306/jdbc?useUnicodetruecharacterEncodingutf-8useSSLfalse;String username root;String password 123456;//1.加载驱动Class.forName(com.mysql.jdbc.Driver);//2.连接数据库,代表数据库Connection connection DriverManager.getConnection(url, username, password);//3.向数据库发送SQL的对象Statement PreparedStatement : CRUDStatement statement connection.createStatement();//4.编写SQLString sql select * from users;//5.执行查询SQL,返回一个ResultSet : 结果集ResultSet rs statement.executeQuery(sql);while (rs.next()){System.out.println(idrs.getObject(id));System.out.println(namers.getObject(name));System.out.println(passwordrs.getObject(password));System.out.println(emailrs.getObject(email));System.out.println(birthdayrs.getObject(birthday));}//6.关闭连接释放资源一定要做 先开后关rs.close();statement.close();connection.close();}
}预编译SQL
package com.jibu.test;import java.sql.*;public class TestJDBC2 {public static void main(String[] args) throws Exception {//配置信息//useUnicodetruecharacterEncodingutf-8 解决中文乱码String url jdbc:mysql://localhost:3306/jdbc?useUnicodetruecharacterEncodingutf-8useSSLfalse;String username root;String password 123456;//1.加载驱动Class.forName(com.mysql.jdbc.Driver);//2.连接数据库,代表数据库Connection connection DriverManager.getConnection(url, username, password);//3.编写SQLString sql insert into jdbc.users(id, name, password, email, birthday) VALUES (?,?,?,?,?);//4.预编译PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,4);//给第一个占位符? 的值赋值为1preparedStatement.setString(2,棘布);//给第二个占位符? 的值赋值为棘布preparedStatement.setString(3,123456);//给第三个占位符? 的值赋值为123456preparedStatement.setString(4,3277528005qq.com);//给第四个占位符? 的值赋值为3277528005qq.compreparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符? 的值赋值为new Date(new java.util.Date().getTime())//5.执行SQLint i preparedStatement.executeUpdate();if (i0){System.out.println(插入成功);}//6.关闭连接释放资源一定要做 先开后关preparedStatement.close();connection.close();}
}事务
要么都成功要么都失败
ACID原则保证数据的安全。
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务转账
A1000
B1000A(900) --100-- B(1100)
Junit单元测试
依赖 !--单元测试--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency
简单使用
Test注解只有在方法上有效只要加了这个注解的方法就可以直接运行 Testpublic void test(){System.out.println(Hello);}
}失败的时候是红色 搭建一个环境
package com.jibu.test;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class TestJDBC3 {Testpublic void test() {//配置信息//useUnicodetruecharacterEncodingutf-8 解决中文乱码String url jdbc:mysql://localhost:3306/jdbc?useUnicodetruecharacterEncodingutf-8useSSLfalse;String username root;String password 123456;Connection connection null;//1.加载驱动try {Class.forName(com.mysql.jdbc.Driver);//2.连接数据库,代表数据库connection DriverManager.getConnection(url, username, password);//3.通知数据库开启事务,false 开启connection.setAutoCommit(false);String sql1 update account set money money-100 where name A;connection.prepareStatement(sql1).executeUpdate();//制造错误//int i 1/0;String sql2 update account set money money100 where name B;connection.prepareStatement(sql2).executeUpdate();connection.commit();//以上两条SQL都执行成功了就提交事务System.out.println(success);connection.rollback();} catch (Exception e) {try {//如果出现异常就通知数据库回滚事务connection.rollback();} catch (SQLException ex) {throw new RuntimeException(ex);}throw new RuntimeException(e);}finally {try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}
}}