【javaWeb】第49天—— WEB实战项目

回顾:
注解:
格式:
@interface 注解名{}
jdk中三个注解
自定义注解:
注解属性:
接口中的方法
类型:
基本类型
String
Class
Annotation
Enum
以上类型的一维数组
若一个注解有属性,使用的时候的必须有值
元注解
@Retention 保留到那个阶段
source
class
runtime
@Target 作用在那个部分上
type
method
filed
////////////////////////////////
文件上传:
servlet3.0
没有web.xml
内嵌文件上传功能
支持注解开发
….

    注解开发:
        @WebServlet(urlPatterns={"/demo1","/demo2"})
        @WebListener
        @WebFilter(urlPatterns={"/demo1","/demo2"})

文件上传要求
    浏览器要求
        1.提交方式post
        2.提供文件上传组件 input type="file"
        3.表单enctype属性的值 multipart/form-data
    servlet3.0服务器要求
        在servlet上添加注解 @MultipartConfig
        普通上传组件:
            request.getParameter()
        文件上传组件
            Part part=request.getPart(name值)
            获取文件的名称
                part.getHeader("content-disposition");然后截取就可以  
            获取文件的流
                part.getInputStream()
            对拷流
            删除临时文件
                part.delete()
    文件上传注意问题:
        文件重名:随机名称
        文件安全:
        文件目录:
            用户
            时间
            数量
            随机
/////////////////////////////////////

动态代理:
jdk中Proxy
前提:要求代理对象和被代理对象要实现接口

    Object Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvoctaionHandler h);
        参数:
            ClassLoader loader:一般使用的被代理对象使用的loader  被代理对象.getClass().getClassLoader()
            Class[] interfaces:一般使用的被代理对象实现的所有接口 被代理对象.getClass().getInterfaces()
            InvoctaionHandler:接口 执行处理类
                里面有一个方法需要实现 
                    Object invoke(Object proxy,Method method,Object... args)
                    参数:
                        proxy:代理对象,不要使用
                        method:当前执行的方法
                        args:当前方法所需要的参数

