开发步骤

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

总结一下:

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

 

posted @ 2019-10-16 10:23  蓝色风扇  阅读(227)  评论(0编辑  收藏  举报