zoukankan      html  css  js  c++  java
  • 开发步骤

    由于技术不熟练以及事情太多,导致开发周期一拖再拖。为了能够尽快实现上线,决定分为逐模块开发,而非一步到位。

    总结一下:

    1、开发项目的第一步骤是确认需求,想做什么,想有哪些功能。需求要尽可能完善,尽可能具体,并初步判断需要哪些技术,是否可以实现等。

    2、确定开发环境,开发环境和运行环境。jdk8+eclipse+tomcat9+mysql+ubuntu18

    3、划分模块和分析详细内容。(事实上,这一步应该是由大佬完成,负责人需要有很深很广的技术根基、有丰富的开发和架构经验才能够直接的、正确的设计模块)

    对于初学者,更多的是走一步看一步,需要反复修改。

    结合实际和自身条件,我决定从首页开始作分析和开发。

    首页

    首页的功能分析:

    1、用户注册、用户登录、用户个人管理入口

    2、博客、文件、音乐、视频和网站信息入口

    3、展示最新博客信息、公告、口号、推荐信息等

    综上分析,首页应该是jsp页面,方便做动态显示。

    其次是关于首页的信息应由相应的servet来处理,而不是jsp本身,推广到所有jsp页面,都采用先判断对jsp的访问是否是对应的servlet,如果不是则先转发至servlet,经处理后才转发给jsp页面。具体实现由servlet写入session属性为lastURL,属性值为当前servlet名,然后由jsp检查实现判断访问来源。

    因此,每个servlet都应该能够创建session,而登录后向session写入account属性,属性值为登录的账户名。

    然后,为了方便路径管理,采用api自动获取域名、主机名、端口,并写入项目名,以网站根目录作为网站内所有url的相对路径。

     头部

    <head>
    <meta charset="UTF-8">
    <%
    if(session.getAttribute("lastURL")!="IndexServlet"){
        request.getRequestDispatcher("../IndexServlet").forward(request, response);
    }
    pageContext.setAttribute("basePath", request.getScheme()+"://"+request.getServerName()+":"+
    request.getServerPort()+request.getContextPath()+"/");
    %>
    <base href="${basePath}">
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <title>首页</title>
    </head>
    <body>

    登录、注册和个人管理

    <div class="topnav">
    <%String account = null;
    if(session.getAttribute("account")!=null){
        account = session.getAttribute("account").toString();
    }
    if(account!=null){%>
        <a href="AdminServlet"><%=account %></a>
    <%}else{%>
        <a href="LoginServlet">登录</a>
    <%}%>
    <a href="RegisterServlet">注册</a>
    </div>

    博客、文件、视频、音乐、小功能、网站信息入口

    <div class="nav">
    <a href="BlogServlet">博客</a>
    <a href="FileServlet">文件</a>
    <a href="VideoServlet">视频</a>
    <a href="MusicServlet">音乐</a>
    <a>小功能</a>
    <a href="WebsiteServlet">网站公告及联系</a>
    </div>

    IndexServlet

     IndexServlet主要负责最新博客等信息,向数据库查询,然后转发给index.jsp,在前期暂时不做处理,需要做的是向session中写入属性lastURL的值为IndexServlet,再转发给index.jsp。

    HttpSession session = request.getSession(true);
            session.setAttribute("lastURL", "IndexServlet");
            request.getRequestDispatcher("jsp/index.jsp").forward(request, response);

    RegisterServlet

    设置文本编码

    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");

    关于注册,从简单实用的角度出发,填写账户,密码,手机号即可。

    register.jsp负责填写信息,提交表单到RegisterServlet,RegisterServlet审核,如果account、password不为空,提交的信息经过了安全检查和规范检查,account与已有账户不重复,则将注册信息写入数据库用户表。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            HttpSession session = request.getSession(true);
            session.setAttribute("lastURL", "RegisterServlet");
            String account = request.getParameter("account");
            String password = request.getParameter("password");
            String phone = request.getParameter("phone");
            if(account==null||password==null||phone==null) {
                response.sendRedirect("jsp/register.jsp");
            }else if(check(account,password,phone)){//三项信息不为空,且符合检查,则提交给数据库进行
                UserDB userDB = new UserDB();//数据库中用户表操作类
                if(userDB.checkUser(account)==false) {//当该账户尚未注册时,进行注册
                    userDB.addUser(account,password,phone);
                    request.getRequestDispatcher("LoginServlet").forward(request, response);
                }else {
                    Cookie cookie = new Cookie("registerInfo", "账户已存在");
                    cookie.setPath("jsp/register.jsp");
                    response.addCookie(cookie);
                }
            }else {//当三项信息不为空,但检查失败时,重定向到register.jsp,要求重新填写
                response.sendRedirect("jsp/register.jsp");
            }
        }
        public boolean check(String account,String password,String phone) {
            boolean flag = true;//当不符合某项检查时,将flag设置为false,当符合时,不做设置
            //1、字符串长度应符合预定,account<15,password<15,phone=11
            if(!(account.length()<15&&password.length()<15&&phone.length()==11)) {
                flag = false;
            }else {
            for(int i=0;i<account.length();i++) {//2、account和password应该由字母、数字组成,phone全为数字
                char ch = account.charAt(i);
                if(Character.isDigit(ch)||Character.isLetter(ch)) {
                    
                }else {
                    flag=false;
                    break;
                }
            }
            for(int i=0;i<password.length();i++) {//2、account和password应该由字母、数字组成,phone全为数字
                char ch = password.charAt(i);
                if(Character.isDigit(ch)||Character.isLetter(ch)) {
                    
                }else {
                    flag=false;
                    break;
                }
            }
            for(int i=0;i<phone.length();i++) {//2、account和password应该由字母、数字组成,phone全为数字
                char ch = account.charAt(i);
                if(Character.isDigit(ch)) {
                    
                }else {
                    flag=false;
                    break;
                }
            }
            //3、检查是否有mysql注入,由于本次三个信息全为数字或字母,所以不存在sql注入风险,故不检查
            }
            return flag;
        }
    View Code
  • 相关阅读:
    一起学编程(3--组织与表达)
    摩托罗拉SE955 One Discrete Length,Two Discrete Lengths,Length Within Range 相关解释
    完好用户体验: 活用window.location与window.open解决页面跳转问题
    一张图帮你看懂 iPhone 6 Plus 的屏幕分辨率
    李振杰:火狐Mozilla被黑事件的启发
    POJ 1611 The Suspects 并查集 Union Find
    hdu1879 继续畅通project(最小生成树)
    【Android实战】Socket消息通信
    HDOJ 5098 Smart Software Installer 拓扑排序
    各大电商的缓存策略
  • 原文地址:https://www.cnblogs.com/blunFan/p/11683809.html
Copyright © 2011-2022 走看看