Web项目系列文章推荐: |
---|
JavaWeb企业实战项目(二):用户登录-首页详情-商品分类 |
JavaWeb企业实战项目(三):商品模块 |
JavaWeb企业实战项目(四):订单模块 |
JavaWeb企业实战项目(五):后台模块1 |
JavaWeb企业实战项目(六):后台模块2 |
待更新 |
subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道
psubscribe channel*:批量订阅,例:psubscribe s*,订阅以"s"开头的频道
publish channel content:在指定的频道中发布消息,如publish mychant ‘hello my friends’
使用消息订阅的前提是:开启三个client
再次复习Redis持久化的方式:
RDB持久化是内部原理是生成内存状态机的快照,所以占用空间会很小
AOF持久化是以日志的形式保存用户的每一个操作,主要是写操作
无持久化(略)、同时RDB和AOF(略)
软件开发流程
1 软件需求的分析,软件要做什么功能
2 软件页面原型设计,把实现功能画出功能图
3 把原型转换成静态页面,把功能图转换成html页面
4 数据库设计和技术选型
5 系统的编码
6 系统的测试
7 系统的部署和维护
异常处理
1 每一个异常都直接处理
2 全抛,统一处理异常
开发准备
1、创建数据仓库,建立表结构
2、数据增删改查都要用到Servlet,如何减少Servlet数量?
答:首先外面看一下从客户端向服务端发起请求的方式:
1_通过表单向服务端发起请求
2_通过超链接向服务端发起请求
3_Ajax向服务端发起请求
减少Servlet原理:传递隐含信息Method
服务端获取到method之后,判断是什么方法,就调用什么功能,这样一个Servlet就能做很多事
减少Servlet的最直接方法就是实现一个通用Servlet,就和连接池一般,(前提还是获取一个隐藏参数method)
首先Jsp内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
"Content-Type" content="text/html; charset=UTF-8">
提交
通用Servlet实现阶段(一)
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实现阶段(二)
//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("无此方法");
}
}
}
首先,提了Eclipse的close 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
开发约定:为了项目管理方便,不会从客户端直接发起请求到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 keySet = map.keySet();
Iterator 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 "";
}
开发步骤约定(普通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、运行页面,完成注册,到调试界面
邮件服务器:
公司服务器上安装软件,管理各个邮箱账户中的邮件 接收/发送
电子邮箱:
各个账户在服务器上开辟一段空间
邮件协议:发送SMTP 接收:pop3/pop/imap
作用:约定了邮件在网络中传输格式
搭建邮件服务器:
1、获取到eyoumailserversetup.exe,并执行安装
2、打开工具->服务器设置
3、创建新账号
4、获取到FoxMail软件并执行安装
5、进行配置即可
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", "用户注册失败,请重新注册!");
}