SMBMS
这个小项目主要是javaWeb的一个回顾,这个博客只讲了部分功能(主要是用户管理模块),因为其他功能都是大同小异,加上本人比较懒,都是一些sql语句的不同,就没有写。
主要参考狂神javaWeb最后的视频讲解,边写边回顾javaWeb的一些知识点
还有这个项目的前端是直接拿过来用的,不是自己写的…
项目简介:
文章目录
1.环境搭建
首先是基本环境的搭建
1.1 数据库的创建和连接
1.2 导入相关依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
123456789101112131415161718192021222324252627282930313233
1.3 基本框架搭建
创建dao层(数据持久层),pojo( 简单的Java对象 ),Service(业务层),servlet(服务器层),tools(工具层),filter(过滤层)
dao层主要进行数据库操作,Service(业务层)调用dao层,并将获得的数据传给servlet层,
servlet层负责前后端交互,从前端获取数据,传到后端,并将后端获取的数据返回给前端
service层捕获异常,进行事务处理
事务处理:调用不同dao的多个方法,必须使用同一个connection(connection作为参数传递)事务完成之后,需要在service层进行connection的关闭,在dao层关闭(PreparedStatement和ResultSet对象)
pojo层主要是与数据库对应的一些对象
过滤器层首先要写编码过滤层,防止前后端编码不一致乱码情况
package cn.smbms.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncoding implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
1234567891011121314151617181920212223242526272829
注册
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>cn.smbms.filter.CharacterEncoding</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
12345678
1.4 编写数据库连接资源文件
driver=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8
user=root
password=445133469
12345
2. 基础类编写
2.1 pojo层
就是按照数据库创建对象
User类
package cn.smbms.pojo;
import java.util.Date;
public class User {
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer gender; //性别
private Date birthday; //出生日期
private String phone; //电话
private String address; //地址
private Integer userRole; //用户角色
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
private Integer age;//年龄
private String userRoleName; //用户角色名称
//此处省略所有的get和set方法 因为太多太占篇幅了 大家写的时候加上就行了
}
12345678910111213141516171819202122232425262728
2.2 操作数据库的基类–静态类
BaseDao类
package cn.smbms.dao;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class BaseDao {
static{//静态代码块,在类加载的时候执行
init();
}
private static String driver;
private static String url;
private static String user;
private static String password;
//初始化连接参数,从配置文件里获得
public static void init(){
Properties params=new Properties();
String configFile = "database.properties";
InputStream is= BaseDao.class.getClassLoader().getResourceAsStream(configFile);
try {
params.load(is);
} catch (IOException e) {
e.printStackTrace();
}
driver=params.getProperty("driver");
url=params.getProperty("url");
user=params.getProperty("user");
password=params.getProperty("password");
}
/**
* 获取数据库连接
* @return
*/
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
/**
* 查询操作
*/
public static ResultSet execute(Connection connection,PreparedStatement pstm,ResultSet rs,
String sql,Object[] params) throws Exception{
pstm = connection.prepareStatement(sql);
for(int i = 0; i < params.length; i++){
pstm.setObject(i+1, params[i]);
}
rs = pstm.executeQuery();
return rs;
}
/**
* 更新操作
*/
public static int execute(Connection connection,PreparedStatement pstm,
String sql,Object[] params) throws Exception{
int updateRows = 0;
pstm = connection.prepareStatement(sql);
for(int i = 0; i < params.length; i++){
pstm.setObject(i+1, params[i]);
}
updateRows = pstm.executeUpdate();
return updateRows;
}
/**
* 释放资源
*/
public static boolean closeResource(Connection connection,PreparedStatement pstm,ResultSet rs){
boolean flag = true;
if(rs != null){
try {
rs.close();
rs = null;//GC回收
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
}
if(pstm != null){
try {
pstm.close();
pstm = null;//GC回收
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
}
if(connection != null){
try {
connection.close();
connection = null;//GC回收
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
}
return flag;
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
这个类主要是数据库操作的方法,面对不同的数据库操作,只需要传入不同的参数即可,需要注意的就是静态初始化代码块,(静态代码块,在类被加载时会运行,且只运行一次),主要是获取database.properties文件里的信息
3. 登录界面
接下来开始进入主题,首先是登录页面的编写
3.1 欢迎页设置
web.xml中有一个属性是welcome-file-list , 用于当用户在url中输入工程名称或者输入web容器url(如http://localhost:8080/)时直接跳转的页面
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
123
3.2 前端
看login.jsp的主题代码无非就是那个登录的表格,我们应该做的就是去获取表格中的数据,传到后端,然后与数据库中数据对比,如果正确,登录成功,错误的话提示登录失败
3.3 LoginServlet
简单说一下Servlet类的编写,就是继承HttpServlet类,重写doGet和doPost方法,两个方法只需要重写一个,两个方法互相调用即可
package cn.smbms.servlet.user;
import cn.smbms.pojo.User;
import cn.smbms.service.user.UserService;
import cn.smbms.service.user.UserServiceImpl;
import cn.smbms.tools.Constants;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("login ============ " );
//获取用户名和密码
String userCode = request.getParameter("userCode");
String userPassword = request.getParameter("userPassword");
//调用service方法,进行用户匹配
UserService userService = new UserServiceImpl();
User user = userService.login(userCode,userPassword);
if(null != user){//登录成功
//放入session
request.getSession().setAttribute(Constants.USER_SESSION, user);
//页面跳转(frame.jsp)
response.sendRedirect("jsp/frame.jsp");
}else{
//页面跳转(login.jsp)带出提示信息--转发
request.setAttribute("error", "用户名或密码不正确");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
1.request.getparam() 获取前端数据
2.调用业务层
3.匹配成功的话设置session,页面重定向,否则,提示错误(设置页面error属性)
request.getSession().setAttribute(Constants.USER_SESSION, user);
因为这个session属性常用,所以我们将它放在工具类的常量类中
package cn.smbms.tools;
public class Constants {
public final static String USER_SESSION = "userSession";
}
12345
知识回顾:Session
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Seesion对象;
- 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……
Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建;
我们可以把数据存到当前用户数据存到session中
参考文档: https://www.cnblogs.com/xdp-gacl/p/3855702.html
3.4 UserService
service层捕获异常,进行事务处理
事务处理:调用不同dao的多个方法,必须使用同一个connection(connection作为参数传递)
事务完成之后,需要在service层进行connection的关闭,在dao层关闭(PreparedStatement和ResultSet对象)
根据servlet层,service层主要是调用dao层查找servlet层传来数据的相关用户,并于servlet层的数据进行对比
UserService
public interface UserService {
//用户登录
public User login(String userCode, String userPassword);
}
1234
UserServiceImp
@Override
public User login(String userCode, String userPassword) {
// TODO Auto-generated method stub
Connection connection = null;
User user = null;
try {
connection = BaseDao.getConnection();
user = userDao.getLoginUser(connection, userCode);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
}
//匹配密码
if(null != user){
if(!user.getUserPassword().equals(userPassword))
user = null;
}
return user;
}
1234567891011121314151617181920212223
3.5 UserDao
Dao层获取数据库数据
package cn.smbms.dao.user;
import cn.smbms.pojo.User;
import java.sql.Connection;
import java.util.List;
public interface UserDao {
// 通过userCode获取User
public User getLoginUser(Connection connection, String userCode)throws Exception;
}
1234567891011
@Override
public User getLoginUser(Connection connection, String userCode)
throws Exception {
// TODO Auto-generated method stub
PreparedStatement pstm = null;
ResultSet rs = null;
User user = null;
if(null != connection){
String sql = "select * from smbms_user where userCode=?";
Object[] params = {userCode};
rs = BaseDao.execute(connection, pstm, rs, sql, params);
if(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getTimestamp("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
}
BaseDao.closeResource(null, pstm, rs);
}
return user;
}
12345678910111213141516171819202122232425262728293031
调用数据库基础类,传入相应参数即可
3.6 注册servlet
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.smbms.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
12345678
这个在这里说一下后面就不想说了
配置Tmocat,测试运行
4.用户管理页面(重点)
用户管理页面大概分成了五块
- 查询板块
- 用户列表显示
- 用户操作
- 添加用户
- 分页显示
4.1 查询和用户列表
4.1.1 前端
<!--用户-->
<table class="providerTable" cellpadding="0" cellspacing="0">
<tr class="firstTr">
<th width="10%">用户编码</th>
<th width="20%">用户名称</th>
<th width="10%">性别</th>
<th width="10%">年龄</th>
<th width="10%">电话</th>
<th width="10%">用户角色</th>
<th width="30%">操作</th>
</tr>
<c:forEach var="user" items="${userList}" varStatus="status">
<tr>
<td><span>${user.userCode}</span></td>
<td><span>${user.userName}</span></td>
<td>
<span>
<c:if test="${user.gender==1}">男</c:if>
<c:if test="${user.gender==2}">女</c:if>
</span>
</td>
<td><span>${user.age}</span></td>
<td><span>${user.phone}</span></td>
<td><span>${user.userRoleName}</span></td>
<td>
<span><a class="viewUser" href="javascript:;" userid=${user.id } username=${user.userName}><img src="${pageContext.request.contextPath}/images/read.png" alt="查看" title="查看"/></a></span>
<span><a class="modifyUser" href="javascript:;" userid=${user.id } username=${user.userName}><img src="${pageContext.request.contextPath }/images/xiugai.png" alt="修改" title="修改"/></a></span>
<span><a class="deleteUser" href="javascript:;" userid=${user.id } username=${user.userName}><img src="${pageContext.request.contextPath }/images/schu.png" alt="删除" title="删除"/></a></span>
</td>
</tr>
</c:forEach>
</table>
1234567891011121314151617181920212223242526272829303132
知识回顾:jstl
<c:> 这是jstl的语法 jstl是jsp的标准标签库
引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
1
了解常用的就行
${变量名} EL表达式
当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找
4.1.2 UserServlet
思路:获取数据库用户数据,并设置Session属性userList
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getParameter("method");
if(method == "query"){
//查询用户列表
String queryUserName = request.getParameter("queryname");
String temp = request.getParameter("queryUserRole");
int queryUserRole = 0;
UserService userService = new UserServiceImpl();
List<User> userList = null;
if(queryUserName == null){
queryUserName = "";
}
if(temp != null && !temp.equals("")){
queryUserRole = Integer.parseInt(temp);
}
userList = userService.getUserList(queryUserName,queryUserRole,currentPageNo, pageSize);
request.setAttribute("userList", userList);
List<Role> roleList = null;
RoleService roleService = new RoleServiceImpl();
roleList = roleService.getRoleList();
request.setAttribute("roleList", roleList);
request.setAttribute("queryUserName", queryUserName);
request.setAttribute("queryUserRole", queryUserRole);
request.setAttribute("totalPageCount", totalPageCount);
request.setAttribute("totalCount", totalCount);
request.setAttribute("currentPageNo", currentPageNo);
request.getRequestDispatcher("userlist.jsp").forward(request, response);
}
}
12345678910111213141516171819202122232425262728293031
因为用户列表是和用户查询是一体的,所以刚点进去默认就是查找所有用户(没有参数),这里需要提一下这里前端的一个技巧
?后面是会传递给后端的参数,可以通过request.getParamter获取 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZviYcLTh-1595233313041)(C:\Users\WIN10\AppData\Roaming\Typora\typora-user-images\1595127942221.png)]
这样做当你加载这个页面时,后端收到这个参数就会先执行一次查询,将当前所有用户传给前端
写完一个Servlet,先去注册它
4.1.3 UserService
public List<User> getUserList(String queryUserName,int queryUserRole) {
// TODO Auto-generated method stub
Connection connection = null;
List<User> userList = null;
try {
connection = BaseDao.getConnection();
userList = userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
}
return userList;
}
123456789101112131415
4.1.4 UserDao 查询
public List<User> getUserList(Connection connection, String userName)
throws Exception {
// TODO Auto-generated method stub
PreparedStatement pstm = null;
ResultSet rs = null;
List<User> userList = new ArrayList<User>();
if(connection != null){
StringBuffer sql = new StringBuffer();
sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
List<Object> list = new ArrayList<Object>();
//判断字符串是否为空或null
if(!StringUtils.isNullOrEmpty(userName)){
sql.append(" and u.userName like ?");
list.add("%"+userName+"%");
}
if(userRole > 0){
sql.append(" and u.userRole = ?");
list.add(userRole);
}
Object[] params = list.toArray();
System.out.println("sql ----> " + sql.toString());
rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
while(rs.next()){
User _user = new User();
_user.setId(rs.getInt("id"));
_user.setUserCode(rs.getString("userCode"));
_user.setUserName(rs.getString("userName"));
_user.setGender(rs.getInt("gender"));
_user.setBirthday(rs.getDate("birthday"));
_user.setPhone(rs.getString("phone"));
_user.setUserRole(rs.getInt("userRole"));
_user.setUserRoleName(rs.getString("userRoleName"));
userList.add(_user);
}
BaseDao.closeResource(null, pstm, rs);
}
return userList;
}
12345678910111213141516171819202122232425262728293031323334353637383940
这个查询用了连接查询以及模糊查询(名字),通过判断参数改变sql语句,并把参数存到一个List中
4.2 分页管理
现在执行查询之后页面并没有实现分页,而是全部显示在了一页,所以接下来还是实现分页查询,就是在前面的用户查询中加入分页查询
4.2.1 前端
4.2.2 创建页码工具类
其中包括当前页码,总页码,页码容量,总数量,以及他们的get和set方法
set方法需要根据相关的计算自己定义
package cn.smbms.tools;
public class PageSupport {
//当前页码-来自于用户输入
private int currentPageNo = 1;
//总数量(表)
private int totalCount = 0;
//页面容量
private int pageSize = 0;
//总页数=totalCount/pageSize(+1)
private int totalPageCount = 1;
public int getCurrentPageNo() {
return currentPageNo;
}
public void setCurrentPageNo(int currentPageNo) {
if(currentPageNo > 0){
this.currentPageNo = currentPageNo;
}
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
if(totalCount > 0){
this.totalCount = totalCount;
//设置总页数
this.setTotalPageCountByRs();
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
if(pageSize > 0){
this.pageSize = pageSize;
}
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public void setTotalPageCountByRs(){
if(this.totalCount % this.pageSize == 0){
this.totalPageCount = this.totalCount / this.pageSize;
}else if(this.totalCount % this.pageSize > 0){
this.totalPageCount = this.totalCount / this.pageSize + 1;
}else{
this.totalPageCount = 0;
}
}
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
还有常量类
public final static int pageSize = 5;
1
4.2.3 UserServlet
private void query(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//查询用户列表
String queryUserName = request.getParameter("queryname");
String temp = request.getParameter("queryUserRole");
String pageIndex = request.getParameter("pageIndex");
int queryUserRole = 0;
UserService userService = new UserServiceImpl();
List<User> userList = null;
//当前页码
int currentPageNo = 1;
if(queryUserName == null){
queryUserName = "";
}
if(temp != null && !temp.equals("")){
queryUserRole = Integer.parseInt(temp);
}
if(pageIndex != null){
try{
currentPageNo = Integer.valueOf(pageIndex);
}catch(NumberFormatException e){
response.sendRedirect("error.jsp");
}
}
//总数量(表)
int totalCount = userService.getUserCount(queryUserName,queryUserRole);
PageSupport pages=new PageSupport();
//当前页码
pages.setCurrentPageNo(currentPageNo);
//页面容量
pages.setPageSize(Constants.pageSize);
//总容量
pages.setTotalCount(totalCount);
//总页码
int totalPageCount = pages.getTotalPageCount();
//控制首页和尾页(下一页和上一页)
if(currentPageNo < 1){
currentPageNo = 1;
}else if(currentPageNo > totalPageCount){
currentPageNo = totalPageCount;
}
userList = userService.getUserList(queryUserName,queryUserRole,currentPageNo, pageSize);
request.setAttribute("userList", userList);
List<Role> roleList = null;
RoleService roleService = new RoleServiceImpl();
roleList = roleService.getRoleList();
request.setAttribute("roleList", roleList);
request.setAttribute("queryUserName", queryUserName);
request.setAttribute("queryUserRole", queryUserRole);
request.setAttribute("totalPageCount", totalPageCount);
request.setAttribute("totalCount", totalCount);
request.setAttribute("currentPageNo", currentPageNo);
request.getRequestDispatcher("userlist.jsp").forward(request, response);
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
4.2.4 UserService
public int getUserCount(String queryUserName, int queryUserRole) {
// TODO Auto-generated method stub
Connection connection = null;
int count = 0;
try {
connection = BaseDao.getConnection();
count = userDao.getUserCount(connection, queryUserName,queryUserRole);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
}
return count;
}
123456789101112131415
修改一下之前的获取用户列表查询,把分页查询加进去
public List<User> getUserList(String queryUserName,int queryUserRole,int currentPageNo, int pageSize) {
// TODO Auto-generated method stub
Connection connection = null;
List<User> userList = null;
try {
connection = BaseDao.getConnection();
userList = userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
}
return userList;
}
123456789101112131415
4.2.5 UserDao
获取查询人数
public int getUserCount(Connection connection, String userName, int userRole)
throws Exception {
// TODO Auto-generated method stub
PreparedStatement pstm = null;
ResultSet rs = null;
int count = 0;
if(connection != null){
StringBuffer sql = new StringBuffer();
sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");
List<Object> list = new ArrayList<Object>();
if(!StringUtils.isNullOrEmpty(userName)){
sql.append(" and u.userName like ?");
list.add("%"+userName+"%");
}
if(userRole > 0){
sql.append(" and u.userRole = ?");
list.add(userRole);
}
Object[] params = list.toArray();
rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
if(rs.next()){
count = rs.getInt("count");
}
BaseDao.closeResource(null, pstm, rs);
}
return count;
}
123456789101112131415161718192021222324252627
加入分页查询后的用户列表查询
public List<User> getUserList(Connection connection, String userName,int userRole,int currentPageNo, int pageSize)
throws Exception {
// TODO Auto-generated method stub
PreparedStatement pstm = null;
ResultSet rs = null;
List<User> userList = new ArrayList<User>();
if(connection != null){
StringBuffer sql = new StringBuffer();
sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
List<Object> list = new ArrayList<Object>();
if(!StringUtils.isNullOrEmpty(userName)){
sql.append(" and u.userName like ?");
list.add("%"+userName+"%");
}
if(userRole > 0){
sql.append(" and u.userRole = ?");
list.add(userRole);
}
sql.append(" order by creationDate DESC limit ?,?");
currentPageNo = (currentPageNo-1)*pageSize;
list.add(currentPageNo);
list.add(pageSize);
Object[] params = list.toArray();
System.out.println("sql ----> " + sql.toString());
rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
while(rs.next()){
User _user = new User();
_user.setId(rs.getInt("id"));
_user.setUserCode(rs.getString("userCode"));
_user.setUserName(rs.getString("userName"));
_user.setGender(rs.getInt("gender"));
_user.setBirthday(rs.getDate("birthday"));
_user.setPhone(rs.getString("phone"));
_user.setUserRole(rs.getInt("userRole"));
_user.setUserRoleName(rs.getString("userRoleName"));
userList.add(_user);
}
BaseDao.closeResource(null, pstm, rs);
}
return userList;
}
123456789101112131415161718192021222324252627282930313233343536373839404142
4.3 用户添加页面
这个功能很简单,其实无非就是从前端获取数据,然后传到后端,接着调用sql传到数据库,这里把Dao层代码贴出来就好了,其他的不过是重复上面的操作
public int add(Connection connection, User user) throws Exception {
// TODO Auto-generated method stub
PreparedStatement pstm = null;
int updateRows = 0;
if(null != connection){
String sql = "insert into smbms_user (userCode,userName,userPassword," +
"userRole,gender,birthday,phone,address,creationDate,createdBy) " +
"values(?,?,?,?,?,?,?,?,?,?)";
Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(),
user.getUserRole(),user.getGender(),user.getBirthday(),
user.getPhone(),user.getAddress(),user.getCreationDate(),user.getCreatedBy()};
updateRows = BaseDao.execute(connection, pstm, sql, params);
BaseDao.closeResource(null, pstm, null);
}
return updateRows;
}
12345678910111213141516
4.4 用户操作
<td>
<span><a class="viewUser" href="javascript:;" userid=${user.id} username=${user.userName}>
<img src="${pageContext.request.contextPath}/images/read.png" alt="查看" title="查看"/></a></span>
<span><a class="modifyUser" href="javascript:;" userid=${user.id} username=${user.userName}>
<img src="${pageContext.request.contextPath}/images/xiugai.png" alt="修改" title="修改"/></a></span>
<span><a class="deleteUser" href="javascript:;" userid=${user.id} username=${user.userName}><img src="${pageContext.request.contextPath}/images/schu.png" alt="删除" title="删除"/></a></span>
</td>
1234567
这里重点讲一下删除操作,查看和修改差不多,修改和添加用户大同小异,查询只说一点就是,当页面重定向时要用request重定向。这里要说一下response和request重定向的区别
request和response重定向
博客地址: requset转发和response重定向的区别
删除操作
删除涉及一个很重要的东西:Ajax
$(".deleteUser").on("click",function(){
var obj = $(this);
if(confirm("你确定要删除用户【"+obj.attr("username")+"】吗?")){
$.ajax({
type:"GET",
url:path+"/jsp/user.do",
data:{method:"deluser",uid:obj.attr("userid")},
dataType:"json",
success:function(data){
if(data.delResult == "true"){//删除成功:移除删除行
alert("删除成功");
obj.parents("tr").remove();
}else if(data.delResult == "false"){//删除失败
alert("对不起,删除用户【"+obj.attr("username")+"】失败");
}else if(data.delResult == "notexist"){
alert("对不起,用户【"+obj.attr("username")+"】不存在");
}
},
error:function(data){
alert("对不起,删除失败");
}
});
}
});
123456789101112131415161718192021222324
这里大概说一下,后面我想把它好好学一下 然后再写一篇博客,写他的时候我只知道个大概用法…
url:待载入页面的url
data:数据
dataType:数据格式
success/error:成功或失败后的回调函数
博客地址:未完待续
关于dao层和service层不再多说。这里说一下servlet层的一个东西,因为涉及到了json数据传送
private void delUser(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("uid");
Integer delId = 0;
try{
delId = Integer.parseInt(id);
}catch (Exception e) {
// TODO: handle exception
delId = 0;
}
HashMap<String, String> resultMap = new HashMap<String, String>();
if(delId <= 0){
resultMap.put("delResult", "notexist");
}else{
UserService userService = new UserServiceImpl();
if(userService.deleteUserById(delId)){
resultMap.put("delResult", "true");
}else{
resultMap.put("delResult", "false");
}
}
//把resultMap转换成json对象输出
response.setContentType("application/json");
PrintWriter outPrintWriter = response.getWriter();
outPrintWriter.write(JSONArray.toJSONString(resultMap));
outPrintWriter.flush();
outPrintWriter.close();
}
1234567891011121314151617181920212223242526272829
5、退出系统
订单管理和供应商管理和用户管理是相似的,只是操作的数据库不同,密码修改和用户修改是差不多的,只是在判断密码是多了一些判断,所以还剩最后一个退出系统
退出程序很简单,移除session中USER_SESSION属性,并返回登录页面
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//清除session
request.getSession().removeAttribute(Constants.USER_SESSION);
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
123456
这里用到的是response重定向,因为没啥数据要传嘛,最后再提一嘴注册servlet
ok,结束了,这个项目很适合作为javaweb的一个入门的学习,能让初学者更深入的去了解架构,以及像这种项目的一个写的思路,但这只能作为练习项目,作为实用项目差的远远的,还有一个缺憾就是这个项目的前端都不是自己写的,本人前端很差,所以一切前端相关问题…,第一次写这种博客,写的不好的地方欢迎大家指出
g>();
if(delId <= 0){
resultMap.put(“delResult”, “notexist”);
}else{
UserService userService = new UserServiceImpl();
if(userService.deleteUserById(delId)){
resultMap.put(“delResult”, “true”);
}else{
resultMap.put(“delResult”, “false”);
}
}
//把resultMap转换成json对象输出
response.setContentType("application/json");
PrintWriter outPrintWriter = response.getWriter();
outPrintWriter.write(JSONArray.toJSONString(resultMap));
outPrintWriter.flush();
outPrintWriter.close();
}
1234567
### 5、退出系统
[外链图片转存中...(img-tW5JcRQf-1595233313043)]
订单管理和供应商管理和用户管理是相似的,只是操作的数据库不同,密码修改和用户修改是差不多的,只是在判断密码是多了一些判断,所以还剩最后一个退出系统
退出程序很简单,移除session中USER_SESSION属性,并返回登录页面
```java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//清除session
request.getSession().removeAttribute(Constants.USER_SESSION);
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
1234567891011121314151617181920
这里用到的是response重定向,因为没啥数据要传嘛,最后再提一嘴注册servlet
ok,结束了,这个项目很适合作为javaweb的一个入门的学习,能让初学者更深入的去了解架构,以及像这种项目的一个写的思路,但这只能作为练习项目,作为实用项目差的远远的,还有一个缺憾就是这个项目的前端都不是自己写的,本人前端很差,所以一切前端相关问题…,第一次写这种博客,写的不好的地方欢迎大家指出