由于技术不熟练以及事情太多,导致开发周期一拖再拖。为了能够尽快实现上线,决定分为逐模块开发,而非一步到位。
总结一下:
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; }