Web项目系列文章推荐: |
---|
👉 JavaWeb企业实战项目(二):用户登录-首页详情-商品分类 |
👉 JavaWeb企业实战项目(三):商品模块 |
👉 JavaWeb企业实战项目(四):订单模块 |
👉 JavaWeb企业实战项目(五):后台模块1 |
👉 JavaWeb企业实战项目(六):后台模块2 |
👉 待更新 |
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实现阶段(一)
- 在某个要被用到的Servlet中写好所有方法
- doGet中获得method,用于判断
- 分别判断method是否为其中一个方法
- 若是,则调用下面的方法
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实现阶段(二)
- 在某个要被用到的Servlet中写好所有方法
- 创建一个BasicServlet,作为通用Servlet
- 重写BasicServlet中的Server方法
(这里重写Server方法的原因是,每一个Servlet在被调用的时候都会调用父类的init、server这些方法。一般情况下我们不会重写这些初始化的方法,所以我们利用这一点。直接重写了server方法,阻断了普通Servlet的加载,达到通用Servlet的目的) - 我们要用到的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的好处:
- close掉project, 那么开启myeclipse的时候, 就不会自动加载该project的相关zd文件跟jar包等等, 会提高运行速度。
- close project 可以在开发其他项目时,释放出内存,使计算机版运行速度更快。
- 可以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包
3、导入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、打开工具->服务器设置
3、创建新账号
4、获取到FoxMail软件并执行安装
5、进行配置即可
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", "用户注册失败,请重新注册!");
}