////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
商城的实体:
用户
订单
商品
分类
/////////////////////////////////////////
准备工作:
数据库和表
create database store28;
use store28;

    CREATE TABLE `user` (
      `uid` varchar(32) NOT NULL,
      `username` varchar(20) DEFAULT NULL,
      `password` varchar(100) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `email` varchar(30) DEFAULT NULL,
      `telephone` varchar(20) DEFAULT NULL,
      `birthday` date DEFAULT NULL,
      `sex` varchar(10) DEFAULT NULL,
      `state` int(11) DEFAULT NULL,
      `code` varchar(64) DEFAULT NULL,
      PRIMARY KEY (`uid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
项目
    包结构
        com.itheima.web.servlet
        com.itheima.web.filter
        com.itheima.service         ---service 的接口
        com.itheima.service.impl    ---service 的实现类
        com.itheima.dao             ---dao的接口   
        com.itheima.dao.impl        ---dao的接口   
        com.itheima.domain
        com.itheima.utils
        com.itheima.constant

    jar包
        驱动
        c3p0
        dbuitls
        beanutils
        jstl
        邮件
    工具类和配置文件
        datasourceutils 和 c3p0配置文件
        uuidutils
        uploadutils
        md5uitls
        mailutils

    前台页面
        将页面拷贝到项目中

//////////////////////////////////////////////
用户模块:
注册
发送邮件的方式发送激活码
激活
登录
退出

////////////////////////////////////////////
通用servlet设计

只定义一个Userservlet
    重写doget和dopost

例如添加用户的时候
    以前: /store/addUser
    现在: /store/user?method=add

    修改用户的时候
    以前: /store/updateUser
    现在: /store/user?method=update

在userservlet中doget方法中
    Stirng m=request.getParameter("method");
    if("add".equals(m)){
        add(HttpServletRequest,HttpServletResponse)
    }else if("update".equals(m)){
        update(HttpServletRequest,HttpServletResponse)
    }else if(){

    }


我们可以直接重写service方法即可
    在service方法中写上面的判断代码即可
//////////////////////////////////////////////
BaseServlet extends HttpServlet{}

其他的servlet继承baseServlet


在baseservlet中重写service方法
    1.获取请求的方法
    2.找到相应的子类 父类中的this代表的是子类
        Class clazz=this.getClass()
    3.子类调用方法
        通过方法名称 获取一个指定的方法 
            Method m=clazz.getMethod(方法名,HttpServletRequest.class,HttpServletResponse.class)
        方法执行
            m.invoke(this,HttpServletRequest,HttpServletResponse);

以前在servlet中 我们执行方法之后无非 请求转发 重定向 打印数据 
    请求转发  reuqest.getRequestDispatcher().forward()

    继续完善我们baseservlet中service
        在第3步,方法执行返回值,
        现在我让所有的方法都返回一个字符串  add update
            字符串代表的是请求转发的路径
            若该方法不转发只需要返回一个null
        String s=(String)m.invoke(this,HttpServletRequest,HttpServletResponse);
        if(s!=null){
            reuqest.getRequestDispatcher(s).forward(...);
        }
//////////////////////////////////
案例1-用户注册

步骤实现:
    1.在index.jsp上点击 注册页面 跳转到register.jsp
    2.点击注册 
        

    3.在userservlet中编写一个registUI 方法
        请求转发到 register.jsp即可.
完成注册
    1.regist
        封装数据
            设置id
            设置state
            设置code
        调用service 完成注册操作
        请求转发 /jsp/msg.jsp
    2.userservice中的service
        调用dao
        发送激活邮件
    3.userdao dao 添加一条数据

注意:封装数据的时候报了一个错误
    是因为 字符串装成时间类型的是出现错误
        BeanUtils不支持字符串装成时间
解决方案:
    自定义转化器
        1.编写一个类 实现Conventer接口
        2.实现方法
            convert(转换成的类型,前台页面传入的字符串)
        3.注册转化器 在封装数据之前注册
            ConvertUtils.register(new MyConventer(), Date.class);

扩展:
使用算法加密密码
md5加密 不对称的加密,不可逆
在数据库中可以使用 md5(字段|值)
java中api

////////////////////////////////
电子邮箱:就是在邮件服务器上开启的一块空间
服务器:提供邮件服务
协议:规定数据的格式

发送邮件的协议:smtp
接受邮件的协议:pop / pop3    imap

/////////////////////////////////
本地的服务器 :
邮件服务器
设置域名 store.com
新增几个账户 (普通用户)
jack
tom
新增一个管理员账户
service

.///////////////////////////////////

.///////////////////////////////////
案例2-用户激活
邮箱的连接点击
http://localhost/store/user?method=active&code=824736A172A04023A7D71A498B8F6DF1
需要在UserServlet编写一个active
获取激活码
调用service完成激活
页面跳转, 请求转发 jsp/msg.jsp
userService中
active(code)
1.通过激活码获取一个用户
用户有可能为空
2.若不为空,修改用户的state 将0改成1
///////////////////////////////////////

案例3-用户登录
步骤分析:
1.在index.jsp上登录连接 点击 跳转到login.jsp
可以通过userservlet进行请求转发 loginUI
2.修改页面上的form表单 method 每个标签添加name属性
action:/store/user?method=login
3.login操作:
获取用户名和密码
调用service 获取一个user
判断用户是否为空
若为空:
若不为空
继续判断是否激活
只有激活的时候,将用户放入session中
4.页面重定向到首页上
展示用户名 退出 我的订
//////////////////////////////
案例4-用户退出
步骤分析:
点击用户退出,
/store/user?method=logout
编写logout方法
干掉session
页面重定向

你可能感兴趣的:(java大师基础篇)