在实现注册模块时遇到了很多坑,在这里记录一下。
技术内容很简单,通过form表单向后台提交一组String类型的键值对,然后我们进行获取。并将其封装进入实体类。
在开始搭建环境时,按照MVC三层架构进行搭建,主要是servlet,service,dao层,各自进行各自管理。
这里遇到的第一个坑是关于Date类型转换的,通过request所获取到的都是String类型,在向数据库进行封装时需要进行转换。开始没有注意报了convertException,这里可以简单通过simpleDateFormat类指定格式进行转换。
//手动获取
String birthday = request.getParameter("birthday");
//进行转换
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
try {
Date DateBirthday = sim.parse(birthday);
user.setBirthday(DateBirthday);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
后来又碰到了一个很奇怪的异常。
Can't get hostname for your address
开始时候以为自己数据库的地址,用户名端口号写错了,检查后没有找到错误。然后去网上看,有博客说这个是关于MySql设置的错误,Mysql有本地系统和网络服务,如果设置为网络服务则需要加域名等其他信息,然后我尝试从Windows的服务中修改为本地系统。问题解决。
java.lang.reflect.InvocationTargetException
再开始的时候尝试用BeanUtils通过反射向实体类中封装数据,希望代码更加简洁,但是会多次出现该异常,后来放弃了BeanUtils,改为通过request手动获取数据封装,问题解决,但是代码会冗余。之后看看能不能解决这个问题。
感觉应该是内部反射造成的原因.
这是Servlet代码,所有方法返回值都为String,该返回值可以直接跳转一个页面
public class UserServlet extends BaseServlet {
public String registUI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return "/jsp/register.jsp";
}
public String userRegist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建传递对象
User user = new User();
/*
* 对不存在的字段进行默认填充
* uid telephone state 等等
*/
//设置用户ID
String uid = UUIDUtils.getId();
user.setUid(uid);
String name = request.getParameter("name");
user.setName(name);
String password = request.getParameter("password");
user.setPassword(password);
String username = request.getParameter("username");
user.setUsername(username);
String email = request.getParameter("email");
user.setEmail(email);
String sex = request.getParameter("sex");
user.setSex(sex);
//设置初始状态,初始为0,未激活
user.setState(0);
//设置激活码,该激活码需要保持,发送邮件时附带该激活码
String code = UUIDUtils.getCode();
user.setCode(code);
String telephone = request.getParameter("telephone");
user.setTelephone(telephone);
//手动获取
String birthday = request.getParameter("birthday");
//进行转换
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
try {
Date DateBirthday = sim.parse(birthday);
user.setBirthday(DateBirthday);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(uid+" "+name+" "+password+" "+username+" "+email+" "+sex+" "+birthday);
/*
* 开始调用service层的方法,并通过返回值进行判断是否注册成功
*/
UserService service = new UserServiceImp();
boolean isSuccess = service.userRegist(user);
if(isSuccess == true) {
request.setAttribute("msg", "注册成功");
}else {
request.setAttribute("msg", "注册失败,请重试");
}
return "/jsp/index.jsp";
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
这里代码为Jsp代码
<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" class="form-control" id="username" placeholder="请输入用户名" name="username">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
<div class="col-sm-6">
<input type="password" class="form-control" id="inputPassword3" placeholder="请输入密码" name="password">
</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="请输入确认密码" name="repassword">
</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" class="form-control" id="inputEmail3" placeholder="Email" name="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" class="form-control" id="usercaption" placeholder="请输入姓名" name="name">
</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>
由于service并没有过多的操作,主要体现了dao层,这里用了JDBCUtils
@Override
public int userRegist(User user) {
// TODO Auto-generated method stub
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() };
int n = 0;
try {
n = qr.update(sql, params);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return n;
}