JavaWeb企业实战项目(一):环境搭建-用户注册-邮件发送

1、回顾Redis消息订阅和发布

subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道
psubscribe channel*:批量订阅,例:psubscribe s*,订阅以"s"开头的频道
publish channel content:在指定的频道中发布消息,如publish mychant ‘hello my friends’
使用消息订阅的前提是:开启三个client

再次复习Redis持久化的方式:
RDB持久化是内部原理是生成内存状态机的快照,所以占用空间会很小
AOF持久化是以日志的形式保存用户的每一个操作,主要是写操作
无持久化(略)、同时RDB和AOF(略)

2、开发常识

软件开发流程
  1 软件需求的分析,软件要做什么功能
  2 软件页面原型设计,把实现功能画出功能图
  3 把原型转换成静态页面,把功能图转换成html页面
  4 数据库设计和技术选型
  5 系统的编码
  6 系统的测试
  7 系统的部署和维护
异常处理
  1 每一个异常都直接处理
  2 全抛,统一处理异常
开发准备
  1、创建数据仓库,建立表结构
  2、数据增删改查都要用到Servlet,如何减少Servlet数量?
    答:首先外面看一下从客户端向服务端发起请求的方式:
  1_通过表单向服务端发起请求
  2_通过超链接向服务端发起请求
  3_Ajax向服务端发起请求
    减少Servlet原理:传递隐含信息Method
    服务端获取到method之后,判断是什么方法,就调用什么功能,这样一个Servlet就能做很多事

3、通用Servlet实现

减少Servlet的最直接方法就是实现一个通用Servlet,就和连接池一般,(前提还是获取一个隐藏参数method)
首先Jsp内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="JQuery/jquery-1.11.3.min.js"></script>
</head>
<body>	
	<form action="TestServlet3?method=addStu" method="post">
		用户:<input type="text" name="name"/>
		<button>提交</button>
	</form>
	<a href="TestServlet3?method=delStu&name='hillain'">提交</a>
	<button οnclick="fun()">提交</button>
	<script>
		function fun(){
			$.post("TestServlet3",{method:"update",name:"李四"},function(data,status){
				alert(status);
				alert(data);
			});
		}
	</script>
</body>
</html>

通用Servlet实现阶段(一)

  1. 在某个要被用到的Servlet中写好所有方法
  2. doGet中获得method,用于判断
  3. 分别判断method是否为其中一个方法
  4. 若是,则调用下面的方法
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception{
    	request.setCharacterEncoding("utf-8");
    	String method = request.getParameter("method");
    	if("addStu".equals(method)){
    		this.addStu();
    	}else if("delStu".equals(method)){
    		this.delStu();
    	}else if("update".equals(method)){
    		this.update();
    	}
    }
    //下面是addStu、delStu、update函数...
    

通用Servlet实现阶段(二)

  1. 在某个要被用到的Servlet中写好所有方法
  2. 创建一个BasicServlet,作为通用Servlet
  3. 重写BasicServlet中的Server方法
    (这里重写Server方法的原因是,每一个Servlet在被调用的时候都会调用父类的init、server这些方法。一般情况下我们不会重写这些初始化的方法,所以我们利用这一点。直接重写了server方法,阻断了普通Servlet的加载,达到通用Servlet的目的)
  4. 我们要用到的Servlet继承BasicServlet
    //TestServlet
    public class TestServlet extends BasicServlet {
    	public String addStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("this is addStu");
    		return null;
    	}
    	public String delStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("this is delStu");
    		return null;
    	}
    	public String update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("this is update");
    		return null;
    	}
    }	
    //BasicServlet
    public class BasicServlet extends HttpServlet {
    	public String path = null;	//执行方法后的转发路径
    	@Override
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//设置编码并获取参数
    		request.setCharacterEncoding("utf-8");
    		String method = request.getParameter("method");
    		//获取类子类class
    		Class clazz = this.getClass();
    		try {
    			//通过参数获得对应Servlet中的方法
    			Method md = clazz.getMethod(method,HttpServletRequest.class,HttpServletResponse.class);
    			//执行并获得转发路径
    			if(md!=null)path = (String)md.invoke(this,request,response);
    			//若转发路径不为空则跳转页面
    			if(path!=null)response.sendRedirect(path);
    		} catch (Exception e) {
    			System.out.println("无此方法");
    		}
    	}
    }
    

4、环境搭建

首先,提了Eclipse的close project的好处:

  1. close掉project, 那么开启myeclipse的时候, 就不会自动加载该project的相关zd文件跟jar包等等, 会提高运行速度。
  2. close project 可以在开发其他项目时,释放出内存,使计算机版运行速度更快。
  3. 可以close project,当需要使用关闭的项目时,可以选中项目,右键,点击open project,然后项目就打开可以正权常使用了。

1、创建Package,层级结构与包如下:
  store.web
    store.web.servlet
    store.web.fitler
    store.web.base
  store.service
    store.service.serviceImp
  store.dao
    store.dao.daoImp
  store.domain
  store.utils
2、导入jar包
导入jar包
3、导入Utils工具类
导入utils
UUIDUtils生成随机字符串 —— 100年才可能重复一次
EncodingFilter编码过滤器 —— 统一编码所有方法并放行
EncodingFilter改放在了web中的filter中
其他工具不详细说明…
4、导入c3p0配置文件并修改相关配置
5、导入通用Servlet - 不需要配置
6、导入JSP页面原型
7、创建用户模块相关程序
  User、UserServlet、UserService、UserServiceImpl、UserDao、UserDaoImpl

