您的位置:首页 > 编程语言 > Java开发

SpringMVC(17):使用springmvc+spring+jdbc 优化订单管理系统的示例(新增用户的功能实现)

2018-01-28 23:32 1166 查看
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.for
4000
mat(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