当前位置: 首页 > news >正文

网站建设及优化心得体会在线代理ip网页

网站建设及优化心得体会,在线代理ip网页,中国电信网站备案,军事新闻国际军事新闻简介 web开发#xff1a; web#xff0c;网页的意思#xff0c;www.baidu.com静态web html,sss提供给所有人看的数据始终不会发生变化#xff01; 动态web 淘宝#xff0c;几乎是所有的网站#xff1b;提供给所有人看的数据始终会发生变化#xff0c;每个人在不同的时…简介 web开发 web网页的意思www.baidu.com·静态web html,sss提供给所有人看的数据始终不会发生变化 动态web 淘宝几乎是所有的网站提供给所有人看的数据始终会发生变化每个人在不同的时间不同的地点看到的信息各不相同技术栈Servlet/JSPASPPHP web应用程序web应用程序 可以提供浏览器访问的程序 a.html、b.html.….多个web资源这些web资源可以被外界访问对外界提供服务你们能访问到的任何一个页面或者资源都存在于这个世界的某一个角落的计算机上。URL这个统一的web资源会被放在同一个文件夹下web应用程序Tomcat服务器一个web应用由多部分组成静态web动态web) html,css,jsjsp,servletJava程序jar包配置文件Properties) Web酸用程序编写完毕后若想提供给外界访问需要一个服务蔬来统一管理 静态web *.htm *.html这些都是网员的后坠 、如果服务器上一直存在这些东四我们就可以直接进行读取、需要网络静态web存在的缺点 Web页面无法动态更新所有用户看到都是同一个页面 轮播图点击特效伪动态JavaScript[实际开发中它用的最多]VBScript 它无法和数据库交互数据无法持久化用户无法交互 动态web 页面会动态展示“web页面的展示效果因人而异” 缺点 加入服务器的动态web资源出现了错误我们需要重新编写我们的后台程序重新发布 停机维护 优点 Web页面可以动态更新所有用户看到都不是同一个页面 它可以与数据库交互数据持久化注册商品信息用户信息……… web服务器 技术讲解 ASP: 微软国内最早流行的就是ASP·在HTML中嵌入了VB的脚本ASPCOM·在ASP开发中基本一个页面都有几干行的业务代码页面极其换乱·维护成本高C#IIS php: PHP开发速度很快功能很强大跨平台代码很简单70%WP·无法承载大访问量的情况局限性 jSP/Servlet: B/S浏览和服务器C/S客户端和服务器 sun公司主推的B/S架构基于Java语言的所有的大公司或者一些开源的组件都是用Java写的可以承载三高问题带来的影响(高并发高可用高性能)语法像ASPASP-JSP加强市场强度 web服务器 服务器是一种被动的操作用来处理用户的一些请求和给用户一些响应信息 lIS 微软的ASP.,Windows中自带的 Tomcat 面向百度编程 Tomcat是Apache 软件基金会Apache Software Foundation)的jakarta项目中的一个核心项目最新的Servlet 和ISP 规范总是能在Tomcat中得到体现因为Tomcat 技术先进、性能稳定而且免费因而深受lava爱好者的喜爱并得到了部分软件开发商的认可成为目前比较流行的Web应用服务器。 Tomcat 服务器是一个免费的开放源代码的Web应用服务器属于轻量级应用服务器在中小型系统和并发访问用户不是很多的场合下被普遍使用是开发和调试JSP程序的首选。对于一个Java初学web的人来说它是最佳的选择 Tomcat 实际上运行JSP页面和Serlet。Tomcat最新版易9.0 Tomcat 安装tomcat tomcat 官网http://tomcat.apache.org/ Tomcat启动和配置 文件夹作用: 访问测试http://localhost:8080/ 可能遇到的问题 Java环境变量没有配置闪退问题需要配置兼容性乱码问题配置文件中设置 可以修改 conf/logging.properties 中的 java.util.logging.ConsoleHandler.encoding GBK 解决乱码问题 配置 可以配置启动的端口号 tomcat的默认端口号为8080mysql:3306http:80https443 Connector port8081 protocolHTTP/1.1connectionTimeout20000redirectPort8443 /可以配置主机的名称 默认的主机名为localhost-127.0.0.1默认网站应用存放的位置为webapps Host namewww.qinjiang.com appBasewebappsunpackWARstrue autoDeploytrue高难度面试题 请你谈谈网站是如何进行访问的 输入一个域名回车 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射 有直接返回对应的ip地址这个地址中有我们需要访问的web程序可以直接访问 127.0.0.1 www.qinjiang.com没有去DNS服务器找找到的话就返回找不到就返回找不到 4.可以配置一下环境变量可选性 csdn免登陆复制技巧 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4KQqNSEo-1609316574047)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228001630186.png)] 发布一个web网站 不会就先模仿 将自己写的网站放到服务器Tomcat)中指定的web应用的文件夹webapps)下就可以访问了 网站结构 --webapps Tomcat服务器的web目录-ROOT-kuangstudy 网站的目录名- WEB-INF-classes : java程序-libweb应用所依赖的jar包-web.xml 网站配置文件- index.html 默认的首页- static -css-style.css-js-img-.....HTTP协议面试 Maven:构建工具 Maven安装包 Servlet入门 HelloWorld!Servlet配置 ·原理 Http 什么是HTTP (超文本传输协议是一个简单的请求-响应协议它通常运行在TCP之上。 文本html字符串 …超文本图片音乐视频定位地图.……端口:80 Https:安全的 两个时代 http1.0 HTTP/1.0客户端可以与web服务器连接后只能获得一个web资源断开连接 http2.0 HTTP/1.1客户端可以与web服务器连接后可以获得多个web资源。 Http请求 客户端–发请求Request–服务器 百度 Request URL:https://www.baidu.com/ 请求地址 Request Method:GET get方法/post方法 Status Code:200 OK 状态码200 Remote远程 Address:14.215.177.39:443Accept:text/html Accept-Encoding:gzip, deflate, br Accept-Language:zh-CN,zh;q0.9 语言 Cache-Control:max-age0 Connection:keep-alive请求行 请求行中的请求方式GET请求方式Get,Post,HEAD,DELETE,PUT,TRACT.… get请求能够携带的参数比较少大小有限制会在浏览器的URL地址栏显示数据内容不安全但高效post:请求能够携带的参数没有限制大小没有限制不会在浏览器的URL地址栏显示数据内容安全但不高效。 消息头 Accept告诉浏览器它所支持的数据类型 Accept-Encoding支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language告诉浏览器它的语言环境 Cache-Control缓存控制 Connection告诉浏览器请求完成是断开还是保持连接 HOST主机..../.Http响应 服务器–响应…….客户端 百度 Cache-Control:private 缓存控制 Connection:Keep-Alive 连接 Content-Encoding:gzip 编码 Content-Type:text/html 类型 响应体 Accept告诉浏览器它所支持的数据类型 Accept-Encoding支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language告诉浏览器它的语言环境 Cache-Control缓存控制 Connection告诉浏览器请求完成是断开还是保持连接 HOST主机..../. Refresh告诉客户端多久刷新一次 Location让网页重新定位响应状态码 200请求响应成功200 3xx:请求重定向·重定向你重新到我给你新位置去 4xx:找不到资源404·资源不存在 5xx:服务器代码错误 500 502:网关错误 常见面试题 当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来经历了什么 Maven 为什么要学习这个技术 在Javaweb开发中需要使用大量的jar包我们手动去导入如何能够让一个东西自动帮我导入和配置这个jar包。 由此Maven诞生了 Maven项目架构管理工具 我们目前用来就是方便导入jar包的 Maven的核心思想约定大于配置 有约束不要去违反。 Maven会规定好你该如何去编写我们Java代码必须要按照这个规范来 下载安装Maven 官网https://maven.apache.org/ 下载完成后解压即可 电脑上的所有环境都放在一个文件夹下方便管理 配置环境变量 在我们的系统环境变量中配置如下配置 M2_HOME maven目录下的bin目录MAVEN_HOME maven的目录在系统的path中配置%MAVEN_HOME%\bin 测试Maven是否安装成功保证必须配置完毕 阿里云镜像 镜像mirrors作用加速我们的下载国内建议使用阿里云的镜像 mirroridnexus-aliyun/id mirrorOf*,!jeecg,!jeecg-snapshots/mirrorOf nameNexus aliyun/name urlhttp://maven.aliyun.com/nexus/content/groups/public/url /mirror D:Enmvironment\apache-maven-3.6.2\conf\ettings.xml 狂神老师配置源和仓库的文件位置 本地仓库 在本地的仓库远程仓库 建立一个本地仓库localRepository localRepositoryD:\Environment\apache-maven-3.6.2\maven-repo/localRepository在IDEA中使用Maven 创建一个MavenWeb项目 等待项目初始化完毕 观察maven仓库中多了什么东西 IDEA中的Maven设置 注意IDEA项目创建成功后看一眼Maven的配置 到这里Maven在IDEA中的配置和使用就OK了! 创建一个普通的Maven项目 这个只有在Web应用下才会有 标记文件夹功能 配置Tomcat 解决警告问题 必须要的配置为什么会有这个问题我们访问一个网站需要指定一个文件夹名字 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4fcvZ8N-1609316574059)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228122448987.png)] pom文件 pom.xml 是Maven的核心配置文件 ?xml version1.0 encodingUTF-8?!--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/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersion!--这里就是我们刚才配置的GAV--groupIdcom.kuang/groupIdartifactIdjavaweb-01-maven/artifactIdversion1.0-SNAPSHOT/version!--Package项目的打包方式jarjava应用warJavaWeb应用--packagingwar/packaging!--配置--properties!--项目的默认构建编码--project.build.sourceEncodingUTF-8/project.build.sourceEncoding!--编码版本--maven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.target/properties!--项目依赖--dependencies!--具体依赖的jar包配置文件--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/version/dependency/dependencies!--项目构建用的东西--buildfinalNamejavaweb-01-maven/finalNamepluginManagement!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --pluginspluginartifactIdmaven-clean-plugin/artifactIdversion3.1.0/version/plugin!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --pluginartifactIdmaven-resources-plugin/artifactIdversion3.0.2/version/pluginpluginartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/version/pluginpluginartifactIdmaven-surefire-plugin/artifactIdversion2.22.1/version/pluginpluginartifactIdmaven-war-plugin/artifactIdversion3.2.2/version/pluginpluginartifactIdmaven-install-plugin/artifactIdversion2.5.2/version/pluginpluginartifactIdmaven-deploy-plugin/artifactIdversion2.8.2/version/plugin/plugins/pluginManagement/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 /buildIDEA操作 解决遇到的问题 Maven 3.6.2 解决方法降级为3.6.1 Tomcat闪退 IDEA中每次都要重复配置Maven 在IDEA中的全局默认配置中去配置 Maven项目中Tomcat无法配置 maven默认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-appMaven仓库的使用 地址https://mvnrepository.com/ 设置响应编码 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcrIQ7YZ-1609316574062)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228135608735.png)] Servlet Servlet简介 Servlet就是sun公司开发动态web的一门技术Sun在这些APi中提供一个接口叫做Servlet如果你想开发一个Servlet程序只需要完成两个小步骤 编写一个类实现Serlet接口把开发好java类部署到web服务器中。 把实现了Servlet接口的Java程序叫做Servlet HelloServlet Serlvet接口Sun公司有两个默认的实现类HttpServletGenericServled HelloServlet 构建一个普通的Maven项目删掉里面的sc目录以后我们的学习就在这个项目里面建立Moudel这个空的工程就是Maven主工程关于Maven父子工程的理解 父项目中会有 modulesmoduleservlet-01/module/modules子项目会有 parentartifactIdjavaweb-02-servlet/artifactIdgroupIdcom.kuang/groupIdversion1.0-SNAPSHOT/version/parent父项目中的java子项目可以直接使用 son extends fatherMaven环境优化 修改web.xml为最新的将maven的结构搭建完整 ?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-app2.编写一个Servlet程序 编写一个普通类实现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,Serlvet);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}} 3.编写Servlet的映射 为什么需要映射我们写的是JAVA程序但是要通过浏览器访问而浏览器需要连接web服务器所以我们需 要再web服务中注册我们写的Servlet还需给他一个浏览器能够访问的路径 !--注册Servlet--servletservlet-namehello/servlet-nameservlet-classcom.kuang.servlet.HelloServlet/servlet-class/servlet!--Servlet的请求路径--servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mapping配置Tomcat 注意配置项目发布的路径就可以了 启动测试OK 项目的一些描述信息 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OY7ikb0B-1609316574076)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228144307374.png)] Servlet原理 Servlet是由Web服务器调用web服务器在收到浏览器请求之后会 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/sajdlkajda.qinjiang--servlet-mappingservlet-namehello/servlet-nameurl-pattern*.qinjiang/url-pattern/servlet-mapping优先级问题 指定了固有的映射路径优先级最高如果找不到就会走默认的处理请求 !--404--servletservlet-nameerror/servlet-nameservlet-classcom.kuang.servlet.ErrorServlet/servlet-class/servletservlet-mappingservlet-nameerror/servlet-nameurl-pattern/*/url-pattern/servlet-mappingServletContext web容器在启动的时候它会为每个web程序都创建一个对应的ServletContext对象它代表了当前的web应用 共享数据 我在这个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 HttpServlet {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.kuang.servlet.HelloServlet/servlet-class/servletservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mappingservletservlet-namegetc/servlet-nameservlet-classcom.kuang.servlet.GetServlet/servlet-class/servletservlet-mappingservlet-namegetc/servlet-nameurl-pattern/getc/url-pattern/servlet-mapping 测试访问结果 获取初始化参数 !--配置一些web应用初始化参数--context-paramparam-nameurl/param-nameparam-valuejdbc:mysql://localhost:3306/mybatis/param-value/context-param protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();String url context.getInitParameter(url);resp.getWriter().print(url); }请求转发 Override protected 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); }读取资源文件classpath Properties 在java目录下新建properties在resources目录下新建properties 发现都被打包到了同一个路径下classes我们俗称这个路径为classpath: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U40JTNEB-1609316574078)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228164917411.png)] 思路需要一个文件流 usernameroot12312 passwordzxczxczxcpublic class ServletDemo05 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {InputStream is this.getServletContext().getResourceAsStream(/WEB-INF/classes/com/kuang/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);} } 访问测试即可ok; 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 varl,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 varl,int var2);响应的状态码 下载文件 向浏览器输出消息下载文件 要获取下载文件的路径下载的文件名是啥设置想办法让浏览器能够支持下载我们需要的东西URLEncoder.encode(fileName,“UTF-8”)获取下载文件的输入流创建缓冲区获取OutputStream对象将FileOutputStream流写入到bufer缓冲区使用OutputStream将缓冲区中的数据输出到客户端 Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 要获取下载文件的路径String realPath F:\\班级管理\\西开【19525】\\2、代码\\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;filenameURLEncoder.encode(fileName,UTF-8));// 4. 获取下载文件的输入流FileInputStream 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);}in.close();out.close(); }验证码功能 验证怎么来的? 前端实现后端实现需要用到Java的图片类生产一个图片 package com.kuang.servlet;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;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/jpeg);//网站存在缓存不让浏览器缓存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);}num sb.toString() num;return num;}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }servletservlet-nameImageServlet/servlet-nameservlet-classcom.kuang.servlet.ImageServlet/servlet-class /servlet servlet-mappingservlet-nameImageservlet/servlet-nameurl-pattern/img/url-pattern /servlet-mapping重定向 常见场景: 用户登录 void sendRedirect(String var1) throws IOException;测试 override protected void doGet(HttpservletRequest req, HttpservletResponse resp) throws ServletException, IOException {resp. sendRedirect(/r/img);//重定向/*resp. setHeader(Location,/r/img);resp. setstatus (302);* }index.jsp htmlbodyh2Hel1o World!/h2%--这里超交的路径,需要寻找到项目的路径--%%--${pageContext. request, contextPath}代表当前的项目--%form action${pageContext. request.contextPath}/login methodget用户名: input typetext nameusername br密码: input typepassword namepassword brinput typesubmit/form/body /htmlRequestTest.java public 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);resp.sendRedirect(/r/success.jsp); } } 重定向页面success.jsp % page contentTypetext/html; charsetUTF-8 languagejava % htmlheadtitleTitle/title/headbodyh1success/h1/body /htmlweb.xml配置 servletservlet-namerequset/servlet-nameservlet-classcom. kuang. servlet. RequestTest/servlet-class/servletservlet-mappingservlet-namerequset/servlet-nameurl-pattern/login/url-pattern/servlet-mapping 导入依赖的jar包 dependencies!-- https://mvnrepository. com/artifact/javax. servLet/javax. servlet-opi --dependencygroupldjavax.servlet/grouptdartifactIdjavax. servlet-api/artifactIdversion4.0.1/version/dependency!-- https://mvnrepository.com/artifact/javax. servLet.jsp/javax. servLet.jsp-opi --dependencygroupIdjavax.servlet.jsp/groupldartifactIdjavax. servlet.jsp-api/artifactIdversion2.3.3/version/dependency/dependencies/project HttpServletRequest HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器, HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息; 获取参数,请求转发 自己创建类且需要继承HttpServlet类 Override protected 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[] hobbys req.getParameterValues(hobbys);System.out.println();//后台接收中文乱码问题System. out.println(username);System. out.println(password);System. out.println(Arrays.tostring(hobbys));System. out.println();System. out.println(req.getContextPath());//通过请求转发//这里的/代表当前的web应用req.getRequestDispatcher(/success.jsp).forward(req,resp); } Cookie、Session 会话 会话用户打开一个浏览器点击了很多超链接访问多个web资源关闭浏览器这个过程可以称之为会话 有状态会话一个同学来过教室下次再来教室我们会知道这个同学曾经来过称之为有状态会话 你能怎么证明你是西开的学生 你 西开 发票 西开给你发票学校登记 西开标记你来过了 一个网站怎么证明你来过 客户端 服务端 服务端给客户端一个 信件客户端下次访问服务端带上信件就可以了 cookie服务器登记你来过了下次你来的时候我来匹配你 seesion 保存会话的两种技术 cookie 客户端技术 响应请求 session 服务器技术利用这个技术可以保存用户的会话信息 我们可以把信息或者数据放在Session中 常见常见网站登录之后你下次不用再登录了第二次访问直接就上去了 Cookie 从请求中拿到cookie信息服务器响应给客户端cookie Cookie[] cookies req.getCookies(); //获得Cookie cookie.getName(); //获得cookie中的key cookie.getValue(); //获得cookie中的vlaue new Cookie(lastLoginTime, System.currentTimeMillis()); //新建一个cookie cookie.setMaxAge(24*60*60); //设置cookie的有效期 resp.addCookie(cookie); //响应给客户端一个cookiecookie一般会保存在本地的 用户目录下 appdata 一个网站cookie是否存在上限聊聊细节问题 一个Cookie只能保存一个信息一个web站点可以给浏览器发送多个cookie最多存放20个cookieCookie大小有限制4kb300个cookie浏览器上限 删除Cookie 不设置有效期关闭浏览器 自动失效设置有效期时间为 0 编码解码 URLEncoder.encode(秦疆,utf-8) URLDecoder.decode(cookie.getValue(),UTF-8)package com.kuang.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; import java.util.concurrent.CopyOnWriteArrayList;public class CookieDemo01 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding(utf-8);resp.setCharacterEncoding(utf-8);PrintWriter out resp.getWriter();Cookie[] cookies req.getCookies();if(cookies!null){out.write(nishangyici);for (int i 0; i cookies.length; i) {Cookie cookie cookies[i];if(cookie.getName().equals(lastLoginTime)){long lastLoginTime Long.parseLong(cookie.getValue());Date date new Date(lastLoginTime);out.write(date.toLocaleString());}}}else{out.write(zheshinidiyici);}Cookie cookie new Cookie(lastLoginTime, System.currentTimeMillis() );resp.addCookie(cookie);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }Session重点 什么是Session 服务器会给每一个用户浏览器创建一个Seesion对象一个Seesion独占一个浏览器只要浏览器没有关闭这个Session就存在用户登录之后整个网站它都可以访问– 保存用户的信息保存购物车的信息…… … … … Session和cookie的区别 Cookie是把用户的数据写给用户的浏览器浏览器保存 可以保存多个Session把用户的数据写到用户独占Session中服务器端保存 保存重要的信息减少服务器资源的浪费Session对象由服务器创建 使用场景 保存一个登录用户的信息购物车信息在整个网站中经常会使用的数据我们将它保存在Session中 使用Session package com.kuang.servlet;import com.kuang.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 {//解决乱码问题req.setCharacterEncoding(UTF-8);resp.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);} } //得到Session HttpSession session req.getSession();Person person (Person) session.getAttribute(name);System.out.println(person.toString());HttpSession session req.getSession(); session.removeAttribute(name); //手动注销Session session.invalidate();会话自动过期web.xml配置 !--设置Session默认的失效时间-- session-config!--15分钟后Session自动失效以分钟为单位--session-timeout15/session-timeout /session-config [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4J5UtIGc-1609316574080)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228235433351.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10fKYsof-1609316574081)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228235656922.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Jx56kug-1609316574081)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201228235902022.png)] JSP原理 思路JSP到底怎么执行的 代码层面没有任何问题 服务器内部工作 tomcat中有一个work目录 IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录 我电脑的地址 C:\Users\Administrator.IntelliJIdea2018.1\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp 发现页面转变成了Java程序 浏览器向服务器发送请求不管访问什么资源其实都是在访问Servlet JSP最终也会被转换成为一个Java类 全部导入jar [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DU0SNvFS-1609316574085)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229001204098.png)] JSP 本质上就是一个Servlet [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tXkc1m6-1609316574087)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229002724413.png)] //初始化public void _jspInit() {} //销毁public void _jspDestroy() {} //JSPServicepublic void _jspService(.HttpServletRequest request,HttpServletResponse response)判断请求 内置一些对象 final javax.servlet.jsp.PageContext pageContext; //页面上下文 javax.servlet.http.HttpSession session null; //session final javax.servlet.ServletContext application; //applicationContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out null; //out final java.lang.Object page this; //page当前 HttpServletRequest request //请求 HttpServletResponse response //响应 12345678输出页面前增加的代码 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; 123456789以上的这些个对象我们可以在JSP页面中直接使用 在JSP页面中 只要是 JAVA代码就会原封不动的输出 如果是HTML代码就会被转换为 out.write(html\r\n);这样的格式输出到前端 JSP基础语法 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4py4yRQ-1609316574089)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229003705147.png)] 任何语言都有自己的语法JAVA中有,。 JSP 作为java技术的一种应用它拥有一些自己扩充的语法了解知道即可Java所有语法都支持 ?xml version1.0 encodingUTF-8?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/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdTEST02/artifactIdversion1.0-SNAPSHOT/versionpackagingwar/packagingnameTEST02 Maven Webapp/name!-- FIXME change it to the projects website --urlhttp://www.example.com/urlpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.7/maven.compiler.sourcemaven.compiler.target1.7/maven.compiler.target/propertiesdependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency!--Servlet依赖--!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/version/dependency!-- JSP依赖--!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjavax.servlet.jsp-api/artifactIdversion2.3.3/version/dependency!--jstl表达式依赖--dependencygroupIdjavax.servlet.jsp.jstl/groupIdartifactIdjstl-api/artifactIdversion1.2/version/dependency!--standard标签库--dependencygroupIdtaglibs/groupIdartifactIdstandard/artifactIdversion1.1.2/version/dependency/dependenciesbuildfinalNameTEST02/finalNamepluginManagement!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --pluginspluginartifactIdmaven-clean-plugin/artifactIdversion3.1.0/version/plugin!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --pluginartifactIdmaven-resources-plugin/artifactIdversion3.0.2/version/pluginpluginartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/version/pluginpluginartifactIdmaven-surefire-plugin/artifactIdversion2.22.1/version/pluginpluginartifactIdmaven-war-plugin/artifactIdversion3.2.2/version/pluginpluginartifactIdmaven-install-plugin/artifactIdversion2.5.2/version/pluginpluginartifactIdmaven-deploy-plugin/artifactIdversion2.8.2/version/plugin/plugins/pluginManagement/build /project[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4rVwFF33-1609316574092)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229004718836.png)] JSP表达式 %--JSP表达式作用用来将程序的输出输出到客户端% 变量或者表达式%--%% new java.util.Date()% jsp脚本片段 %--jsp脚本片段--%%int sum 0;for (int i 1; i 100 ; i) {sumi;}out.println(h1Sumsum/h1);% 脚本片段的再实现 %int x 10;out.println(x);%p这是一个JSP文档/p%int y 2;out.println(y);%hr%--在代码嵌入HTML元素--%%for (int i 0; i 5; i) {%h1Hello,World %i% /h1%}%JSP声明 %!static {System.out.println(Loading Servlet!);}private int globalVar 0;public void kuang(){System.out.println(进入了方法Kuang);}%JSP声明会被编译到JSP生成Java的类中其他的就会被生成到_jspService方法中 在JSP嵌入Java代码即可 %% %% %!%%--注释--%JSP的注释不会在客户端显示HTML就会 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网页主体/h1 jsp:include page/common/footer.jsp/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0UOaBRqZ-1609316574095)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229102752359.png)] 9大内置对象 PageContext 存东西Request 存东西ResponseSession 存东西Application 【SerlvetContext】 存东西config 【SerlvetConfig】outpage 不用了解exception pageContext.setAttribute(name1,秦疆1号); //保存的数据只在一个页面中有效 request.setAttribute(name2,秦疆2号); //保存的数据只在一次请求中有效请求转发会携带这个数据 session.setAttribute(name3,秦疆3号); //保存的数据只在一次会话中有效从打开浏览器到关闭浏览器 application.setAttribute(name4,秦疆4号); //保存的数据只在服务器中有效从打开服务器到关闭服务器request客户端向服务器发送请求产生的数据用户看完就没用了比如新闻用户看完没用的 session客户端向服务器发送请求产生的数据用户用完一会还有用比如购物车 application客户端向服务器发送请求产生的数据一个用户用完了其他用户还可能使用比如聊天数据 JSP标签、JSTL标签、EL表达式 !-- JSTL表达式的依赖 -- dependencygroupIdjavax.servlet.jsp.jstl/groupIdartifactIdjstl-api/artifactIdversion1.2/version /dependency !-- standard标签库 -- dependencygroupIdtaglibs/groupIdartifactIdstandard/artifactIdversion1.1.2/version /dependency EL表达式 ${ } 获取数据执行运算获取web开发的常用对象 JSP标签 %--jsp:include--%%-- http://localhost:8080/jsptag.jsp?namekuangshenage12 --%jsp:forward page/jsptag2.jspjsp:param namename valuekuangshen/jsp:paramjsp:param nameage value12/jsp:param /jsp:forwardJSTL表达式 JSTL标签库的使用就是为了弥补HTML标签的不足它自定义许多标签可以供我们使用标签的功能和Java代码一样 格式化标签 SQL标签 XML 标签 核心标签 掌握部分 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f58b9NIx-1609316574097)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229112309307.png)] JSTL标签库使用步骤 引入对应的 taglib使用其中的方法在Tomcat 也需要引入 jstl的包否则会报错JSTL解析错误 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ntzkg4IC-1609316574099)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229122605140.png)] cif 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}//bodyc:choose c:when body%--定义一个变量score值为85--% 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/bodyc:forEach %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 step1 c:out value${people}/ br /c:forEachJavaBean 实体类 JavaBean有特定的写法 必须要有一个无参构造属性必须私有化必须有对应的get/set方法 一般用来和数据库的字段做映射 ORM ORM 对象关系映射 表—类字段–属性行记录----对象 people表 idnameageaddress1秦疆1号3西安2秦疆2号18西安3秦疆3号100西安 class People{private int id;private String name;private int id;private String address; }class A{new People(1,秦疆1号,3西安);new People(2,秦疆2号,3西安);new People(3,秦疆3号,3西安); }过滤器文件上传邮件发送JDBC 复习 如何使用JDBC , JDBC crud jdbc 事务 MVC三层架构 什么是MVC Model view Controller 模型、视图、控制器 以前的架构 用户直接访问控制层控制层就可以直接操作数据库 servlet--CRUD--数据库 弊端程序十分臃肿不利于维护 servlet的代码中处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码架构没有什么是加一层解决不了的 程序猿调用 ↑ JDBC 实现该接口 ↑ Mysql Oracle SqlServer ....不同厂商MVC三层架构 Model 业务处理 业务逻辑Service数据持久层CRUD Dao - 数据持久化对象 View 展示数据提供链接发起Servlet请求 aformimg… Controller Servlet 接收用户的请求 req请求参数、Session信息…. 交给业务层处理对应的代码 控制视图的跳转 登录---接收用户的登录请求---处理用户的请求获取用户登录的参数usernamepassword----交给业务层处理登录业务判断用户名密码是否正确事务---Dao层查询用户名和密码是否正确--数据库Filter 重点 比如 Shiro安全框架技术就是用Filter来实现的 Filter过滤器 用来过滤网站的数据 处理中文乱码登录验证…. 比如用来过滤网上骂人的话我***我自己 0-0 Filter开发步骤 导包 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKFVbqYl-1609316574102)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229132428680.png)] dependencygroupIdjavax.servlet/groupIdartifactIdservlet-api/artifactIdversion2.5/version /dependency dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjavax.servlet.jsp-api/artifactIdversion2.3.3/version /dependencydependencygroupIdjavax.servlet.jsp.jstl/groupIdartifactIdjstl-api/artifactIdversion1.2/version /dependency dependencygroupIdtaglibs/groupIdartifactIdstandard/artifactIdversion1.1.2/version /dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency2.编写过滤器 导包不要错 注意 实现Filter接口重写对应的方法即可 public class CharacterEncodingFilter implements Filter {//初始化web服务器启动就以及初始化了随时等待过滤对象出现public void init(FilterConfig filterConfig) throws ServletException {System.out.println(CharacterEncodingFilter初始化);}//Chain : 链/*1. 过滤中的所有代码在过滤特定请求的时候都会执行2. 必须要让过滤器继续同行chain.doFilter(request,response);*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(utf-8);response.setCharacterEncoding(utf-8);response.setContentType(text/html;charsetUTF-8);System.out.println(CharacterEncodingFilter执行前....);chain.doFilter(request,response); //让我们的请求继续走如果不写程序到这里就被拦截停止System.out.println(CharacterEncodingFilter执行后....);}//销毁web服务器关闭的时候过滤器会销毁public void destroy() {System.out.println(CharacterEncodingFilter销毁);}} 1. 在web.xml中配置 Filterfilterfilter-nameCharacterEncodingFilter/filter-namefilter-classcom.kuang.filter.CharacterEncodingFilter/filter-class/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-name!--只要是 /servlet的任何请求会经过这个过滤器--url-pattern/servlet/*/url-pattern!--url-pattern/*/url-pattern--!-- 别偷懒写个 /* --/filter-mapping 监听器 实现一个监听器的接口有n种监听器 让开始的时候人数为1 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUr3baNY-1609316574106)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229141531472.png)] 编写一个监听器 实现监听器的接口… 依赖的jar包 //统计网站在线人数 统计session public class OnlineCountListener implements HttpSessionListener {//创建session监听 看你的一举一动//一旦创建Session就会触发一次这个事件public void sessionCreated(HttpSessionEvent se) {ServletContext ctx se.getSession().getServletContext();System.out.println(se.getSession().getId());Integer onlineCount (Integer) ctx.getAttribute(OnlineCount);if (onlineCountnull){onlineCount new Integer(1);}else {int count onlineCount.intValue();onlineCount new Integer(count1);}ctx.setAttribute(OnlineCount,onlineCount);}//销毁session监听//一旦销毁Session就会触发一次这个事件public void sessionDestroyed(HttpSessionEvent se) {ServletContext ctx se.getSession().getServletContext();Integer onlineCount (Integer) ctx.getAttribute(OnlineCount);if (onlineCountnull){onlineCount new Integer(0);}else {int count onlineCount.intValue();onlineCount new Integer(count-1);}ctx.setAttribute(OnlineCount,onlineCount);}/*Session销毁1. 手动销毁 getSession().invalidate();2. 自动销毁*/ } web.xml中注册监听器 !--注册监听器-- listenerlistener-classcom.kuang.listener.OnlineCountListener/listener-class /listener看情况是否使用 h1当前有span%this.getServletConfig().getServletContext().getAttribute(OnlineCount)%/span人在线/h1过滤器、监听器常见应用 监听器GUI编程中经常使用 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 WindowAdapter() {Overridepublic void windowClosing(WindowEvent e) {super.windowClosing(e);}});} }用户登录之后才能进入主页用户注销后就不能进入主页了 用户登录之后向Sesison中放入用户的数据 进入主页的时候要判断用户是否已经登录要求在过滤器中实现 HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp;if (request.getSession().getAttribute(Constant.USER_SESSION)null){response.sendRedirect(/error.jsp); }chain.doFilter(request,response);[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RPdJatm-1609316574109)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229151643266.png)] 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; 导入数据库依赖 !--mysql的驱动-- dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version /dependencyIDEA中连接数据库 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ir0qBVC9-1609316574113)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229152523631.png)] JDBC 固定步骤 加载驱动连接数据库,代表数据库向数据库发送SQL的对象Statement : CRUD编写SQL 根据业务不同的SQL执行SQL关闭连接先开的后关 public class TestJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException {//配置信息//useUnicodetruecharacterEncodingutf-8 解决中文乱码String urljdbc:mysql://localhost:3306/jdbc?useUnicodetruecharacterEncodingutf-8;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 public class TestJDBC2 {public static void main(String[] args) throws Exception {//配置信息//useUnicodetruecharacterEncodingutf-8 解决中文乱码String urljdbc:mysql://localhost:3306/jdbc?useUnicodetruecharacterEncodingutf-8;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 users(id, name, password, email, birthday) values (?,?,?,?,?);;//4.预编译PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,2);//给第一个占位符 的值赋值为1preparedStatement.setString(2,狂神说Java);//给第二个占位符 的值赋值为狂神说JavapreparedStatement.setString(3,123456);//给第三个占位符 的值赋值为123456preparedStatement.setString(4,24736743qq.com);//给第四个占位符 的值赋值为1preparedStatement.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() 关闭事务转账 A:1000 B:1000A(900) --100-- B(1100) Junit单元测试 依赖 !--单元测试-- dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version /dependency简单使用 Test注解只有在方法上有效只要加了这个注解的方法就可以直接运行 Test public void test(){System.out.println(Hello); }失败的时候是红色 搭建一个环境 CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(40),money FLOAT );INSERT INTO account(name,money) VALUES(A,1000); INSERT INTO account(name,money) VALUES(B,1000); INSERT INTO account(name,money) VALUES(C,1000);Testpublic void test() {//配置信息//useUnicodetruecharacterEncodingutf-8 解决中文乱码String urljdbc:mysql://localhost:3306/jdbc?useUnicodetruecharacterEncodingutf-8;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 sql update account set money money-100 where name A;connection.prepareStatement(sql).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);} catch (Exception e) {try {//如果出现异常就通知数据库回滚事务connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}SMBMS(超市管理项目) SMBMS(超市管理项目) 数据库 项目如何搭建 考虑是不是用maven jar包依赖 搭建项目准备工作 搭建一个maven web 项目 配置Tomcat 测试项目是否能够跑起来 导入项目中需要的jar包; jspServletmysql驱动jstlstand… 构建项目包结构 编写实体类 ROM映射:表-类映射 编写基础公共类 1、数据库配置文件mysql5.xx和8.xx的编写有差异 drivercom.mysql.jdbc.Driver #在和mysql传递数据的过程中使用unicode编码格式并且字符集设置为utf-8 urljdbc:mysql://127.0.0.1:3306/smbms?useSSLfalseuseUnicodetruecharacterEncodingutf-8 userroot passwordroot2、编写数据库的公共类 package dao;import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties;/*** 操作数据库的基类--静态类* author Administrator**/ public class BaseDao {static{//静态代码块,在类加载的时候执行init();}private static String driver;private static String url;private static String user;private static String password;//初始化连接参数,从配置文件里获得public static void init(){Properties paramsnew Properties();String configFile database.properties;InputStream isBaseDao.class.getClassLoader().getResourceAsStream(configFile);try {params.load(is);} catch (IOException e) {e.printStackTrace();}driverparams.getProperty(driver);urlparams.getProperty(url);userparams.getProperty(user);passwordparams.getProperty(password);} /*** 获取数据库连接* return*/public static Connection getConnection(){Connection connection null;try {Class.forName(driver);connection DriverManager.getConnection(url, user, password);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return connection;}/*** 查询操作* param connection* param pstm* param rs* param sql* param params* return*/public static ResultSet execute(Connection connection,PreparedStatement pstm,ResultSet rs,String sql,Object[] params) throws Exception{pstm connection.prepareStatement(sql);for(int i 0; i params.length; i){pstm.setObject(i1, params[i]);}rs pstm.executeQuery();return rs;}/*** 更新操作* param connection* param pstm* param sql* param params* return* throws Exception*/public static int execute(Connection connection,PreparedStatement pstm,String sql,Object[] params) throws Exception{int updateRows 0;pstm connection.prepareStatement(sql);for(int i 0; i params.length; i){pstm.setObject(i1, params[i]);}updateRows pstm.executeUpdate();return updateRows;}/*** 释放资源* param connection* param pstm* param rs* return*/public static boolean closeResource(Connection connection,PreparedStatement pstm,ResultSet rs){boolean flag true;if(rs ! null){try {rs.close();rs null;//GC回收} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();flag false;}}if(pstm ! null){try {pstm.close();pstm null;//GC回收} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();flag false;}}if(connection ! null){try {connection.close();connection null;//GC回收} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();flag false;}}return flag;}}. 3、编写字符编码过滤器 导入静态资源 登录功能实现 编写前端页面设置首页 1.设置欢迎首页 welcome-file-listwelcome-filelogin.jsp/welcome-file/welcome-file-list编写dao层登录用户登录的接口 public User getLoginUser(Connection connection, String userCode) throws Exception;编写dao层接口的实现类 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet;import dao.BaseDao; import pojo.User;public class UserDaoImpl implements UserDao{//持久层只做查询数据库的内容public User getLoginUser(Connection connection, String userCode) throws Exception{//准备三个对象PreparedStatement pstm null;ResultSet rs null;User user null;//判断是否连接成功if(null ! connection){String sql select * from smbms_user where userCode?;Object[] params {userCode};rs BaseDao.execute(connection, pstm, rs, sql, params);if(rs.next()){user new User();user.setId(rs.getInt(id));user.setUserCode(rs.getString(userCode));user.setUserName(rs.getString(userName));user.setUserPassword(rs.getString(userPassword));user.setGender(rs.getInt(gender));user.setBirthday(rs.getDate(birthday));user.setPhone(rs.getString(phone));user.setAddress(rs.getString(address));user.setUserRole(rs.getInt(userRole));user.setCreatedBy(rs.getInt(createdBy));user.setCreationDate(rs.getTimestamp(creationDate));user.setModifyBy(rs.getInt(modifyBy));user.setModifyDate(rs.getTimestamp(modifyDate));}BaseDao.closeResource(null, pstm, rs);}return user;} } 业务层接口 //用户登录 public User login(String userCode, String userPassword); 业务层实现类 import java.sql.Connection;//import org.junit.Test;import dao.BaseDao; import dao.user.UserDao; import dao.user.UserDaoImpl; import pojo.User;public class UserServiceImpl implements UserService{//业务层都会调用dao层.所以我们要引入Dao层重点//只处理对应业务private UserDao userDao;public UserServiceImpl(){userDao new UserDaoImpl();}public User login(String userCode,String userPassword) {// TODO Auto-generated method stubConnection connection null;//通过业务层调用对应的具体数据库操作User user null;try {connection BaseDao.getConnection();user userDao.getLoginUser(connection, userCode);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return user;}/*Testpublic void test() {UserServiceImpl userService new UserServiceImpl();String userCode admin;String userPassword 12345678;User admin userService.login(userCode, userPassword);System.out.println(admin.getUserPassword());}*/ } 编写Servlet import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import pojo.User; import util.Constants; import service.user.UserService; import service.user.UserServiceImpl;SuppressWarnings(serial) public class LoginServlet extends HttpServlet{//接受用户参数、调用业务层、转发视图Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO 自动生成的方法存根System.out.println(login );//获取用户名和密码String userCode req.getParameter(userCode);String userPassword req.getParameter(userPassword);//调用service方法进行用户匹配UserService userService new UserServiceImpl();User user userService.login(userCode,userPassword);if(null ! user){//登录成功//放入sessionreq.getSession().setAttribute(Constants.USER_SESSION,user);//页面跳转frame.jspresp.sendRedirect(jsp/frame.jsp);}else{//页面跳转login.jsp带出提示信息--转发req.setAttribute(error, 用户名或密码不正确);req.getRequestDispatcher(login.jsp).forward(req,resp);}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO 自动生成的方法存根doGet(req, resp);} }注册Servlet servletservlet-nameLoginServlet/servlet-nameservlet-classcom.kuang.servlet.user.LoginServlet/servlet-class /servlet servlet-mappingservlet-nameLoginServlet/servlet-nameurl-pattern/login.do/url-pattern /servlet-mapping测试访问,保证以上功能可以成功 登录功能优化 注销功能 思路移除session返回登录页面 public class LogoutServlet extends HttpServlet {public void doPOST(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//清除sessionrequest.getSession().removeAttribute(Constants.USER_SESSION);response.sendRedirect(request.getContextPath()/login.jsp);//返回登录页面}} 注册xml servletservlet-nameLogoutServlet/servlet-nameservlet-classservlet.user.LogoutServlet/servlet-class /servlet servlet-mappingservlet-nameLogoutServlet/servlet-nameurl-pattern/jsp/logout.do/url-pattern /servlet-mapping登录拦截优化 编写一个过滤器并注册 import java.io.IOException;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import pojo.User; import util.Constants;public class SysFilter implements Filter{public void init(FilterConfig filterConfig) throws ServletException{}Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {// TODO 自动生成的方法存根HttpServletRequest request (HttpServletRequest)req;HttpServletResponse response (HttpServletResponse)resp;//过滤器从session中获取用户User user (User)request.getSession().getAttribute(Constants.USER_SESSION);if(user null){//已经被移除或者注销了或者未登录response.sendRedirect(/smbms/error.jsp);}else {chain.doFilter(req, resp);}}Overridepublic void destroy() {// TODO 自动生成的方法存根} } 注册xml !-- 用户登录过滤器 -- filterfilter-nameSysFilter/filter-namefilter-classfilter.SysFilter/filter-class /filter filter-mappingfilter-nameSysFilter/filter-nameurl-pattern/jsp/*/url-pattern /filter-mapping测试登录注销权限都要保证OK js乱码解决 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6aB8YiOC-1609316574114)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201229213417430.png)] 密码修改 导入前端素材 lia href${pageContext.request.contextPath }/jsp/pwdmodify.jsp密码修改/a/li写项目建议从底层向上写 UserDao接口 //修改当前用户密码public int updatePwd(Connection connection,int id,int password)throws SQLException, Exception;UserDao接口实现类 Override//修改当前密码public int updatePwd(Connection connection, int id, String password) throws Exception {// TODO 自动生成的方法存根PreparedStatement pstm null;int execute 0;if(connection!null) {String sql update smbms_user set userPassword ? where id ?;Object[] params {password,id};execute BaseDao.execute(connection, pstm, sql, params);BaseDao.closeResource(null, pstm, null);}return execute; } UserService层 public boolean updatePwd(int id,String password)throws SQLException, Exception;UserService实现类 public boolean updatePwd(int id, String password) throws SQLException, Exception {// TODO 自动生成的方法存根Connection connection null;boolean flag false;//修改密码try {connection BaseDao.getConnection();if(userDao.updatePwd(connection, id, password)0) {flag true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();} finally {BaseDao.closeResource(connection, null, null);}return flag;}servlet记得实现复用要提取出方法 在 dao层 和 service层 自己写映射类和实现类 下面是 servlet层 的主体 public class UserServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO 自动生成的方法存根String method req.getParameter(method);if (method ! savepwd method ! null) {this.updatePwd(req, resp);}//实现复用~~~~~~// 想添加新的增删改查直接用if(method ! savepwd method ! null);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO 自动生成的方法存根doGet(req, resp);}public void updatePwd(HttpServletRequest req, HttpServletResponse resp) {// 通过session获得用户idObject o req.getSession().getAttribute(Constants.USER_SESSION);String newpassword req.getParameter(newpassword);boolean flag false;if (o ! null newpassword ! null) {UserService userService new UserServiceImpl();try {flag userService.updatePwd(((User) o).getId(), newpassword);} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}if (flag) {req.setAttribute(message, 密码修改成功请退出使用新密码登录);// 密码修改成功,移除session(移除后不能再次修改密码,建议不移除)req.getSession().removeAttribute(Constants.USER_SESSION);} else {// 密码修改失败req.setAttribute(message, 密码修改失败);}} else {// 密码修改有问题req.setAttribute(message, 新密码有问题);}try {req.getRequestDispatcher(/jsp/pwdmodify.jsp).forward(req, resp);} catch (ServletException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}} } 注册xml servletservlet-nameUserServlet/servlet-nameservlet-classservlet.user.UserServlet/servlet-class/servletservlet-mappingservlet-nameUserServlet/servlet-nameurl-pattern/jsp/user.do/url-pattern/servlet-mapping测试 优化密码修改使用Ajax 阿里巴巴的fastjson !-- https://mvnrepository.com/artifact/com.alibaba/fastjson -- dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.68/version /dependency后台代码修改 导入阿里的包 !-- https://mvnrepository.com/artifact/com.alibaba/fastjson -- dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.68/version /dependency package com.kuang.servlet.user;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.kuang.pojo.User; import com.kuang.service.user.UserService; import com.kuang.service.user.UserServiceImpl; import com.kuang.util.Constants; import com.mysql.jdbc.StringUtils;import javax.servlet.ServletException; 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.sql.SQLException; import java.util.HashMap; import java.util.Map;SuppressWarnings(serial) public class UserServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO 自动生成的方法存根String method req.getParameter(method);if (method.equals( savepwd) method ! null) {this.updatePwd(req, resp);}else if (method.equals( pwdmodify) method ! null) {this.pwdmodify(req, resp);}// 想添加新的增删改查直接用if(method ! savepwd method ! null);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO 自动生成的方法存根doGet(req, resp);}public void updatePwd(HttpServletRequest req, HttpServletResponse resp) {// 通过session获得用户idObject o req.getSession().getAttribute(Constants.USER_SESSION);String newpassword req.getParameter(newpassword);boolean flag false;if (o ! null newpassword ! null) {UserService userService new UserServiceImpl();try {flag userService.updatePwd(((User) o).getId(), newpassword);} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}if (flag) {req.setAttribute(message, 密码修改成功请退出使用新密码登录);// 密码修改成功,移除session(移除后不能再次修改密码,建议不移除)req.getSession().removeAttribute(Constants.USER_SESSION);} else {// 密码修改失败req.setAttribute(message, 密码修改失败);}} else {// 密码修改有问题req.setAttribute(message, 新密码有问题);}try {req.getRequestDispatcher(/jsp/pwdmodify.jsp).forward(req, resp);} catch (ServletException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}public void pwdmodify(HttpServletRequest req, HttpServletResponse resp) {// 通过session获得用户idObject o req.getSession().getAttribute(Constants.USER_SESSION);String oldpassword req.getParameter(oldpassword);MapString, String resultMap new HashMapString, String();if(onull) {//session失效session过期了resultMap.put(result,seesionerror);}else if(StringUtils.isNullOrEmpty(oldpassword)){//输入密码为空resultMap.put(result,error);}else {//String userPassword ((User)o).getUserPassword();//seesion中的用户密码if(oldpassword.equals(userPassword)) {resultMap.put(result,true);}else {resultMap.put(result,false);}}try {resp.setContentType(application/josn);PrintWriter writer resp.getWriter();/** resultMap [result,sessionerror,result,error]* josn格式{key,value*///writer.write(JSONArray.toJSONString(resultMap));writer.write(JSONArray.toJSONString(resultMap));writer.flush();writer.close();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}} } 测试 用户管理实现 导入分页的工具类-PageSupport用户列表页面导入-userlist.jsp 1、获取用户数量 UserDao //根据用户名或者角色查询用户总数 public int getUserCount(Connection connection,String username ,int userRole)throws SQLException, Exception;UserDaoImpl Overridepublic int getUserCount(Connection connection, String userName, int userRole)throws Exception {// TODO Auto-generated method stubPreparedStatement pstm null;ResultSet rs null;int count 0;if(connection ! null){StringBuffer sql new StringBuffer();sql.append(select count(1) as count from smbms_user u,smbms_role r where u.userRole r.id);ListObject list new ArrayListObject();if(!StringUtils.isNullOrEmpty(userName)){sql.append( and u.userName like ?);list.add(%userName%);}if(userRole 0){sql.append( and u.userRole ?);list.add(userRole);}Object[] params list.toArray();System.out.println(sql ---- sql.toString());rs BaseDao.execute(connection, pstm, rs, sql.toString(), params);if(rs.next()){count rs.getInt(count);}BaseDao.closeResource(null, pstm, rs);}return count;}UserService //查询记录数public int getUserCount(String username, int userRole);UserServiceImpl //查询记录数Overridepublic int getUserCount(String queryUserName, int queryUserRole) {// TODO Auto-generated method stubConnection connection null;int count 0;System.out.println(queryUserName ---- queryUserName);System.out.println(queryUserRole ---- queryUserRole);try {connection BaseDao.getConnection();count userDao.getUserCount(connection, queryUserName,queryUserRole);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}//System.out.println(countcount);return count;}2、获取用户列表 1.UserDao //通过条件查询-userListpublic ListUser getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize)throws Exception;UserDaoImpl Overridepublic ListUser getUserList(Connection connection, String userName,int userRole,int currentPageNo, int pageSize)throws Exception {// TODO Auto-generated method stubPreparedStatement pstm null;ResultSet rs null;ListUser userList new ArrayListUser();if(connection ! null){StringBuffer sql new StringBuffer();sql.append(select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole r.id);ListObject list new ArrayListObject();if(!StringUtils.isNullOrEmpty(userName)){sql.append( and u.userName like ?);list.add(%userName%);}if(userRole 0){sql.append( and u.userRole ?);list.add(userRole);}//在数据库中分页显示 limit startIndexpageSize总数//当前页 (当前页-1)*页面大小//0,5 1,0 01234//5,5 5,0 56789//10,5 10,0 10~sql.append( order by creationDate DESC limit ?,?);currentPageNo (currentPageNo-1)*pageSize;list.add(currentPageNo);list.add(pageSize);Object[] params list.toArray();System.out.println(sql ---- sql.toString());rs BaseDao.execute(connection, pstm, rs, sql.toString(), params);while(rs.next()){User _user new User();_user.setId(rs.getInt(id));_user.setUserCode(rs.getString(userCode));_user.setUserName(rs.getString(userName));_user.setGender(rs.getInt(gender));_user.setBirthday(rs.getDate(birthday));_user.setPhone(rs.getString(phone));_user.setUserRole(rs.getInt(userRole));_user.setUserRoleName(rs.getString(userRoleName));userList.add(_user);}BaseDao.closeResource(null, pstm, rs);}return userList;}UserService //根据条件查询用户列表public ListUser getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize);UserServiceImpl Overridepublic ListUser getUserList(String queryUserName,int queryUserRole,int currentPageNo, int pageSize) {// TODO Auto-generated method stubConnection connection null;ListUser userList null;System.out.println(queryUserName ---- queryUserName);System.out.println(queryUserRole ---- queryUserRole);System.out.println(currentPageNo ---- currentPageNo);System.out.println(pageSize ---- pageSize);try {connection BaseDao.getConnection();userList userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return userList;}3、获取角色操作 为了我们的职责统一我们可以把角色的操作单独放在一个包中和pojo类对应。。。 RoleDao //获取角色列表public ListRole getRoleList(Connection connection)throws Exception;RoleDaoIpml public class RoleDaoImpl implements RoleDao {Overridepublic ListRole getRoleList(Connection connection) throws Exception {PreparedStatement pstm null;ResultSet rs null;ListRole roleList new ArrayListRole();if (connection ! null) {String sql select * from smbms_role;Object[] params {};rs BaseDao.execute(connection, pstm, rs, sql, params);while (rs.next()) {Role _role new Role();_role.setId(rs.getInt(id));_role.setRoleCode(rs.getString(roleCode));_role.setRoleName(rs.getString(roleName));roleList.add(_role);}BaseDao.closeResource(null, pstm, rs);}return roleList;} }[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kceXSlcC-1609316574117)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201230094842460.png)] RoleService public interface RoleService {//角色列表查询public ListRole getRoleList(); }RoleServiceIpml public class RoleServiceImpl implements RoleService{private RoleDao roleDao;public RoleServiceImpl(){roleDao new RoleDaoImpl();}Overridepublic ListRole getRoleList() {Connection connection null;ListRole roleList null;try {connection BaseDao.getConnection();roleList roleDao.getRoleList(connection);} catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return roleList;}}4、用户显示的Servlet 获取用户前端的数据查询判断请求是否需要执行看参数的值判断为了实现分页需要计算出当前页面和总页面页面大小…用户列表展示返回前端 //重点、难点private void query(HttpServletRequest req, HttpServletResponse resp) {// TODO 自动生成的方法存根//查询用户列表//从前端获取数据//查询用户列表String queryUserName req.getParameter(queryname);String temp req.getParameter(queryUserRole);String pageIndex req.getParameter(pageIndex);int queryUserRole 0;//获取用户列表UserServiceImpl userService new UserServiceImpl();ListUser userList null;//第一此请求肯定是走第一页页面大小固定的//设置页面容量int pageSize 5;//把它设置在配置文件里,后面方便修改//当前页码int currentPageNo 1;if(queryUserName null){queryUserName ;}if(temp ! null !temp.equals()){queryUserRole Integer.parseInt(temp);}if(pageIndex ! null) {currentPageNo Integer.parseInt(pageIndex);}//获取用户总数分页 上一页下一页的情况//总数量表 int totalCount userService.getUserCount(queryUserName,queryUserRole);//总页数支持PageSupport pageSupport new PageSupport();pageSupport.setCurrentPageNo(currentPageNo);pageSupport.setPageSize(pageSize);pageSupport.setTotalCount(totalCount);int totalPageCount pageSupport.getTotalPageCount();//总共有几页//(totalCountpageSize-1/pageSize)取整// pageSupport.getTotalCount()//System.out.println(totalCount totalCount);//System.out.println(pageSize pageSize);//System.out.println(totalPageCount totalPageCount);//控制首页和尾页//如果页面小于 1 就显示第一页的东西if(currentPageNo 1) {currentPageNo 1;}else if(currentPageNo totalPageCount) {//如果页面大于了最后一页就显示最后一页currentPageNo totalPageCount;}userList userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);req.setAttribute(userList, userList);RoleServiceImpl roleService new RoleServiceImpl();ListRole roleList roleService.getRoleList();req.setAttribute(roleList, roleList);req.setAttribute(totalCount, totalCount); req.setAttribute(currentPageNo, currentPageNo);req.setAttribute(totalPageCount, totalPageCount);req.setAttribute(queryUserName, queryUserName);req.setAttribute(queryUserRole, queryUserRole);//返回前端try {req.getRequestDispatcher(userlist.jsp).forward(req, resp);} catch (ServletException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}} 小黄鸭调试法自言自语 项目原理流程图 上传文件和导包 文件上传注意事项 1.为保证服务器安全上传文件应该放在外界无法直接访问你得目录下比如放在WEB-INF目录下2.为防止文件覆盖现象的发生要为文件产生一个唯一的文件名 添加时间戳 或者 uuid 或者MD5 或者位运算3.要限制上传文件的大小4.可以限制上传文件的类型在收到上传文件名时要判断后缀名是否合格。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wsBoF7TL-1609316574123)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201230111632383.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cC5HaVaX-1609316574126)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201230111841125.png)] 需要用到的类详解 ServletFileUpload 负责处理上传的文件数据并将表单中每个输入项封装成一个FileItem对象在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。所以我们需要在进行解析工作前构造号DiskFileItemFactory对象通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。 % page contentTypetext/html;charsetUTF-8 languagejava % html headtitleTitle/title /head body%--通过表单上传文件--%%--注意文件一般比较大所以上传文件都是使用post方式提交get方式只能提交4-5kb的数据而post没有限制${pageContext.request.contextPath}:获取到webapp路径--%form action${pageContext.request.contextPath}/upload.do methodpost enctypemultipart/form-datap上传用户input typetext nameusernamebr//pp上传文件1input typefile namefile1/pp上传文件2input typefile namefile2/ppinput typesubmit value点击上传 | input typereset value重置/p/form /body /html package edu.cqupt.servlet;import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; import java.util.UUID;public class FileServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if(!ServletFileUpload.isMultipartContent(req)){ //判断文件是带文件表单还是普通表单return; //终止运行说明这一定是一个不带文件的}//为保证服务器安全上传文件应该放在外界无法直接访问你得目录下比如放在WEB-INF目录下String uploadPath this.getServletContext().getRealPath(/WEB-INF/upload);File uploadFile new File(uploadPath);if(!uploadFile.exists()){uploadFile.mkdir();}// 缓存String tempPath this.getServletContext().getRealPath(/WEB-INF/temp);File file new File(tempPath);if(!file.exists()){file.mkdir();}String msg null;try {//1.创建 DiskFileItemFactoryDiskFileItemFactory factory getDiskFileItemFactory(file);//2.获取ServletFileUploadServletFileUpload upload getServletFileUpload(factory);// 3.处理上传文件msg uploadParseRequest(upload,req,uploadPath);} catch (FileUploadException e) {e.printStackTrace();}// 请求转发消息req.setAttribute(msg,msg);req.getRequestDispatcher(info.jsp).forward(req,resp);}public static DiskFileItemFactory getDiskFileItemFactory(File file){DiskFileItemFactory factory new DiskFileItemFactory();factory.setSizeThreshold(1024*1024); // 缓存区大小为1Mfactory.setRepository(file); // 临时目录的保存目录需要一个filereturn factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){ServletFileUpload upload new ServletFileUpload(factory);upload.setProgressListener(new ProgressListener() {Overridepublic void update(long pBytesRead, long pContenLength, int pItems) {System.out.println(总大小 pContenLength 已上传 pBytesRead );}});upload.setHeaderEncoding(UTF-8);upload.setFileSizeMax(1024*1024*10);upload.setSizeMax(1024*1024*10);return upload;}public static String uploadParseRequest(ServletFileUpload upload,HttpServletRequest req,String uploadPath) throws FileUploadException, IOException {String message null;ListFileItem fileItems upload.parseRequest(req); // 把前端请求解析封装成一个FileItem对象for (FileItem fileItem : fileItems) {if (fileItem.isFormField()) { // 普通表单String name fileItem.getName();String value fileItem.getString(utf-8);System.out.println(name : value);} else { //判断是文件表单String uploadFileName fileItem.getName(); // 处理文件 if (uploadFileName.trim().equals() || uploadFileName null) {continue;}String fileName uploadFileName.substring(uploadFileName.lastIndexOf(/) 1);String fileExtName uploadFileName.substring(uploadFileName.lastIndexOf(.) 1);// UUID.randomUUID() 随机生成一个唯一识别的通用码// 网络中传输东西都需要序列化// POJO, 实体类 如果想要生成在多个电脑上运行 传输--需要把对象都序列化// JNI java native Interface// implements Serializable :标记接口 JVM -- Java栈 本地方法栈 native -- cString uuidPath UUID.randomUUID().toString();// 可以 使用UUID(唯一识别的通用码),保证文件唯一String realPath uploadPath / uuidPath; // 存放地址 File realPathFile new File(realPath);if (!realPathFile.exists()) {realPathFile.mkdir();}InputStream is fileItem.getInputStream(); // 文件传输 FileOutputStream fos new FileOutputStream(realPath / fileName);byte[] buffer new byte[1024];int len 0;while ((len is.read(buffer)) ! -1) {fos.write(buffer, 0, len);}fos.close();is.close();message 文件上传成功;fileItem.delete(); //上传成功清除临时文件}}return message;} }发送邮件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IejcoJ5V-1609316574127)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201230142142319.png)] 加载包pom.xml vgzetyyijkuo****ddfa !-- https://mvnrepository.com/artifact/javax.mail/mail --dependencygroupIdjavax.mail/groupIdartifactIdmail/artifactIdversion1.4.7/version/dependency!-- https://mvnrepository.com/artifact/javax.activation/activation --dependencygroupIdjavax.activation/groupIdartifactIdactivation/artifactIdversion1.1.1/version/dependency注册页面 index.jsp % page contentTypetext/html;charsetUTF-8 languagejava % html headtitle注册/title /head bodyform action${pageContext.request.contextPath}/RegisterServlet.do methodpostdiv classtxt txt0span styleletter-spacing:8px;用户名:/spaninput nameusername typetext classtxtphone placeholder请输入用户名//divdiv classtxt txt0span styleletter-spacing:4px;登录密码:/spaninput namepassword typetext classtxtphone placeholder请输入密码//divdiv classtxt txt0span styleletter-spacing:4px;邮箱:/spaninput nameemail typetext classtxtphone placeholder请输入邮箱//divdiv classtxt txt0input typesubmit value注册//div/form /body /html注册成功跳转页面info.jsp %--Created by IntelliJ IDEA.User: ASUSDate: 2020/8/29Time: 22:30To change this template use File | Settings | File Templates. --% % page contentTypetext/html;charsetUTF-8 languagejava % html headtitleTitle/title /head body${message} /body /html用户实体类User.java package edu.cqupt.pojo;import java.io.Serializable; public class User implements Serializable {private String username;private String password;private String email;public User() {}public User(String username, String password, String email) {this.username username;this.password password;this.email email;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}Overridepublic String toString() {return User{ username username \ , password password \ , email email \ };} }RegisterServlet.java package edu.cqupt.servlet;import edu.cqupt.pojo.User; import edu.cqupt.utils.SendEmail;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 RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username req.getParameter(username);String password req.getParameter(password);String email req.getParameter(email);System.out.println(username);System.out.println(password);System.out.println(email);User user new User(username, password, email);SendEmail send new SendEmail(user);send.start(); // 使用线程加快邮件发送req.setAttribute(message,注册成功请查收邮件);req.getRequestDispatcher(info.jsp).forward(req,resp);}Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }SendEmail.java package edu.cqupt.utils;import com.sun.mail.util.MailSSLSocketFactory; import edu.cqupt.pojo.User;import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties;public class SendEmail extends Thread{private String from 发送方qq.com;private String username 发送方qq.com;private String password 邮箱授权码;private String host smtp.qq.com;private User user;public SendEmail(User user) {this.user user;}Overridepublic void run() {try {Properties prop new Properties();prop.setProperty(mail.host, smtp.qq.com);prop.setProperty(mail.transport.protocol, smtp);prop.setProperty(mail.smtp.auth, true);//QQ邮箱设置SSL加密MailSSLSocketFactory sf new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put(mail.smtp.ssl.enable, true);prop.put(mail.smtp.socketFactory, sf);// 使用JavaMail发送邮件的5个步骤// 1、创建sessionSession session Session.getInstance(prop, new Authenticator() {Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(username, password);}});// 2. 开启Session的debug模式:truesession.setDebug(false);// 3.通过session得到transport对象Transport ts session.getTransport();ts.connect(host, username, password);// 4. 创建邮件Message message new MimeMessage(session);message.setFrom(new InternetAddress(from));message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));message.setSubject(注册邮件);String info Yours username: user.getUsername() password: user.getPassword();message.setContent(info, text/html;chartsetUTF-8);// 5.发送邮件ts.sendMessage(message, message.getAllRecipients());// 6.关闭连接ts.close();}catch (Exception e){throw new RuntimeException(e);}} }邮件发送 2.jar包的支持 activation-1.1.1.jar mail-1.4.7.jar 3.授权码的获取 4.简易文本邮件发送的实现 由上图我们可以确定几个必须步骤 1.创建session对象 2.创建Transport对象 3.使用邮箱的用户名和授权码连上邮件服务器 4.创建一个Message对象需要传递session message需要指明发件人、收件人以及文件内容 5.发送邮件 6.关闭连接 import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties;public class MailDemo01 {public static void main(String[] args) throws Exception {Properties propnew Properties();prop.setProperty(mail.host,smtp.qq.com);///设置QQ邮件服务器prop.setProperty(mail.transport.protocol,smtp);///邮件发送协议prop.setProperty(mail.smtp.auth,true);//需要验证用户密码//QQ邮箱需要设置SSL加密MailSSLSocketFactory sfnew MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put(mail.smtp.ssl.enable,true);prop.put(mail.smtp.ssl.socketFactory,sf);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session sessionSession.getDefaultInstance(prop, new Authenticator() {Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(XXXXqq.com,授权码);}});//开启session的debug模式这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport tssession.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect(smtp.qq.com,XXXXqq.com,授权码);//4.创建邮件写文件//注意需要传递sessionMimeMessage messagenew MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress(XXXXqq.com));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress(XXXXqq.com));//邮件标题message.setSubject(发送的标题);//邮件的文本内容message.setContent(内容,text/html;charsetUTF-8);//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();} } 5.复杂文件内容的发送 5.1文件构成解析 除了邮件内容部分其他的部分代码往往是相同的除了需要根据不同的邮箱运营商编写不同的配置代码外。邮件内容也被分为很多个部分由文件、图片、附件等构成编写邮件内容的过程类似于积木的拼接另外值得注意的是文本内容一般为HTML的格式发送。 每一个文本、图片、附件可以分为一个MimeBodyPart由MimeMultipart完成组装 5.2包含图片的发送 import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties;public class MailDemo02 {public static void main(String[] args) throws Exception {Properties propnew Properties();prop.setProperty(mail.host,smtp.qq.com);///设置QQ邮件服务器prop.setProperty(mail.transport.protocol,smtp);///邮件发送协议prop.setProperty(mail.smtp.auth,true);//需要验证用户密码//QQ邮箱需要设置SSL加密MailSSLSocketFactory sfnew MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put(mail.smtp.ssl.enable,true);prop.put(mail.smtp.ssl.socketFactory,sf);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session sessionSession.getDefaultInstance(prop, new Authenticator() {Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(11927XXXqq.com,授权码);}});//开启session的debug模式这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport tssession.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect(smtp.qq.com,11927XXXqq.com,授权码);//4.创建邮件写文件//注意需要传递sessionMimeMessage messagenew MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress(11927XXXqq.com));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress(11927XXXqq.com));//邮件标题message.setSubject(java发出);//邮件的文本内容//准备图片数据MimeBodyPart imagenew MimeBodyPart();//图片需要经过数据化的处理DataHandler dhnew DataHandler(new FileDataSource(D:\\Bert\\1594126632(1).jpg));//在part中放入这个处理过图片的数据image.setDataHandler(dh);//给这个part设置一个ID名字image.setContentID(bz.jpg);//准备正文的数据MimeBodyPart textnew MimeBodyPart();text.setContent(这是一张正文img srccid:bz.jpg,text/html;charsetUTF-8);//描述数据关系MimeMultipart mmnew MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType(related);//设置到消息中保存修改message.setContent(mm);message.saveChanges();//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();} }5.3包含附件的发送 import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.util.Properties;public class MailDemo03 {public static void main(String[] args) throws Exception {Properties propnew Properties();prop.setProperty(mail.host,smtp.qq.com);///设置QQ邮件服务器prop.setProperty(mail.transport.protocol,smtp);///邮件发送协议prop.setProperty(mail.smtp.auth,true);//需要验证用户密码//QQ邮箱需要设置SSL加密MailSSLSocketFactory sfnew MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put(mail.smtp.ssl.enable,true);prop.put(mail.smtp.ssl.socketFactory,sf);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session sessionSession.getDefaultInstance(prop, new Authenticator() {Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(1192XXXXqq.com,授权码);}});//开启session的debug模式这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport tssession.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect(smtp.qq.com,1192XXXXqq.com,授权码);//4.创建邮件写文件//注意需要传递sessionMimeMessage messagenew MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress(1192XXXXqq.com));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress(1192XXXXqq.com));//邮件标题message.setSubject(java发出);//邮件的文本内容//准备图片数据MimeBodyPart imagenew MimeBodyPart();//图片需要经过数据化的处理DataHandler dhnew DataHandler(new FileDataSource(D:\\Bert\\1594126632(1).jpg));//在part中放入这个处理过图片的数据image.setDataHandler(dh);//给这个part设置一个ID名字image.setContentID(bz.jpg);//准备正文数据MimeBodyPart textnew MimeBodyPart();text.setContent(这是一张正文img srccid:bz.jpg,text/html;charsetUTF-8);//准备附件数据MimeBodyPart body1 new MimeBodyPart();body1.setDataHandler(new DataHandler(new FileDataSource(D:\\Bert\\cmd.txt)));body1.setFileName(1.txt);//描述数据关系MimeMultipart mmnew MimeMultipart();mm.addBodyPart(body1);mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType(mixed);//设置到消息中保存修改message.setContent(mm);message.saveChanges();//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();} } 实战注册通知邮件 index.JSP html body h2Hello World!/h2 form action${pageContext.request.contextPath}/RegisterServlet.do methodpost用户名input typetext nameusername密码input typetext namepwd邮箱input typetext nameemailinput typesubmit value注册/form /body /html 实体类 public class User {private String username;private String password;private String email;public User() {}public User(String username, String password, String email) {this.username username;this.password password;this.email email;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}Overridepublic String toString() {return User{ username username \ , password password \ , email email \ };} } 绑定路径 servletservlet-nameRegisterServlet/servlet-nameservlet-classcn.csn.MailDemo01.servlet.RegisterServlet/servlet-class/servletservlet-mappingservlet-nameRegisterServlet/servlet-nameurl-pattern/RegisterServlet.do/url-pattern/servlet-mappingservlet import cn.csn.MailDemo01.pojo.User; import cn.csn.MailDemo01.utils.Sendmail;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 RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String usernamereq.getParameter(username);String passwordreq.getParameter(pwd);String emailreq.getParameter(email);User usernew User(username,password,email);Sendmail sendnew Sendmail(user);send.start();System.out.println(success);}Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);} } 发送邮件核心类 import cn.csn.MailDemo01.pojo.User; import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties;public class Sendmail extends Thread {private String fromXXXqq.com;private String hostsmtp.qq.com;private User user;public Sendmail(User user){this.useruser;}Overridepublic void run() {try {Properties propnew Properties();prop.setProperty(mail.host,host);///设置QQ邮件服务器prop.setProperty(mail.transport.protocol,smtp);///邮件发送协议prop.setProperty(mail.smtp.auth,true);//需要验证用户密码//QQ邮箱需要设置SSL加密MailSSLSocketFactory sfnew MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put(mail.smtp.ssl.enable,true);prop.put(mail.smtp.ssl.socketFactory,sf);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session session Session.getDefaultInstance(prop, new Authenticator() {Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from,授权码);}});//开启session的debug模式这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport tssession.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect(host,from,授权码);//4.创建邮件写文件//注意需要传递sessionMimeMessage messagenew MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress(from));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//邮件标题message.setSubject(注册通知);//邮件的文本内容message.setContent(恭喜你(user.getUsername())成功注册密码user.getPassword(),text/html;charsetUTF-8);//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();}catch (Exception e){System.out.println(e);}} }这里引入多线程的目的是为了提高用户的体验防止因发送文件时间过长导致前端响应过久因此这里采用异步响应。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGkz32bF-1609316574129)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201230152905585.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-me0Qj3SH-1609316574130)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201230153222045.png)] tomcat可能缺少包导致运行失败
http://www.pierceye.com/news/377047/

