以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程
JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作、项目管理、可用性等方方面面的问题。
一些约定
考虑到项目管理的方便,一般前端不能直接访问到jsp页面,而是必须通过Servlet来管理到Jsp页面的跳转
<li><a href="${pageContext.request.contextPath}/UserServlet?method=registUI">注册</a></li>
在以上的超链接中,通过定位到继承了BaseServlet类的UserServlet的registUI方法,来处理跳转的功能。
public String registUI(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
return "/jsp/register.jsp";
}
MVC架构下开发步骤
首先,以用户注册这一功能模块为例,其服务端的逻辑如图所示:

一般来说,一个功能模块包括许多的业务功能点,比如用户注册,就包括用户名校验、注册、发送激活邮件、发送验证短信等等具体的功能点。这些功能点就体现在不同Servlet(或者action或者Controller)的业务方法里,而所用的方法又会调用到Service包和Dao包中的增删改查原子方法。
根据服务端的运行逻辑,一般的开发流程包括
1. 页面准备
包括表单属性添加修改、拼接超链接、添加Ajax等
<div class="col-md-8" style="background:#fff;padding:40px 80px;margin:30px;border:7px solid #ccc;">
<font>会员注册</font>USER REGISTER
<form class="form-horizontal" style="margin-top:5px;" action="${pageContext.request.contextPath}/UserServlet?method=userRegist" method="post">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-6">
<input type="text" name="username" class="form-control" id="username" placeholder="请输入用户名">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
<div class="col-sm-6">
<input type="password" name="password" class="form-control" id="inputPassword3" placeholder="请输入密码">
</div>
</div>
<div class="form-group">
<label for="confirmpwd" class="col-sm-2 control-label">确认密码</label>
<div class="col-sm-6">
<input type="password" class="form-control" id="confirmpwd" placeholder="请输入确认密码">
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">Email</label>
<div class="col-sm-6">
<input type="email" name="email" class="form-control" id="inputEmail3" placeholder="Email">
</div>
</div>
<div class="form-group">
<label for="usercaption" class="col-sm-2 control-label">姓名</label>
<div class="col-sm-6">
<input type="text" name="name" class="form-control" id="usercaption" placeholder="请输入姓名">
</div>
</div>
<div class="form-group opt">
<label for="inlineRadio1" class="col-sm-2 control-label">性别</label>
<div class="col-sm-6">
<label class="radio-inline">
<input type="radio" name="sex" id="inlineRadio1" value="男" checked="checked"> 男
</label>
<label class="radio-inline">
<input type="radio" name="sex" id="inlineRadio2" value="女"> 女
</label>
</div>
</div>
<div class="form-group">
<label for="date" class="col-sm-2 control-label">出生日期</label>
<div class="col-sm-6">
<input type="date" class="form-control" name="birthday" >
</div>
</div> <div class="form-group">
<label for="date" class="col-sm-2 control-label">电话</label>
<div class="col-sm-6">
<input type="text" class="form-control" name="telephone" >
</div>
</div> <div class="form-group">
<label for="date" class="col-sm-2 control-label">验证码</label>
<div class="col-sm-3">
<input type="text" class="form-control" >
</div>
<div class="col-sm-2">
<img src="${pageContext.request.contextPath}/img/captcha.jhtml"/>
</div> </div> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" width="100" value="注册" name="submit" border="0"
style="background: url('${pageContext.request.contextPath}/img/register.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0);
height:35px;width:100px;color:white;">
</div>
</div>
</form>
</div>
2. 在对应的功能模块Servlet中,添加功能点的方法实现
可以通过添加注释分解步骤,逐步完善业务代码逻辑。
//用户注册模块的注册功能点
public String userRegist(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 接收表单参数
Map<String, String[]> map = request.getParameterMap();
//新建User对象
User user = new User();
//调用Utils的popultae方法为User对象赋值
//MyBeanUtil封装了Apache Common的BeanUtil方法, 添加了转换时间格式的代码
MyBeanUtils.populate(user, map);
// 为用户的其他属性赋值,如用户编号, 状态码, 激活码
user.setUid(UUIDUtils.getId());
user.setState(0);
user.setCode(UUIDUtils.getCode());
System.out.println(user); /*
* //遍历map中的数据 Set<String> keySet = map.keySet(); Iterator<String>
* iterator = keySet.iterator(); while(iterator.hasNext()){ String
* str=iterator.next(); System.out.println(str); String[] strs =
* map.get(str); for (String string : strs) {
* System.out.println(string); } System.out.println(); }
*/ // 注册功能点封装在业务层中
UserService UserService = new UserServiceImp();
try {
UserService.userRegist(user);
// 注册成功,向用户邮箱发送信息,跳转到提示页面
// 调用MailUtils方法, 发送邮件
MailUtils.sendMail(user.getEmail(), user.getCode());
request.setAttribute("msg", "用户注册成功,请激活!"); } catch (Exception e) {
// 注册失败,跳转到提示页面
request.setAttribute("msg", "用户注册失败,请重新注册!"); }
return "/jsp/info.jsp";
}
3. 完善Service包下的接口和实现类
UserService接口
public interface UserService {
void userRegist(User user) throws SQLException;
}
UserServiceImp接口实现类
public class UserServiceImp implements UserService {
@Override
public void userRegist(User user) throws SQLException {
//实现注册功能
UserDao UserDao=new UserDaoImp();
UserDao.userRegist(user);
}
}
4. 完善Dao包下的接口和实现类
UserDao接口
public interface UserDao {
void userRegist(User user) throws SQLException;
}
UserDaoImp接口实现类
public class UserDaoImp implements UserDao {
@Override
public void userRegist(User user) throws SQLException {
String sql="INSERT INTO USER VALUES(?,?,?,?,?,?,?,?,?,?)";
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
Object[] params={user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode()};
qr.update(sql, params);
}
}
总结
基本上所有的基于MVC思想的架构开发,都可以遵循这样的逻辑,来逐步完善应用代码。
以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程的更多相关文章
- 浅谈SDN架构下的运维工作
导读 目前国内的网络运维还处于初级阶段,工作人员每天就像救火一样,天天疲于奔命.运维人员只能埋头查找系统运行的日志,耗时耗力,老眼昏花不说,有时候忙了半天还一无所获,作为运维工程师的你,有木有遇到过类 ...
- 浅谈Windows环境下DOS及MS-DOS以及常见一些命令的介绍
浅谈Windows环境下DOS及MS-DOS以及常见一些命令的介绍 前记 自己是搞编程的,首先我是一个菜鸟,接触计算机这么久了,感觉很多计算机方面的技术和知识朦朦胧胧.模模糊糊,貌似有些贻笑大方了:所 ...
- 浅谈 MVC 和 MTV
浅谈 MVC 和 MTV 一.MVC M:model,模型,就是数据模型,负责数据的存取: V:view,视图,负责页面的展示逻辑: C:controller,控制器,负责业务逻辑的处理: 二.MTV ...
- 浅谈MVC、MVP、MVVM
MVC M: Model 模型——数据 (对于前台而言例如:ajax.jsonp等从后台获取数据的) V: View 视图——表现 ...
- 浅谈MVC和MVVM模式
MVC I’m dating with a model… and a view, and a controller. 众所周知,MVC 是开发客户端最经典的设计模式,iOS 开发也不例外,但是 MVC ...
- 以图像分割为例浅谈支持向量机(SVM)
1. 什么是支持向量机? 在机器学习中,分类问题是一种非常常见也非常重要的问题.常见的分类方法有决策树.聚类方法.贝叶斯分类等等.举一个常见的分类的例子.如下图1所示,在平面直角坐标系中,有一些点 ...
- 以List为例浅谈C#的学习方法
前言:关于学习方法的讨论其实是个比较模糊的概念,对于List的介绍的资料其实已经很多了,但是一般是介绍List本身,我打算分享的是,以温故List为例,来获取新知识的这么一个过程.这里的新知识也不是什 ...
- [转]以新浪为例浅谈XSS
随着网络时代的飞速发展,网络安全问题越来越受大家的关注,而SQL注入的攻击也随着各种防注入的出现开始慢慢的离我们而去,从而XSS跨站脚本攻击也慢慢的开始在最近几年崛起,也应对了’没有绝对的安全’这句话 ...
- 浅谈Android架构之MVP,MVVM
概述 MVP(Model-View-Presenter)是传统MVC(Model-View-Controller)在Android开发上的一种变种.进化模式.主要用来隔离UI.UI逻辑和业务逻辑.数据 ...
随机推荐
- 浅谈SDN架构下的运维工作
导读 目前国内的网络运维还处于初级阶段,工作人员每天就像救火一样,天天疲于奔命.运维人员只能埋头查找系统运行的日志,耗时耗力,老眼昏花不说,有时候忙了半天还一无所获,作为运维工程师的你,有木有遇到过类 ...
- 用python2.7.9 写个小程序搜索某个目录下行有某关键字
# -*- coding: utf-8 -*-import sysreload(sys)sys.setdefaultencoding("utf-8")import os def p ...
- jqgrid 使用自带的行编辑
上篇jqgrid 单击行启用行编辑,切换行保存原编辑行 本篇,说说使用jqgrid自带的行编辑 1)设置需要编辑的列 editable: true colModel: [ { label: '字段编 ...
- CentOS 建立本地yum源服务器
安装CentOS系统,配置系统的网络环境 配置静态IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet O ...
- Django Rest Framework源码剖析(六)-----序列化(serializers)
一.简介 django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似). ...
- 2017-2018 Exp5 MSF基础应用 20155214
目录 Exp5 MSF基础应用 实验内容 渗透攻击 主要思路 知识点 Exp5 MSF基础应用 本次实验本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路. 主动攻击:m ...
- 20155330 《网络对抗》 Exp6 信息搜集与漏洞扫描
20155330 <网络对抗> Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? 互联网名称与数字地址分配机构(The Internet Corporation ...
- 【HNOI2018】游戏
题面 题解 这道题目到底有没有靠谱一点的解法啊... 有很多种\(\color{green}{\mathrm{AC}}\)的方法,设\(L[i],R[i]\)表示点\(i\)最左边和最右边能够到达的位 ...
- TMS320VC5509使用nof flash AM29LV400
1. 硬件接口如下,其中nor flash的使用方法,写的时候和NAND FLASH是一样的,读的时候和DRAM是一样的 2. 看下擦除指令和编程指令 3. 代码如下 #include <csl ...
- [CF1065F]Up and Down the Tree[树dp]
题意 给定一棵以 \(1\) 为根的树,你每次可以选择跳到某个叶子节点,再跳到和他深度差不超过 \(k\) 的祖先.询问最多能够跳到多少个叶子节点. \(n,k\leq 10^6\) . 分析 最后的 ...