JavaWeb学习笔记

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响应给客户端

img

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

  1. 判断请求表单中是否带有文件

    if(!ServletFileUpload.isMultipartContent(request)){
        System.out.println("没有");
        return;
    }
    
  2. 创建文件,给上传的文件配置文件路径,存放普通存放地址和缓存(临时文件)

    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();
    }
    
  3. 获取servletUpload

    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    
  4. 上传文件

  • 判断上传的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);

邮件发送

  1. 获取session
Session session = Session.getDefaultInstance(prop, new Authenticator() {
    @Override
    public PasswordAuthentication getPasswordAuthentication() {
        // 发件人邮箱 用户名和授权码
        return new PasswordAuthentication("1922817079@qq.com", "ptrqfcvkzykobdde");
    }
});
  1. 开启 Session debugger 模式, 可以看到邮件发送的运行状态
session.setDebug(true);
  1. 获取发送transport对象
Transport transport = session.getTransport();
  1. 使用邮箱用户名和授权码连上邮件服务器
transport.connect("smtp.qq.com","1922817079@qq.com", "ptrqfcvkzykobdde");
  1. 设置发送信息
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();
  1. 发送信息
transport.sendMessage(message, message.getAllRecipients());
  1. 关闭连接
transport.close();

sion.setDebug(true);


3. 获取发送transport对象

```java
Transport transport = session.getTransport();
  1. 使用邮箱用户名和授权码连上邮件服务器
transport.connect("smtp.qq.com","1922817079@qq.com", "ptrqfcvkzykobdde");
  1. 设置发送信息
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();
  1. 发送信息
transport.sendMessage(message, message.getAllRecipients());
  1. 关闭连接
transport.close();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值