1.基本概念
1.1 前言
web开发:静态web和动态web
静态web:html、css 提供给人的页面始终不会变化
动态web:Servlet,Jsp,Asp,Php,网页数据会因为不同的条件而呈现不同的页面
java中,动态web资源的开发技术统称为javaweb;
1.2 JavaWeb应用程序
一个Web应用程序由多部分组成(静态和动态)
- html、css、js
- jsp,servlet
- java程序
- 配置文件
- jar包
web应用程序编写完毕后,若想提供给外界访问,需要服务器来统一管理
2.Web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户的响应信息;
- IIS:微软的 ASP…,windows自带
- Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0.41**。**
3.HTTP
超文本传输协议: 简单的请求响应协议,运行在tcp之上
3.1两个版本
单服务器 和多服务器
3.2请求和响应
4.Maven
Maven项目架构管理工具:方便导入jar包
Maven核心思想:约定大于配置
有约束就不要去违反
Maven会规范我们写的Java代码,按照这个规范来写
5.Servlet
sun公司开发的一门编写动态Web的一门技术
sun公司在API中提供了一个接口叫做Servlet,如果想要开发一个Servlet程序,只需完成两个步骤
- 编写一个类,继承Servlet类
- 把开发好的Java类部署到服务器中
把实现了Servlet接口的Java程序叫做Servlet
5.1编写HelloServlet
package com.ljl.servlet;
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;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("我的第一个Servlet测试代码");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.2编写Servlet的映射
为什么需要写映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器连接Web服务器,所以我们需要在Web服务中注册我们写的Servlet,还需要给他一个浏览器访问的路径;
<!--注册Servlet-->
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>com.ljl.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
5.3ServletContext
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
5.3.1共享数据
存数据到对象里
package com.ljl.servlet;
import javax.servlet.ServletContext;
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;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取全局对象
ServletContext context = this.getServletContext();
String user="大林";
//存值
context.setAttribute("user",user);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
读取数据
package com.ljl.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
ServletContext context = this.getServletContext();
String user = (String) context.getAttribute("user");
resp.getWriter().println(user);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
编写映射
<?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_3_1.xsd"
version="3.1"
metadata-complete="true">
<!--注册Servlet-->
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>com.ljl.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.ljl.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
</web-app>
5.3.2获取初始化参数
<context-param>
<param-name>pwd</param-name>
<param-value>123456</param-value>
</context-param>
//获取全局对象
ServletContext context = this.getServletContext();
//获取的参数名
String pwd = context.getInitParameter("pwd");
resp.getWriter().println(pwd);
5.3.3请求转发
ServletContext context = this.getServletContext();
//请求页面路径
RequestDispatcher dispatcher = context.getRequestDispatcher("/Hello");
//调用的方法
dispatcher.forward(req,resp);
5.3.4读取资源文件
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取资源文件输入流
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getOutputStream().print(user);
resp.getOutputStream().print(pwd);
}
5.4HttpServletRequest
Web服务器接受客户端的HTTP请求会针对这个请求产生一个代表请求的HttpServletRequest对象和创建一个代表响应客户端的HttpServletResponse对象
- 如果要获取客户端的请求过来的参数:找HttpServletRequest
- 如果要响应客户端的信息:找HttpServletResponse
HttpServletRequest代表客户端的请求,用户通过HTTP协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个类的方法,过的客户端的所有信息
5.4.1获取前端传递的参数
String parameter = req.getParameter("");
String[] parameterValues = req.getParameterValues("");
5.4.2请求转发
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("UTF-8");
//获取请求信息
System.out.println(req.getParameter("username"));
System.out.println(req.getParameter("password"));
String[] hobbys = req.getParameterValues("hobbys");
System.out.println(Arrays.toString(hobbys));
//请求转发
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/LoginSuccess.jsp");
//执行具体方法
requestDispatcher.forward(req,resp);
5.5HttpServletResponse
5.5.1简单分类
负责向浏览器发送数据的方法:
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
设置响应头的方法:
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
void setStatus(int var1);
常用响应状态码:
int SC_OK = 200;// 正常连接
int SC_NOT_FOUND = 404; //没找到url
int SC_INTERNAL_SERVER_ERROR = 500; //服务器问题
int SC_BAD_GATEWAY = 502;//网关问题
5.5.2常见应用
- 向浏览器输出信息(getOutputSream getWriter)
- 下载文件
package com.ljl.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取下载文件的路径
String realPath ="F:\\IdeaProjects\\javaWeb\\maven-servlet01\\response\\target\\classes\\1.png";
//2.下载的文件名是什么?
String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3.设置让浏览器允许我们下载东西
resp.setHeader("Content-disposition","attachment;filename="+filename);
//4.获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5.创建缓冲区
int len =0;
byte[] buffer = new byte[1024];
//6.获取输出流
ServletOutputStream out = resp.getOutputStream();
//7.输出流写内容到buffer缓冲区,使用输出流缓冲区的数据写到客户端
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
//关闭资源
out.close();
in.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.5.3实现重定向
一个Web资源收到客户端请求后,它会告诉客户端访问另一个Web资源的过程叫做重定向
void sendRedirect(String var1) throws IOException; //重定向方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/response_war/down"); //重定向
/*
1. resp.setHeader("location","/response_war/down")
2. resp.setStatus(302) 状态码
*/
}
面试题:重定向和转发的区别
相同点
- 页面都会实现跳转
不同点
- 重定向URL会改变
- 转发不会改变URL
6.Cookie、Session
6.1会话
会话:用户打开了一个浏览器,访问了很多Web资源,最后关闭了浏览器,这个过程就可以称之为一次会话
有状态会话:访问过的页面会留下痕迹,我们能知道你曾经来过
Client Server
- 服务端给客户端一个信件(饼干),客户端下次访问时带上信件就可以了 Cookie
- 服务器登记你来过了,下次来的时候直接匹配客户端 Session
6.2保存会话的两种技术
Cookie
- 客户端技术(req,resp)
Session
- 服务器技术,利用这个技术我们可以保存会话信息,我们可以把信息或者数据放在Session中
常见eg:网站登录后下次进入不用再次登陆
6.3Session(重点)
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
- 用户登陆之后,整个网站都可以访问 eg:保存用户信息、保存购物车信息
Session和Cookie区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session是把用户的数据写到用户独占的Session中,服务器保存,(保存重要信息,以免资源浪费)
- Session对象由服务器创建
使用场景:
- 保存一个用户的登录信息
- 购物车信息
- 整个网站中经常会使用的数据我们会保存在Session中
使用Session:
1.存储数据到Session
package com.ljl.servlet;
import com.ljl.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取Session
HttpSession session = req.getSession();
//往Session里面存数据
session.setAttribute("person",new Person("大林",21,'男'));
//获取Session ID
String sessionId = session.getId();
//判断是否存在Session
if (session.isNew()){
resp.getWriter().write("Session创建成功,ID:"+sessionId);
}else{
resp.getWriter().write("Session已经存在,ID:"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.获取Session中的数据
package com.ljl.servlet;
import com.ljl.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html,utf-8");
//获取Session
HttpSession session = req.getSession();
//获取指定属性值
Person person = (Person) session.getAttribute("person");
System.out.println(session.getId());
resp.getWriter().write(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7.JSP
java server pages:java服务器端页面 ,也和Servlet一样用于开发动态Web技术!
写JSP类似于写HTML,最大的区别是JSP里面嵌入JAVA代码,为用户动态的提供数据
7.1 JSP原理
JSP到底怎么实现的:
-
代码层面没有问题
-
服务器内部工作
tomcat中有一个work目录
IDEA中使用Tomcat时会在IDEA的Tomcat中产生一个work目录
浏览器向服务器发送请求,其实不管访问什么资源,都是在访问Servlet
public abstract class HttpJspBase extends HttpServlet //jsp本质上是Servlet
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//Jsp service
public 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; //配置
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:当前
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
HttpServletRequest request //请求
HttpServletResponse response //响应
jsp页面中java代码原封不动的输出
7.2JSP基础语法以及指令
JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
jsp脚本片段
<%--jsp脚本片段--%>
<% int num=0;
for (int i = 0; i < 100; i++) {
num+=i;
}
out.print("<h2>sum="+num+"</h2>"
);
%>
jsp脚本片段的再实现
jsp声明
会被编译到JSP生成的java的类中,其他的就会被生成到_jspService方法中
<%!
static {
}
public void ljl(){
System.out.println("进入了ljl方法");
}
private int var =10;
%>
jsp指令
<%@page args.... %>
定制错误页面两种方式:
web.xml里面配置(常用)
<error-page>
<error-code>500</error-code> <!--错误的响应头-->
<location>/error/500.jsp</location> <!--页面路径-->
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<%@page errorPage="/error/500.jsp" %> <%-- 错误页面 --%>
7.3 9大内置对象、4大作用域
7.4JSP标签、JSTL标签、EL表达式
用前现在Web.xml配置约束
<!-- jstl依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- standard依赖 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式:${ }
- 获取数据
- 执行运算
- 获取Web开发的常用对象
JSP标签
<jsp:include page="tag01.jsp"></jsp:include>
<jsp:forward page="wdad.jsp">
<jsp:param name="name" value="dalin"></jsp:param>
<jsp:param name="hobby" value="女孩"></jsp:param>
</jsp:forward>
JSTL标签
JSTL标签库的使用就是为了弥补HTML标签的不足,它可以自定义很多标签,可以供我们使用,标签的功能和java代码使用一样
8.JavaBean
实体类
JavaBean有自己的特定写法:
- 必须定义无参构造,如果存在有参构造必须显示定义无参
- 属性必须私有化
- 必须有对应的set/get方法
一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
- 表–>
- 字段–>属性
- 行记录–>对象
public class People {
private int id;
private String name;
private int age;
private String address;
<jsp:useBean id="people" class="com.ljl.pojo.People" scope="page">
<jsp:setProperty name="people" property="id" value="1"></jsp:setProperty>
<jsp:setProperty name="people" property="name" value="dalin"></jsp:setProperty>
<jsp:setProperty name="people" property="age" value="21"></jsp:setProperty>
<jsp:setProperty name="people" property="address" value="四川巴中"></jsp:setProperty>
姓名: <jsp:getProperty name="people" property="name"/>
年龄:<jsp:getProperty name="people" property="age"/>
id:<jsp:getProperty name="people" property="id"/>
地址:<jsp:getProperty name="people" property="address"/>
</jsp:useBean>
9.MVC三层架构
什么是MVC:Model View controller 模型 视图 控制器
10.Filter
10.1登录验证
10.2Filter开发步骤:
1.导入相关依赖,导包
2.编写过滤器
1.导入接口为javax.servlet下的Filter包
2.重写三个方法
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.ljl.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/ShowServlet/*</url-pattern>
</filter-mapping>
11.发送邮件
11.1发送简单邮件
mport com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
public class SendEmail {
//简单邮件 纯文本
//复杂邮件 声音 图像 文本
//要发送的邮件,需要获得协议支持!开启服务pop3/SMTP服务
// qq邮箱设置开启协议服务获取授权码
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
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.ssl.socketFactory", sf);
//使用JavaMail发送邮件的5个步骤
//创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("QQ邮箱", "授权码 ");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "QQ邮箱", "授权码 ");
//4、创建邮件
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("QQ邮箱"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO, new InternetAddress("QQ邮箱"));
//邮件的标题
message.setSubject("只包含文本的简单邮件");
//邮件的文本内容
message.setContent("<h1 style='color: red'>你好啊!</h1>", "text/html;charset=UTF-8");
//5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
}
11.2发送复杂邮件JavaWeb发送邮件
现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。
项目实现:
新建一个JavaWeb项目,配置tomcat的参数,然后添加jar包(记得在tomcat目录下的common目录下也导包,不然会报500错误),并且添加实体类User,Servlet类RegisterServlet,工具类Sendmail,如图所示:
在这里插入图片描述
User类代码如下:
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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
前端注册页面register.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
邮箱:<input type="text" name="email"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
工具类Sendmail类代码如下:
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 from = "24736743@qq.com";
//邮箱的用户名
private String username = "24736743@qq.com";
//邮箱的密码
private String password = "授权码";
//发送邮件的服务器地址
private String host = "smtp.qq.com";
private User user;
public Sendmail(User user){
this.user = user;
}
//重写run方法的实现,在run方法中发送邮件给指定的用户
@Override
public void run() {
try{
Properties prop = new Properties();
prop.setProperty("mail.host", host);
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.ssl.socketFactory", sf);
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("24736743@qq.com", "授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect(host, username, password);
//4、创建邮件
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from)); //发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人
message.setSubject("用户注册邮件"); //邮件的标题
String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题请联系网站客服!!";
message.setContent(info, "text/html;charset=UTF-8");
message.saveChanges();
//发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Servlet类RegisterServlet类代码如下:
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 {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//接收用户请求,封装成对象
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
User user = new User(username,password,email);
//用户注册成功之后,给用户发送一封邮件
//我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况;
Sendmail send = new Sendmail(user);
//启动线程,线程启动之后就会执行run方法来发送邮件
send.start();
//注册用户
request.setAttribute("message", "注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!!");
request.getRequestDispatcher("info.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("message", "注册失败!!");
request.getRequestDispatcher("info.jsp").forward(request, response);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置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">
<servlet>
<servlet-name>register</servlet-name>
<servlet-class>com.kuang.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/RegisterServlet.do</url-pattern>
</servlet-mapping>
编写反馈页面info.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>提示信息</title>
</head>
<body>
${message}
</body>
</html>
学完web之后我跟着网上做了一个SMBMS项目(超市订单管理系统),有兴趣的朋友可以看我的另一篇新项目博客
fo.jsp").forward(request, response);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置web.xml,代码如下:
```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">
<servlet>
<servlet-name>register</servlet-name>
<servlet-class>com.kuang.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/RegisterServlet.do</url-pattern>
</servlet-mapping>
编写反馈页面info.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>提示信息</title>
</head>
<body>
${message}
</body>
</html>
学完web之后我跟着网上做了一个SMBMS项目(超市订单管理系统),有兴趣的朋友可以看我的另一篇新项目博客
博客地址:SMBMS项目一览