相关文章:

  • 学校网站建设需求分析调研表网站右侧信息跟随左侧菜单栏变化
  • 家乡网站建设策划案邢台哪里建网站
  • 网站建设实习收获青岛网上房地产网站
  • 简述电子政务网站设计的技术企业邮箱是什么类型的账户
  • 深圳网站建设公司元嘉定网站开发
  • 佛山外贸网站建设平台上传网站安装教程
  • c2c网站建设实例德国网站建设
  • 建网站支持设备是什么意思佛山中小企业网站建设
  • 网站建设与管理读后感宁德住房和城乡建设部网站
  • 贸易网站建站建设部网站社保联网
  • 住房城乡建设厅网站准考证如何建小企业网站
  • 葫芦岛市城乡建设局网站做什么样的网站
  • 铜山区规划建设局网站大学生心理咨询网站建设论文
  • 泸州本地网站建设扬州做网站公司
  • 镇江网站建设工作室怎么购买国外的域名
  • 广西南宁电商网站建设找客户信息的软件
  • 信阳网站开发公司2022中国互联网公司市值排名
  • 巨鹿县住房与城乡建设厅网站wordpress内容付费插件
  • 网站设计建设维护wordpress 仿搜狗百科
  • 做网站写的代号好跟不好的区别中国500强企业官网
  • html个人网站wordpress 后台 字数统计
  • 网站开发包括哪些技术网站后台框架模版
  • 济南地产行业网站开发长春网络推广
  • 网站建设全程揭秘网站建设费能抵扣吗
  • 网站开发用什么语言最安全网站的ftp在哪里可以查到
  • 物理结构网站我国网站建设现状
  • 毕设如何做网站tk网站免费
  • 做logo的著名网站一起做网商网站怎么样
  • 楼盘销售管理网站开发资源网站界面设计形考
  • 哪个网站做视频挣钱网络推广方案下拉管家微xiala11