JavaWeb
1、发布一个网站
--Webapps : Tomcat服务器的Web目录
-ROOT
-kuangstudy : 网站的目录名
- WEB-INF
-classes : java程序
-lib : web应用所依赖的jar包
-web-xml : 网站的配置文件
- index.html 默认的首页
- static
-css
- style.css
-js
-img
- ...
2、响应状态码
200:请求响应成功
3xx:请求重定向
- 重定向:重新到给定的新位置
4xx:找不到资源 404
- 资源不存在
5xx:服务器代码错误 500 502:网关错误
3、Servlet
3.1、Servlet简介
- Servlet是Sun公司用于开发动态 web 的一门技术
- Sun在这些API提供一个接口叫做:Servlet,要开发一个Servlet程序,需要两个步骤:
- 编写一个类,实现Servlet接口
- 把开发好的Servlet类部署到web服务器中
把实现了Servlet接口的java程序叫做,Servlet
在build中配置resources,来防止我们资源导出失败的问题
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
3.2、HelloServlet
**1、**构建一个普通的Maven项目,删除里面的src目录,然后在这个项目里建立Moudel;这个空的工程就是Maven主工程
**2、**关于Maven父子工程的理解
父项目中会有:
<modules>
<module>servlet-01</module>
</modules>
子项目中会有:
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的java子项目可以直接使用
**3、**Maven环境优化
- 修改web.xml为最新的
- 将Maven的结构搭建完整
最新web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
**4、**编写一个Servlet程序
- 编写一个普通类
- 实现Servlet接口,这里直接继承HttpServlet类
HttpServlet继承关系图
由我们编写的Servlet类继承HttpServlet抽象类,而HttpServlet类继承了GenericServlet抽象类,GenericServlet类实现了Servlet接口
HttpServlet类实现了Servlet接口中的service方法
**5、**编写Servlet的映射
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能访问的路径
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.fmh.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的映射和请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
**6、**配置Tomcat
注意:配置项目发布的路径就可以了
7、测试
3.3、Servlet原理
当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端。
针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程。第二次收到http请求时,Servlet容器无须建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。
3.4、Mapping(映射)问题
1.一个Servlet可以指定一个映射路径
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.fmh.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4.默认请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5.自定义后缀实现请求映射
注意事项:*前面不能加项目映射的路径
hello/caca/.fmh 也是可以的,只要以自定义后缀结尾
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.fmh</url-pattern>
</servlet-mapping>
6.优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.fmh.servlet.Error</servlet-class>
</servlet>
<!--Servlet的映射和请求路径-->
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
3.5、ServletContext
web容器在启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
1、共享数据
在一个Servlet中存放的数据,可以在另一个Servlet中拿到
(1)编写存放数据类HelloServlet
向ServeltContext存放数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServeltContext对象
ServletContext context = this.getServletContext();
// 存放数据
context.setAttribute("username","狗诺");
}
(2)编写取出数据类GetMessage
protected 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");
PrintWriter writer = resp.getWriter();
writer.write(username);
}
(3)配置web.xml,增添Servelt映射
<!--向ServletContext存放映射-->
<servlet>
<servlet-name>post</servlet-name>
<servlet-class>com.fmh.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>post</servlet-name>
<url-pattern>/post</url-pattern>
</servlet-mapping>
<!--从ServletContext取出映射-->
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.fmh.servlet.GetMessage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
2、获取初始化参数
context.getInitParameter()
web配置:
<!--配置一些web的初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
</context-param>
获取配置Servlet类
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.write(url);
Servlet在web.xml的映射
<!--获取初始化参数类映射-->
<servlet>
<servlet-name>getParameter</servlet-name>
<servlet-class>com.fmh.servlet.GetParameter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getParameter</servlet-name>
<url-pattern>/getP</url-pattern>
</servlet-mapping>
3、请求转发
context.getRequestDispatcher()
请求转发类
ServletContext context = this.getServletContext();
// 转发的请求路径
RequestDispatcher dispatcher = context.getRequestDispatcher("/getP");
// 调用forword实现请求转发
dispatcher.forward(req,resp);
web的转发类映射
<!--请求转发类映射-->
<servlet>
<servlet-name>request</servlet-name>
<servlet-class>com.fmh.servlet.GetParameter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>request</servlet-name>
<url-pattern>/send</url-pattern>
</servlet-mapping>
4、读取资源文件
context.getResourceAsStream()
读取配置文件类
ServletContext context = this.getServletContext();
Properties properties = new Properties();
InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/com/fmh/servlet/user.properties");
properties.load(inputStream);
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
String user = properties.getProperty("username");
String pwd = properties.getProperty("password");
PrintWriter writer = resp.getWriter();
writer.print(user + ":" + pwd);
web的读取类映射
<!--读取配置文件类映射-->
<servlet>
<servlet-name>read</servlet-name>
<servlet-class>com.fmh.servlet.ReadResource</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>read</servlet-name>
<url-pattern>/read</url-pattern>
</servlet-mapping>
5、HttpServletResponse简单应用(实现下载文件)
下载文件
1. 获取要下载文件的路径
2. 获取文件名
3. 设置文件头,让浏览器支持下载我们需要的东西
4. 获取下载文件的输入流
5. 创建缓冲区
6. 获取OutputStream对象
7. 将FileInputStream写到buffer缓冲区
8. 使用OutputStream将缓冲区的数据输出到客户端
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取文件地址
String path = "E:\\Ideaproject\\javaweb-02-servlet\\response\\src\\main\\resources\\杰尼龟.jpg";
// 2、获取文件名
String fileName = path.substring(path.lastIndexOf("\\") + 1);
// 3、设置文件头
// 设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西,想要读取中文文件名,可以设置编码()
resp.setHeader("Content-disposition","attachment;filename"+ URLEncoder.encode(fileName,"UTF-8"));
// 4、创建读取文件流
FileInputStream inputStream = new FileInputStream(path);
// 5、获取web输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 6、读取文件时输出,即下载
int readLine = 0;
byte[] buffer = new byte[1024];
while ((readLine = inputStream.read(buffer)) > -1){
outputStream.write(buffer,0,readLine);
}
inputStream.close();
outputStream.close();
}
3.6、实现重定向
一个web资源(B)收到客户端(A)请求后,他(B)会通知客户端(A)去访问另一个web资源(C),这个过程叫做重定向
/* 本质
resp.setHeader("location","/s1/down");
resp.setStatus(302);
*/
resp.sendRedirect("/s1/down");
重定向和转发的区别
相同点
- 页面都会实现跳转
不同点
- 请求转发时,url不会产生变化
- 重定向时,url地址栏会发生变化
请求转发直接写目标路径即可;而重定向需要加上项目路径
请求转发映射的地址
- localhost:8080/当前web目录
重定向映射的地址
- localhost:8080
获取参数,请求转发
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 网页和后台乱码解决,改变代码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 获取请求参数
String username = req.getParameter("username");
String pwd = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobbies");
System.out.println(username + ":" + pwd);
String s = Arrays.toString(hobbies);
System.out.println(s);
// 请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
4、Cookie,Session
4.1、会话
**会话:**用户打开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器的整个过程。
4.2、保存会话的两种技术
cookie和session都是用于证明客户访问过这个网站
cookie
- 客户端技术(响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息
4.3、Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
// 获得cookie方法
Cookie[] cookies = req.getCookies();
// 获得cookie中的key
cookie.getName();
//获得cookie中的value
cookie.getValue();
// 新建一个cookie
Cookie cookie = new Cookie(string,string);
// 设置cookie有效期
cookie.setMaxAge(24*60*60);
// 相应给客户端一个cookie
resp.addCookie(cookie);
删除cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期为0
4.4、编码、解码与响应乱码解决
// 编码
URLEncoder.encode();
// 解码
URLDecoder.decode();
响应乱码解决
一定要在获取流对象之前调用才会生效
// 它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp.setContentType("text/html; Charset=UTF-8");
//一定要记住在获取流对象之前调用才会有效。
4.5、Session(重点)
什么是session:
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
- 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;
Session和Cookie的区别:
- Cookie是把用户的数据写给用户的浏览器
- Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建
session常用方法
// 获取Session
HttpSession session = req.getSession();
// 向session对象添加信息
session.setAttribute("name",new Person("狗诺",21));
// 获取sessionId
String sessionId = session.getId();
// 判断Session是否是新创建的
session.isNew();
// 清除Session对象中信息
session.removeAttribute("name");
// 手动使当前Session失效
session.invalidate();
设置Session自动失效时间
<!--设置session的默认失效时间-->
<session-config>
<!--多少分钟后Session自动失效-->
<session-timeout>1</session-timeout>
</session-config>
5、JSP
5.1、JSP原理
1、客户端发出HTTP请求,JSP被请求后,JSP引擎(容器)将JSP文件转换成一个Sevlet响应给客户端
5.2、JSP基本语法
1、JSP表达式 <%= … %>
<%--JSP表达式
作用: 用于输出程序
--%>
<%= new java.util.Date()%>
2、JSP脚本片段 <% … %>
<%--JSP脚本片段--%>
<%
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += i;
}
out.print(sum);
%>
3、JSP脚本声明 <%! … %>
JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到 jspService方法中
<%--JSP声明--%>
<%!
static {
System.out.println("Loading servlet...");
}
private int globalVar = 0;
public void dog(){
System.out.println("狗诺在叫...");
}
%>
5.3、JSP指令
<%@ page args... %>
<%@include … %>
<%--@include: 会将多个页面合并为一个--%>
<%@include file="common/header.jsp"%>
<h1>我是主体</h1>
<%@include file="common/footer.jsp"%>
JSP标签
<jsp:include … />
<%--JSP标签
jsp:include: 拼接页面,本质上还是三个
--%>
<jsp:include page="common/header.jsp"/>
<h1>我是主体</h1>
<jsp:include page="common/footer.jsp"/>
5.4、错误页面
1、手动定制错误页面
<%--定制错误页面--%>
<%@page errorPage="error/500.jsp" %>
2、在web.xml中配置错误页面
// 404, 找不到页面错误
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
// 500, 代码有错误
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
5.5、9大内置对象
- PageContext
- Request
- Response
- Session
- Application [ servletContext ]
- config [ servletConfig ]
- out
- page
- exception
内置对象作用域
<%
// 保存的数据只会在一个页面有效
pageContext.setAttribute("name1","name1");
// 保存的数据只在一次请求中有效,转发会携带数据!!
request.setAttribute("name2","name2");
// 保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
session.setAttribute("name3","name3");
// 保存的数据只会在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name4","name4");
%>
request:客户端向服务器发送请求,产生的数据,用户看完就没用了
session:客户端向服务器发送请求,产生的数据,用户用完一会儿还能用,比如:用户登录
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据
通过寻找的方式取出数据
从底层到高层(作用域):page --> request --> session --> application
5.6、JSP标签、JSTL标签、EL表达式
JSP标签
请求转发并携带参数
<jsp:forward page="jspGetPara.jsp">
<jsp:param name="name1" value="value1"/>
<jsp:param name="name2" value="value2"/>
</jsp:forward>
获取参数
<%=request.getParameter("name1")%>
<%=request.getParameter("name2")%>
JSTL标签
if判断
<h1>if测试</h1>
<hr>
<form action="coreif.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<c:if test="${param.username == 'admin'}" var="isadmin">
<c:out value="管理员欢迎您"/>
</c:if>
保存数据:<c : set … />
when判断
用来判断条件是否成立:<c:choose > <c:when … >
<%--保存数据--%>
<c:set var="score" value="80"/>
<c:choose>
<c:when test="${score >= 90}">
<c:out value="优秀"/>
</c:when>
<c:when test="${score >= 70 && score < 90}">
<c:out value="良好"/>
</c:when>
<c:when test="${score > 60 && score < 70}">
<c:out value="及格"/>
</c:when>
<c:when test="${score < 60}">
<c:out value="不及格"/>
</c:when>
</c:choose>
forEach
<%
ArrayList<String> person = new ArrayList<>();
person.add(0,"马斯托");
person.add(1,"姿态");
person.add(2,"污渍");
person.add(3,"节奏");
request.setAttribute("list",person);
%>
<c:forEach var="people" items="${list}" begin="1" end="2">
<c:out value="${people}"/> <br>
</c:forEach>
EL表达式:${}
- 获取数据
- 执行计算
- 获取web开发的常用对象
即是范围优先级由高到低依次是:
Page、Request、session 和 Application
6、JavaBean
实体类
JavaBean有特定的写法:
- 必须要有无参构造
- 属性必须私有化
- 必须要有get/set方法
7、MVC三层架构
什么是MVC:Model View Controller 模型、视图、控制器
Model:
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View:
- 展示数据
- 提供链接发起Servlet请求(a,form,img…)
Controller:
- 接收用户的请求:(req:请求参数、Session信息…)
- 交给业务层处理对应的代码
- 控制视图的跳转
11、Filter(过滤器)
web.xml配置
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.fmh.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
12、文件上传
表单中需要属性 enctype="multipart/form-data
-
判断请求表单中是否带有文件
if(!ServletFileUpload.isMultipartContent(request)){ System.out.println("没有"); return; }
-
创建文件,给上传的文件配置文件路径,存放普通存放地址和缓存(临时文件)
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 tempFile = new File(tempPath); if(!tempFile.exists()){ tempFile.mkdir(); }
-
获取servletUpload
DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory);
-
上传文件
- 判断上传的fileItems类型
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();
// 获取文件名
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
System.out.println("上传的文件名: " + fileName);
System.out.println("上传的文件类型: ." +fileExtName );
- 用UUID增加文件标识,保证文件唯一
UUID uuid = UUID.randomUUID();
String realPath = uploadPath + "/" + uuid;
File realFile = new File(realPath);
if(!realFile.exists()){
realFile.mkdir();
}
- 上传文件
InputStream in = fileItem.getInputStream();
FileOutputStream out = new FileOutputStream(realPath + "/" + fileName);
byte[] buffer = new byte[1024*1024];
int readLen = 0;
while((readLen=in.read(buffer)) > 0){
out.write(buffer,0,readLen);
}
out.close();
in.close();
// 清楚临时文件
fileItem.delete();
13、邮件发送
邮件发送前的准备
- 设置配置
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); // 设置qq邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
prop.put("mail.smtp.ssl.protocols", "TLSv1.2");
- 关于qq邮箱, 还要设置SSL加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
邮件发送
- 获取session
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
// 发件人邮箱 用户名和授权码
return new PasswordAuthentication("1922817079@qq.com", "ptrqfcvkzykobdde");
}
});
- 开启 Session debugger 模式, 可以看到邮件发送的运行状态
session.setDebug(true);
- 获取发送transport对象
Transport transport = session.getTransport();
- 使用邮箱用户名和授权码连上邮件服务器
transport.connect("smtp.qq.com","1922817079@qq.com", "ptrqfcvkzykobdde");
- 设置发送信息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("1922817079@qq.com")); // 发送人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("1515221802@qq.com")); // 收件人
message.setSubject("酱酱");// 邮件主题
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("E:\\Ideaproject\\mail-improve\\src\\cn.jpg"));
image.setDataHandler(dh);
image.setContentID("cn.jpg");
// 准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("酱酱太帅啦<img src='cid:cn.jpg'>","text/html;charset=utf-8");
// 描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(image);
mm.addBodyPart(text);
mm.setSubType("mixed");
// 设置到消息中,保存
message.setContent(mm);
message.saveChanges();
- 发送信息
transport.sendMessage(message, message.getAllRecipients());
- 关闭连接
transport.close();
sion.setDebug(true);
3. 获取发送transport对象
```java
Transport transport = session.getTransport();
- 使用邮箱用户名和授权码连上邮件服务器
transport.connect("smtp.qq.com","1922817079@qq.com", "ptrqfcvkzykobdde");
- 设置发送信息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("1922817079@qq.com")); // 发送人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("1515221802@qq.com")); // 收件人
message.setSubject("酱酱");// 邮件主题
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("E:\\Ideaproject\\mail-improve\\src\\cn.jpg"));
image.setDataHandler(dh);
image.setContentID("cn.jpg");
// 准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("酱酱太帅啦<img src='cid:cn.jpg'>","text/html;charset=utf-8");
// 描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(image);
mm.addBodyPart(text);
mm.setSubType("mixed");
// 设置到消息中,保存
message.setContent(mm);
message.saveChanges();
- 发送信息
transport.sendMessage(message, message.getAllRecipients());
- 关闭连接
transport.close();