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

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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值