2018/1/21
【0】功能要求
用户新增功能:(1)登陆成功后(login.jsp),sys.jsp 系统页面会有用户新增按钮,点击跳转到补全用户信息( useradd.jsp),若是添加成功则会保存至数据库,并跳转用户列表显示(userlist.jsp),否则继续返回用户添加页面( useradd.jsp);(2)增加了:JSR303验证功能,对输入的数据进行校验;(3)使用了JSTL标签;(4)难点在:前台到后台到数据库的Date和Datetime类型数据的传递,参考《SpringMVC(19):Date、DateTime、String之于springmvc 的数据传递详解》;
【1】jar包/文件架构(比较乱,后续继续改进)
jar包:
图1
(说明:hibernate-validator-5.0.1.Final.jar 之所以去除,是因为该版本的jar包不支持validation-api-1.0.0.GA.jar,所以重新导入了
hibernate-validator-4.3.2.Final.jar)
文件结构:
图2
(说明:用户新增功能涉及的所有文件)
新功能实现的思路是:1、新建实体类user.java,业务类UserService.java、Dao层数据连接类UserDao.java,写Controller的逻辑方法;2、新建用到的页面(useradd2.jsp、userlist.jsp等);3、浏览器调试与数据库验证;
【2】新建实体类user.java
package com.User.entities;
import java.util.Date;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import com.sun.istack.internal.NotNull;
public class User {
private Integer id;
@NotNull
private String userCode;
@NotNull
private String userName;
@Length(min=6,max=10,message="userPassword长度为6-10")
@NotNull
private String userPassword;
private Integer gender;
private String birthdayString;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
private String phone;
private String address ;
private Integer userRole;
private Integer createdBy;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date creationDate;
private String creationDateString;
private Integer modifyBy;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date modifyDate;
private String modifyDateString;
public String getCreationDateString() {
return creationDateString;
}
public void setCreationDateString(String creationDateString) {
this.creationDateString = creationDateString;
}
public String getModifyDateString() {
return modifyDateString;
}
public void setModifyDateString(String modifyDateString) {
this.modifyDateString = modifyDateString;
}
private String roleName;
//省略setter和getter方法、toString()方法,以及无参与带参构造函数
}
解释:1、绑定在属性的注解是 JSR303 验证框架提供的;详细可参考博文:《 SpringMVC(20):数据校验功能 -- 使用JSR303实现服务器端的数据校验》;
2、这里具体使用了:@NotNull、@Length()、@NotNull、@DateTimeFormat;
【3】业务类UserService.java接口:
public interface UserService {
public User login(String userCode,String userPassword) throws SQLException;
public List<User> getUserList(String queryUserName,int _queryUserRole,
int currentPageNo,int pageSize) throws SQLException, ParseException;
public int getUserCount(String queryUserName,int _queryUserRole) throws SQLException;
public boolean add(User user) throws SQLException;
}
实现类UserServiceImpl.java :
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao ;
//这里省略了 login 、getUserList、getUserCount的具体方法;
@Override
public boolean add(User user) throws SQLException {
System.out.println("UserServiceImpl-add");
boolean result = false;
if(userDao.add(user) != 0){
result = true;
}
return result;
}
}
【4】Dao层数据连接类UserDao.java接口:
public interface UserDao {
public User loginMatch(String userName, String userPassword) throws SQLException;
public List<User> getUserList(String queryUserName, int _queryUserRole, int currentPageNo, int pageSize) throws SQLException, ParseException;
public int getUserCount(String queryUserName,int _queryUserRole) throws SQLException;
public int add(User user) throws SQLException;
}
实现类UserDaoImpl.java:
package com.User.Dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
4
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.User.Controller.UserController;
import com.User.entities.User;
@Component("userDao")
public class UserDaoImpl implements UserDao {
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;
private String sql;
//这里省略了loginMatch、getUserList、getUserCount的实现方法
@Override
public int add(User user) throws SQLException {
System.out.println("UserDaoImpl-add");
Logger log = Logger.getLogger(UserController.class.getName());
SimpleDateFormat birthdayFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat createDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String birthday = birthdayFormat.format(user.getBirthday());
String createDate = createDateFormat.format(new Date());
int count = 0;
//第一种方法
// sql = "select * from smbms_user"
// + " where u.userName like CONCAT('%',#{"+queryUserName+"},'%')"
// + " and u.userRole="+_queryUserRole+";";
//第二种方法 +",'"
sql = "insert into smbms_user "
+ "(userCode,userName,userPassword,gender,birthday,phone,address,userRole,createBy,createDate) "
+ "values"
+ "('"+user.getUserCode()+"','"
+ user.getUserName()+"','"
+ user.getUserPassword()+"',"
+ user.getGender() + ",'"
+ birthday + "','"
+ user.getPhone()+"','"
+ user.getAddress()+"',"
+ user.getUserRole()+","
+ user.getCreatedBy() +",'"
+ createDate+"'"
+");";
String sql2 = " SELECT ROW_COUNT();";
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "";
try {
Class.forName(driver);
conn = DriverManager.getConnection(url,username,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
stmt = conn.createStatement();
System.out.println("add - sql1: "+sql);
stmt.execute(sql);
System.out.println("add_result_row - sql: "+sql2);
rs = stmt.executeQuery(sql2);
rs.next();
count = rs.getInt(1);
System.out.println("count: "+count);
if(stmt!=null){
stmt.close();
}
if(rs!=null){
rs.close();
}
return count;
}
}
解释:
1、采用了jdbc的操作,因此需要自行写sql语句;
2、 SELECT ROW_COUNT() 查询受前一个操作影响到的记录行数,正确插入数据返回“1”;
【5】控制器UserController.java,新增代码如下:
@RequestMapping(value="/useradd",method=RequestMethod.GET)
public String addUser(@ModelAttribute("user") User user,HttpSession session){
// log.info("use: "+user);
// model.addAttribute("user",user);
System.out.println("1 session.getAttribute(user)+++"+session.getAttribute("user")+user.toString());
return "useradd2";
}
@RequestMapping(value="/useraddsave",method=RequestMethod.POST)
public String addUserSave(@Valid User user,BindingResult bindingResult,HttpSession session) throws SQLException, ParseException{
if(bindingResult.hasErrors() ){
System.out.println("add user validated has error ");
return "useradd2";
}
user.setCreatedBy(((User)session.getAttribute("currentUser")).getId());
// System.out.println("2 session.getAttribute(user)+++"+session.getAttribute("user")+user.toString());
// System.out.println("3 session.getAttribute(user)+++"+session.getAttribute("user")+user.toString());
// System.out.println("4 session.getAttribute(user)+++"+session.getAttribute("user")+user.toString());
// System.out.println("5 session.getAttribute(user)+++"+session.getAttribute("user")+user.toString());
if(userService.add(user)){
System.out.println("add new user successfully");
return "redirect:/user/userlist.html";
}
return "useradd2";
}
解释:
1、@ModelAttribute 注解的使用,相当于声明了一个放进model的attribute(实则为一个Map,key为“user”);
2、一个方法是处理:请求跳转到useradd;第二个方法是处理:请求保存添加好的new user信息;
3、@Valid User user,这里入参为前台jsp的JSR验证注解,后面必须跟着 BindingResult bindingResult,若是出错则会在前台显示信息(具体信息备注在User.java实体类了);
【6】前端页面useradd2.jsp(使用了JSTL标签):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" +>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>这是用户添加页面,请在下方输入新的用户信息:</h4>
<fm:form method="post" modelAttribute="user" action="${pageContext.request.contextPath}/user/useraddsave" >
<fm:errors path="userCode"></fm:errors>
用户编码 :<fm:input path="userCode" /><br/>
<fm:errors path="userName"></fm:errors>
用户名称 :<fm:input path="userName"/><br/>
<fm:errors path="userPassword"></fm:errors>
用户密码 :<fm:password path="userPassword"/><br>
用户地址 :<fm:input path="address" /><br>
用户电话 : <fm:input path="phone"/><br>
<fm:errors path="birthday"></fm:errors>
用户生日 :<fm:input path="birthday" /><br>
用户性别: <fm:radiobutton path="gender" value="1"/>女
<fm:radiobutton path="gender" value="2"/>男<br>
用户角色 :<br>
<fm:radiobutton path="userRole" value="101" />OrdinaryUser
<fm:radiobutton path="userRole" value="110"/>Administrator<br>
<fm:radiobutton path="userRole" value="111"/>Manager
<fm:radiobutton path="userRole" value="100"/>tour<br>
<input type="submit" name="保存"/>
<input type="reset" value="重置"/>
</fm:form>
</body>
</html>
解释:
1、记住要导入JSTL,在文件开头加入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>,下载并导入jar包:jstl-1.2.jar;
【7】输出结果:
图3
图4
图5
图6