完成商城中User相关服务
技术总结
1. 数据库的实体之间关系
- 1:1 例如一个订单表对应有一个订单详情表
- 1:n 例如一个分类表下有多个商品
解决:在商品表中添加一个字段,用于填写分类信息,并设置其为外键,与分类的主键关联起来。 - n:m 例如一个订单中包含有多个商品,一个商品又可能存在于多个订单中。
解决:设置一个新表,订单详情表,保存订单主键信息和商品的主键信息。
2. 通用Servlet的设计模式
思想:编写父类BaseServlet并重写Service方法,Service方法根据请求路径来选择子类的方法执行。子类中只需编写相应的方法,例如add(request,response)等业务逻辑方法。
例如:请求路径为/user?method=add ,/user?method=update,/product?method=update。
请求来的时候父类中的Service方法先获取相应的子类UserServlet,ProductServlet,再执行相应的方法add(request, response) , update(request, response)
这样可有效减少Servlet的数量
实现步骤
//1. 编写BaseServlet继承HttpServlet
//2. 重写Service方法
public class BaseServlet extends HttpServlet{
@Override
protected void Service(HttpRequest request, HttpResponse response) throws Exception{
try {
// 1.获取子类
Class clazz = this.getClass();
//System.out.println(clazz);
// 2.获取方法名称
String m = request.getParameter("method");
if(m==null) {
m="index";
}
//System.out.println(m);
// 3.获取方法对象
Method method = clazz.getMethod(m, HttpServletRequest.class, HttpServletResponse.class);
// 4.执行方法 返回请求转发的路径
String url = (String) method.invoke(this, request, response);
if(url!=null) {
request.getRequestDispatcher(url).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
//3. 子类中编写相应的方法
注意:子类方法应声明为public String add(request, response)
默认为protected ,public 是为了让反射获取的方法可以被执行
否则method.invoke()出错
3. IndexServlet处理
- IndexServlet 绑定路径/index,web-content下的inedx.jsp也使用<jsp:forward page="/index"> 转发
- BaseServlet 中编写index方法,返回null,若获取不到method名称,则methodName = "index" ,子类Servlet不作处理。
- IndexServlet中重写index方法,请求数据库,返回请求转发路径。
4. 自定义转换器
//方案一:编写自定义类实现Converter接口,在封装对象前注册。
ConverterUtils.register(new MyConverter(), Date.class);
//方案二:封装对象前编写匿名类
ConverterUtils.register(new Converter(){
@Override
public Object convert(Class clazz, Object value) {
//将object 转成date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse((String) value);
return date;
} catch(Exception e){
e.printStackTrace();
}
return null;
}
}, Date.class);
5. 密码加密
- sql语句中MD5(字段或值)
将密码进行MD5加密后存入数据库,登录时也把用户输入的密码进行MD5加密,拿到数据库中比对。
6. 邮件发送
- 易邮客户端
设置服务器域名,邮箱账号 - foxmail
设置本地服务器,进行收发邮件
其他零散的知识
1. 错误页的配置
web.xml <error-page>
2. 方法访问权限
public 所有类都可访问
protected 子类、朋友可访问
private 只有自己能访问
3. 日期Date导包 java.util.date
4. 邮件传输过程
5. 路径
//使用相对路径,可忽略项目名
request.getRequestDispatcher("/index").forward(request, response);
//使用相对路径,需要加上项目名
response.senRedirect(request.getContextPath()+"/index");