5、实现用户注册_原理分析

开发约定为了项目管理方便,不会从客户端直接发起请求到JSP页面。先请求到Servlet再由Servlet转发到JSP页面
由开发约定实现页面路径跳转
 1:/jsp/index.jsp修改连接
 2:UserServlet -> registUI
  return “/jsp/register.jsp”;
注册功能原理分析
原理分析
测试MyBeanUtils接收表单参数
register页面中有个注册表单,隐藏的method为"userRegist",Servlet中功能代码如下:

//UserServlet中userRegist()
public String userRegist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Map<String, String[]> map = request.getParameterMap();
	User user = new User();
	//直接用工具类实现
	MyBeanUtils.populate(user, map);
	
	/*try {
		// 1_创建时间类型的转换器
		DateConverter dt = new DateConverter();
		// 2_设置转换的格式
		dt.setPattern("yyyy-MM-dd");
		// 3_注册转换器
		ConvertUtils.register(dt, java.util.Date.class);
		BeanUtils.populate(user, map);
	} catch (Exception e) {
		e.printStackTrace();
	} */
	
	//遍历map中的数据
	/*Set<String> keySet = map.keySet();
	Iterator<String> iterator = keySet.iterator();
	while(iterator.hasNext()){
		String next = iterator.next();
		System.out.println("key="+next);
		String[] strs = map.get(next);
		for (String string : strs) {
			System.out.println(" value="+string);
		}
	}*/
	return "";
}

6、实现用户注册功能

开发步骤约定(普通MVC功能)
1_准备工作(表单属性设置,链接拼接,Ajax编写)
 准备工作实现完毕之后,可以从客户端向服务端发起请求
2_Servlet
 明确要实现的功能,中文注释,代码
3_service_dao
4_jsp页面
 PS:为了方便断点调试,eclise===>window==>preferences===>java===>debug
调试
开发步骤实现(普通MVC功能)
1_准备工作 /jsp/register.jsp
 设置表单各种属性 action method
2_UserServlet__>userRegist
 接收表单参数
 调用业务层注册功能
 注册成功,向用户邮箱发送信息,跳转到提示页面
 注册失败,跳转到提示页面
3_依次实现service,dao
4_ /jsp/info.jsp获取提示信息
 修改美化info.jsp中的header和bottom
 修改info.jsp中的中间信息部分,改成${msg}提示
注册功能开发,代码实现

//UserServlet中userRegist()
public String userRegist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Map<String, String[]> map = request.getParameterMap();
	User user = new User();
	user.setState(0);
	user.setUid(UUIDUtils.getId());
	user.setCode(UUIDUtils.getCode());
	MyBeanUtils.populate(user, map);
	UserService service = new UserServiceImpl();
	try {
		service.userRegist(user);
		request.setAttribute("msg", "用户注册成功,请激活!");
	} catch (SQLException e) {
		request.setAttribute("msg", "用户注册失败,请重新注册!");
	}
	return "/jsp/info.jsp";
}

//UserServiceImpl
public class UserServiceImpl implements UserService{
	@Override
	public void userRegist(User user) throws SQLException {
		UserDao dao = new UserDaoImpl();
		dao.userRegist(user);
	}
}

//UserDaoImpl
public class UserDaoImpl implements UserDao {
	@Override
	public void userRegist(User user) throws SQLException {
		String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
		Object[] params = {user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode()}; 
		qr.update(sql, params);
	}
}

断点调试编辑Servlet
1、开发调试不是用对比,光看效率很低,所以一般使用调试来处理问题
2、添加断点,Debug on Server
3、运行页面,完成注册,到调试界面

7、搭建邮箱服务器_配置客户端

邮件服务器
公司服务器上安装软件,管理各个邮箱账户中的邮件 接收/发送
电子邮箱
各个账户在服务器上开辟一段空间
邮件协议:发送SMTP 接收:pop3/pop/imap
作用:约定了邮件在网络中传输格式
搭建邮件服务器
1、获取到eyoumailserversetup.exe,并执行安装
2、打开工具->服务器设置
设置1
3、创建新账号
设置2
4、获取到FoxMail软件并执行安装
5、进行配置即可
设置3
设置4

8、电子邮箱相关概念及实现

SMTP协议 —— 发邮件协议
全称为Simple Mail Transfer Protocol(简单邮件传输协议) , 它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。
端口号:25
POP3协议 —— 收邮件协议
全称为PostOffice Protocol(邮局协议) , 它定义了邮件客户端软件与POP 3服务器的通讯规则。
端口号:110
收发邮件流程图
发件人通过SMTP服务器发->SMTP服务器收到存储设备->通过POP3服务器转发给收件人
收发邮件
FoxMail使用QQ邮箱
进入QQ邮箱;设置;开启POP3/SMTP服务;记下授权码;创建FoxMail用户;使用授权码收发邮件
Java实现用户邮件的发送
UserServlet中userRegist添加:

try{
	service.userRegist(user);
	MailUtils.sendMail(user.getEmail(), user.getCode());
	request.setAttribute("msg", "用户注册成功,请激活!");
} catch (Exception e) {
	request.setAttribute("msg", "用户注册失败,请重新注册!");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章