web管理员登录页面

配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>
</web-app>

404以及500页面并没有写出,只是给用户一个提醒而已。

登录页面:login.jsp

加入图片验证码,登录页面框

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

	<script type="text/javascript">
		function changeCode(){
			//得到图片元素
			var img = document.getElementsByTagName("img")[0];
			img.src = "${pageContext.request.contextPath}/validateCode?time="+new Date().getTime();
		}
	</script>
</head>
<body>
	${info }<br>
	${loginInfo }
	<form action= "${pageContext.request.contextPath }/login" method="post">
		 账号:<input type="text" name="email" placeholder="请输入邮箱"><br>
		 密码: <input type="password" name="password" placeholder="请输入密码"><br>
		验证码:<input type="text" name="code" placeholder="${msg }" />
	<img src="${pageContext.request.contextPath}/validateCode" onclick="changeCode()"/><a href="javascript:changeCode()" >看不清换一张</a><br>
		<input type="submit" value="登录"/><br>
	</form>
	

</body>
</html>

进入后的页面:index.jsp

内容包含:查看所有用户和添加用户及联系吧主

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	欢迎:${userName }<br>

<a href="${pageContext.request.contextPath }/user/list">查看所有的用户</a> <br>
<a href="${pageContext.request.contextPath }/useradd.jsp">添加用户</a>

<a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=1539399310&site=qq&menu=yes"><img border="0" src="http://wpa.qq.com/pa?p=2:1539399310:53" alt="点击这里给我发消息" title="点击这里给我发消息"/></a></body>
</html>

添加、删除、修改用户等总跳转:user.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="user/add">useradd</a><br>
	<a href="user/update">update</a><br>
	<a href="user/delete">delete</a><br>
	<a href="user/list">list</a><br>
	
	
</body>
</html>

添加用户页面:useradd.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--  request.getParameter("username") 如果用户不填信息的话 获取的值为null值  null值是可以进行==判断的   -->
${msg }
	<form action="user/add" method="post">
		用户:<input type="text" name="username" value="<%= request.getParameter("username")==null ?"":request.getParameter("username") %>"><br>
		邮箱:<input type="text" name="email" value="<%= request.getParameter("email")==null ?"":request.getParameter("email")%>"><br>
		密码:<input type="password" name="password"><br>
		确认密码:<input type="password" name="confirmpwd"><br>
		<input type="submit" value="提交">
	</form>
</body>
</html>

修改用户页面:userupdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="update" method="post">
		<!-- disable 属性设置的域无法传到request请求域中   -->
		<input type="hidden" name="id" readonly="readonly" value="${user.id }" ><br>
		用户名:<input type="text" name="username" value="${user.username }"><br>
		邮箱:<input type="text" name="email" value="${user.email }"><br>
		密码:<input type="password" name="password" value="${user.password }"><br>
		<button type="submit">提交</button>
	
	</form>
</body>
</html>

所有用户显示页面:userlist.jsp

包含修改 删除用户,上下一页等。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<c:choose>
		<c:when test="${!empty pageUser.userList }">
				<table border="1" cellpadding="0" cellspacing="0">
					<tr>
						<th>用户ID</th>
						<th>用户姓名</th>
						<th>用户邮箱</th>
						<th colspan="2">编辑</th>
					</tr>
					
					<c:forEach items="${pageUser.userList }" var="user" >
						<tr>
							<td>${user.id }</td>
							<td>${user.username }</td>
							<td>${user.email }</td>
							<td>
							<a href="${pageContext.request.contextPath }/user/preUpdate?id=${user.id}">
								修改
								</a>
							</td>
							<td>
								<a href="${pageContext.request.contextPath }/user/delete?id=${user.id}">	
									删除
								</a>
							 </td>
						</tr>
					</c:forEach>
				</table>
				<a href="${pageContext.request.contextPath }/page?currentPage=${pageUser.currentPage==1 ? 1:pageUser.currentPage-1}">上一页<< </a>
					当前页${pageUser.currentPage }/共${pageUser.totalPage }页
				<a href="${pageContext.request.contextPath }/page?currentPage=${pageUser.currentPage == pageUser.totalPage ? pageUser.totalPage : pageUser.currentPage+1}"> >>下一页</a>
		</c:when>
		<c:when test="${empty userlist }">
			没有用户信息  
			<a href="index.jsp">返回首页</a>
		</c:when>
	</c:choose>
	
	
</body>
</html>

利用枚举将每页显示数据条数列出(这里默认设置的四条):pageenum.java

package com.javaweb.costant;

public enum PageEnum {

	PageSize;
	
	//每页的默认大小 
	public int size;
	
	PageEnum(int size){
		this.size = size;
	}
	
	private PageEnum() {
		this(4);
	}

	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}
	
	
	
}

获取总记录数及获取当前页数据:pagedao.java

package com.javaweb.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.javaweb.entity.User;
import com.javaweb.util.DruidUtil;

public class PageDao {

	static QueryRunner queryRunner;
	static{
		//dataSource 在容器启动的时候 进行的初始化 
		 queryRunner = new QueryRunner(DruidUtil.dataSource);
	}
	//获取总的记录数
	public long getToalSize(){
		try {
			ScalarHandler<Long> scalarHandler = new ScalarHandler<>();
			long i = (long) queryRunner.query("select count(*) from user",scalarHandler);
			return i;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}
	//获取当前页的数据 
	public List<User> getCurrentPage(int currentPage,int pageSize){
		try {
			BeanListHandler<User> beanListHandler = new BeanListHandler<>(User.class);
			List<List<User>> result = queryRunner.execute("select * from user limit ?,?",beanListHandler,(currentPage-1)*pageSize,pageSize );
			return result.get(0);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
}

userdao.java

package com.javaweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.javaweb.entity.User;
import com.javaweb.util.DruidUtil;

/**
 * 数据访问 层
 * @author Administrator
 *
 */
public class UserDao {
	
	static QueryRunner queryRunner;
	static{
		//dataSource 在容器启动的时候 进行的初始化 
		 queryRunner = new QueryRunner(DruidUtil.dataSource);
	}

	public User getUserByEmail(String email){
		List<User> result;
		try {
			result = queryRunner.execute("select * from user where email =?", new BeanHandler<>(User.class),email);
			return result.get(0);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public boolean deleteUser(int id){
		try {
			int i = queryRunner.update("delete from user where id = ? ",id);
			if(i > 0){
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	public boolean updateUser(String username,String email,String password,int id){
		int update;
		try {
			update = queryRunner.execute("update user set username = ?,email = ?,password = ? where id = ? ",username,email,password,id);
			if(update>0){
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	public User getUserById(int id){
		List<User> result;
		try {
			result = queryRunner.execute("select * from user where id =?", new BeanHandler<>(User.class),id);
			return result.get(0);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public boolean addUser(String username,String email,String password){
		int update;
		try {
			update = queryRunner.execute("insert into user(username,email,password) values(?,?,?)",username,email,password);
			if(update > 0){
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return false;
		
	}
	
	public boolean deleteUserById(int id){
		
		try {
			int update = queryRunner.update("delete from user where id = ? ",id);
			if(update>0){
				return true;
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}finally {		
			//TODO QueryRunner 除了数据源 其他自己处理 
		}
		return false;
	}
	
	public List<User>  getAllUserByApache(){
		// 用于处理实体bean的结果集
		BeanListHandler<User> beanListHandler = new BeanListHandler<>(User.class);
		List<List<User>> execute=null;
		
		try {
			execute = queryRunner.execute("select * from user",beanListHandler);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		//queryRunner.execute("select * from user", new BeanListHandler<>(User.class));
		return execute.get(0);
	}
	
	public List<User> getAllUser(){
		Connection connection = DruidUtil.getConnection();
		List<User> userList = new ArrayList<>();
		PreparedStatement prepareStatement=null;
		ResultSet resultSet=null;
		try {
			 prepareStatement = connection.prepareStatement("select * from user");
			 resultSet = prepareStatement.executeQuery();
			while(resultSet.next()){
				//一条记录 对应一个User对象; 有几条记录 new 几个user实例
				User user = new User();
				user.setId(resultSet.getInt("id"));
				user.setUsername("java12="+resultSet.getString("username"));
				user.setEmail(resultSet.getString("email"));
				userList.add(user);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DruidUtil.close(null, connection, prepareStatement, resultSet);
		}
		return userList;
	}
}

实例定义:pagebean.java及user.java

package com.javaweb.entity;

import java.util.List;

public class PageBean {

	//总的页数
	private Integer totalPage;
	//当前页
	private Integer currentPage;
	//每页的数据 
	private List<User> userList;
	
	
	public Integer getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(Integer totalPage) {
		this.totalPage = totalPage;
	}
	public Integer getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage;
	}
	public List<User> getUserList() {
		return userList;
	}
	public void setUserList(List<User> userList) {
		this.userList = userList;
	}
	@Override
	public String toString() {
		return "PageBean [totalPage=" + totalPage + ", currentPage=" + currentPage + ", userList=" + userList + "]";
	}
	
	
	
}
package com.javaweb.entity;

public class User {

	private Integer id;
	private String username;
	private String password;
	private String email;
	private Address address;
	public User(Integer id, String username, String password, String email) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
		this.email = email;
	}
	public User() {
		super();
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", nausername=" + username + ", password=" + password + ", email=" + email + "]";
	}
	
	
}

加入过滤器使页面可以显示或者添加中文:encodefilter.java

package com.javaweb.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@WebFilter("/*")
public class EncodeFilter implements Filter {

	
    public EncodeFilter() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}

}

登录页面过滤器:loginfilter.java

package com.javaweb.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@WebFilter("/*")
public class LoginFilter implements Filter {

	Logger logger = LoggerFactory.getLogger(LoginFilter.class);
	
    public LoginFilter() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpServletRequest = (HttpServletRequest)request;
		HttpServletResponse httpServletResponse = (HttpServletResponse)response;
		String requestURI = httpServletRequest.getRequestURI();
		//对login.jsp 和生成验证码的servlet 进行放行 其他请求过滤 
		if(!requestURI.contains("login") && !requestURI.contains("validateCode")){
			//判断session是否用用户登陆的信息
			String userName =(String)httpServletRequest.getSession().getAttribute("userName");
			if(logger.isInfoEnabled()){
				logger.info("session中的用户为:{}",userName);
			}
			if(userName==null){
				httpServletRequest.setAttribute("loginInfo", "请登陆");
				httpServletRequest.getRequestDispatcher("/login.jsp").forward(httpServletRequest, httpServletResponse);
				//httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");
			}else{
				chain.doFilter(httpServletRequest, httpServletResponse);
			}
		}else{
			chain.doFilter(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

监听器:contextlistener.java

package com.javaweb.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.javaweb.util.DruidUtil;

@WebListener
public class ContextListener implements ServletContextListener {

	Logger logger = LoggerFactory.getLogger(ContextListener.class);
	
    public ContextListener() {
    }

    public void contextDestroyed(ServletContextEvent sce)  { 
    	DruidUtil.closeDataSource();
    	if(logger.isInfoEnabled()){
    		logger.info("数据源关闭了");
    	}
    }

    //Tomcat容器启动的时候调用  用于初始化数据源
    public void contextInitialized(ServletContextEvent sce)  { 
    	try {
    		Class.forName("com.javaweb.util.DruidUtil");
    		if(logger.isInfoEnabled()){
    			logger.info("数据源初始化完成");
    		}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    }
	
}

页面服务:pageservice.java

package com.javaweb.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.javaweb.costant.PageEnum;
import com.javaweb.dao.PageDao;
import com.javaweb.entity.PageBean;
import com.javaweb.entity.User;
import com.javaweb.servlet.PageServlet;

public class PageService {
	
	Logger logger = LoggerFactory.getLogger(PageService.class);
	
	public PageBean getPageBean(String currentPage){
		
		if(logger.isInfoEnabled()){
			logger.info("获取的当前页为:{}",currentPage);
		}
		Integer currentPageInteger = 0;
		if(currentPage!=null){
			currentPageInteger = Integer.valueOf(currentPage);
		}
		
		PageDao pageDao = new PageDao();
		//总记录数
		long totalSize = pageDao.getToalSize();
		if(logger.isInfoEnabled()){
			logger.info("获取的总记录数为:{}",totalSize);
		}
		//总的页码
		int totalPage = (int) (totalSize % PageEnum.PageSize.size == 0 ? totalSize / PageEnum.PageSize.size : (totalSize / PageEnum.PageSize.size) +1); 
		//int totalPage = (int)Math.ceil(totalSize / PageEnum.PageSize.size)+1;
		if(logger.isInfoEnabled()){
			logger.info("获取的总页数为:{}",totalPage);
		}
		//当前页的数据
		List<User> currentPageUser = pageDao.getCurrentPage(currentPageInteger, PageEnum.PageSize.size);
		if(logger.isInfoEnabled()){
			logger.info("获取的当前页的数据为:{}",currentPageUser);
		}
		PageBean pageBean = new PageBean();
		pageBean.setCurrentPage(currentPageInteger);
		pageBean.setTotalPage(totalPage);
		pageBean.setUserList(currentPageUser);
		
		if(logger.isInfoEnabled()){
			logger.info("返回到当前页的数据为:{}",pageBean);
		}
		
		return pageBean;
		
	}
	
}

登录验证页面:loginservlet.java

package com.javaweb.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.tomcat.util.buf.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.javaweb.dao.UserDao;
import com.javaweb.entity.User;
import com.javaweb.util.PasswordUtil;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	Logger logger = LoggerFactory.getLogger(LoginServlet.class);
	
    public LoginServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String code = request.getParameter("code");
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		String sessionCode = (String)request.getSession().getAttribute("sessioncode");
		if(logger.isInfoEnabled()){
			logger.info("页面传过来的code为:{}。session中的验证码为:{}",code,sessionCode);
		}
		//为什么将sessionCode放在前面这个问题
		/* 如果从页面中获取的code为null的话 也就是用户没有输入(加入前端没有提示) 此时将报NullPointerExcepiton
		if(code.equals(sessionCode)){}
		*/
		//①首先判断验证码 因为邮箱密码的时候 需要进行数据库的查询 这样减少与数据库的交互 省了查询的时间
		if(!sessionCode.equalsIgnoreCase(code)){
			request.setAttribute("msg", "验证码不一致 请重新输入");
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}else{
			if(logger.isInfoEnabled()){
				logger.info("获取到的账号邮箱为:{},密码为:{}",email,password);
			}
			//② 验证码 正确 开始进行数据库的查询 进行校验密码
			UserDao userDao = new UserDao();
			User userByEmail = userDao.getUserByEmail(email);
			if(logger.isInfoEnabled()){
				logger.info("查询出来的用户为:{}",userByEmail);
			}
			//③ 从数据库中查询出来的用户不存在  
			if(userByEmail == null){
				request.setAttribute("info", "用户账号不存在");
				request.getRequestDispatcher("login.jsp").forward(request, response);
			}else{
				//④ 存在情况 开始加密密码值的比对 因为用户输入的是明文 数据库保存的是密文
				//对用户输入的明文密码进行加密
				String secPassword = PasswordUtil.createPassword(password);
				//使用加密后的密码和数据库中的密码进行比对
				if(!userByEmail.getPassword().equals(secPassword)){
					request.setAttribute("info", "密码错误");
					request.getRequestDispatcher("login.jsp").forward(request, response);
				}else{
					//登陆完成 在session中存放用户名
					HttpSession session = request.getSession();
					session.setAttribute("userName", userByEmail.getUsername());
					
					session.setMaxInactiveInterval(60*1);
					response.sendRedirect("index.jsp");
				}
			}
			
		}
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

页面页码:pageservlet.java

package com.javaweb.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.javaweb.costant.PageEnum;
import com.javaweb.entity.PageBean;
import com.javaweb.entity.User;
import com.javaweb.service.PageService;

@WebServlet("/page")
public class PageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	Logger logger = LoggerFactory.getLogger(PageServlet.class);

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//需要从页面获取当前页   如果是第一次进入查看的话 currentpage 是没有值的  设置默认值为第一页
		String currentPage = request.getParameter("currentPage") != null ? request.getParameter("currentPage") : "1";
		
		
		PageService pageService = new PageService();
		PageBean pageBean = pageService.getPageBean(currentPage);
		
		
		request.setAttribute("pageUser", pageBean);
		request.getRequestDispatcher("/userlist.jsp").forward(request, response);
		
		
	}
	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

* 主要  删除添加修改用户信息:userservlet.java

package com.javaweb.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.javaweb.dao.UserDao;
import com.javaweb.entity.PageBean;
import com.javaweb.entity.User;
import com.javaweb.service.PageService;
import com.javaweb.util.PasswordUtil;

@WebServlet("/user/*")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	Logger logger = LoggerFactory.getLogger(UserServlet.class);

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String requestURI = request.getRequestURI();
		if (logger.isInfoEnabled()) {
			logger.info("获取到的URI为:{}", requestURI);
		}
		//eg:"/javaweb_crud_v3/user/list" => "","javaweb_crud-v3","user","list" 
		String[] splitURI = requestURI.split("/");
		if (logger.isInfoEnabled()) {
			logger.info("截取到的URI中包含的操作为为:{}", splitURI[3]);
		}
		switch (splitURI[3]) {
		case "add":
			addUser(request,response);
			break;
		case "delete":
			deleteUser(request,response);
			break;
		// 预修改 用于回显修改的数据
		case "preUpdate":
			preUpdateUser(request,response);
			break;
		// 提交修改的操作
		case "update":
			updateUser(request,response);
			break;
		case "list":
			listUser(request, response);
			break;
		// 没有该请求路径的时候	
		default:
			nonSuchUrl(request,response);
			break;
		}

	}

	
	private void nonSuchUrl(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.getWriter().print("请检查你的路径");
	}

	private void addUser(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		//从页面中获取体积的参数 这些参数 是可以通过转发 到某一个页面 再重新获取的(<%request.getParameter("") %>)
				//如果想通过EL表达式获取的话 需要使用request.setAttribute("","");
				
				//参数域过多的情况 需要对属性一个一个的set值操作  过程繁琐 需要封装 用Apache提供的工具类
				String username = request.getParameter("username");
				String email = request.getParameter("email");
				String password = request.getParameter("password");
				String confirmpwd = request.getParameter("confirmpwd");
				
				//================================================
				//参数域过多的情况下 使用Apache工具类 进行属性域的填充
				User user = new User();
				try {
					//Apache 工具类 直接对对象进行渲染
					BeanUtils.populate(user, request.getParameterMap());
					if(logger.isInfoEnabled()){
						logger.info("获取的所有参数域为:{}",request.getParameterMap());
					}
					if(logger.isInfoEnabled()){
						logger.info("封装的用户对象为:{}",user);
					}
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
				//=================================================
				
				//进行日志输出 查看获取的参数 
				if(logger.isInfoEnabled()){
					logger.info("获取到的用户名为:{},邮箱为:{}",username,email);
				}
				//两次密码不一致 需要重新添加
				if(password.equals(confirmpwd)){
					//需不需要对username email password..... 进行对象的封装
					//如果需要的话 该如何处理??????
					UserDao userDao = new UserDao();
					String createPassword = PasswordUtil.createPassword(password);
					boolean addFlag = userDao.addUser(username, email, createPassword);
					//添加成功 重定向到查询页面 简单粗暴有效 
					//显示一个页面 告诉你3秒后跳转 or 直接跳转??????
					if(addFlag){
						//简单的模拟
						response.getWriter().println("用户添加成功,3秒后跳转");
						response.setHeader("refresh", "3;url="+request.getContextPath()+"/user/list");
						//response.sendRedirect("listusers");
					}else{
						//添加失败 得用转发 用于回显用户填写的信息 用户只需要修改错误的信息字段即可 其他不需要修改 也不需要重新填写
						request.getRequestDispatcher("/useradd.jsp").forward(request, response);
					}
				}else{
					//setAttribute这种形式 是可以使用EL表达式 进行获取值的 
					request.setAttribute("msg", "两次密码不一致");
					request.getRequestDispatcher("/useradd.jsp").forward(request, response);
				}
		
	}

	private void updateUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String id = request.getParameter("id");
		String username = request.getParameter("username");
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		if(logger.isInfoEnabled()){
			logger.info("要修改的数据为:用户ID{},用户名{},邮箱{}",id,username,email);
		}
		//对修改的密码进行加密
		String createPassword = PasswordUtil.createPassword(password);
		UserDao userDao = new UserDao();
		boolean updateFlag = userDao.updateUser(username, email, createPassword, Integer.valueOf(id));
		if(updateFlag){
			response.sendRedirect(request.getContextPath()+"/user/list");
		}
		
	}

	private void deleteUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String id = request.getParameter("id");
		UserDao userDao = new UserDao();
		boolean deleteFlag = userDao.deleteUser(Integer.valueOf(id));
		if(logger.isInfoEnabled()){
			logger.info("删除用户ID为{}的用户",id);
		}
		if(deleteFlag){
			response.sendRedirect(request.getContextPath()+"/user/list");
		}
	}

	private void preUpdateUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		Integer integer = Integer.valueOf(id);
		
		//根据用户ID来查找该用户
		UserDao userDao = new UserDao();
		User user = userDao.getUserById(integer);
		if(logger.isInfoEnabled()){
			logger.info("查找出来的用户为:{}",user);
		}
		if(user!=null){
			request.setAttribute("user", user);
			request.getRequestDispatcher("/userupdate.jsp").forward(request, response);
		}
		
	}

	private void listUser(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//需要从页面获取当前页   如果是第一次进入查看的话 currentpage 是没有值的  设置默认值为第一页
		String currentPage = request.getParameter("currentPage") != null ? request.getParameter("currentPage") : "1";
		
		
		PageService pageService = new PageService();
		PageBean pageBean = pageService.getPageBean(currentPage);
		
		
		request.setAttribute("pageUser", pageBean);
		request.getRequestDispatcher("/userlist.jsp").forward(request, response);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

生成验证码:validatecodeservlet.java

package com.javaweb.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.dsna.util.images.ValidateCode;

@WebServlet("/validateCode")
public class ValidateCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public ValidateCodeServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 告诉客户端不使用缓存
		response.setHeader("pragma", "no-cache");
		response.setHeader("cache-control", "no-cache");
		response.setIntHeader("expires", 0);

		ValidateCode vc = new ValidateCode(110, 25, 4, 9);
		
		String code = vc.getCode();// 得到生成的字符
		//将验证码存放到session中
		request.getSession().setAttribute("sessioncode", code);
		
		vc.write(response.getOutputStream());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

druid连接池链接数据库:druidutil.java

package com.javaweb.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DruidUtil {

	// 避免DataSource 数据源创建多次 
	// 在类加载的时候即初始化一次
	static Properties properties;
	public static DataSource dataSource;
	
	static{
		properties = new Properties();
		try {
			properties.load(DruidUtil.class.getClassLoader().getResourceAsStream("alibaba.properties"));
			getDataSource();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void closeDataSource(){
		DruidDataSource druidDataSource=(DruidDataSource)dataSource;
		druidDataSource.close();
	}
	
	public static DataSource getDataSource(){
		try {
			 dataSource = DruidDataSourceFactory.createDataSource(properties);
			return dataSource;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static Connection getConnection(){
		try {
			Connection connection = dataSource.getConnection();
			return connection;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void close(DataSource dataSource,Connection conn,PreparedStatement preparedStatement,ResultSet resultSet){
		
		if(resultSet!=null){
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(preparedStatement!=null){
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(dataSource!=null){
			DruidDataSource source=(DruidDataSource)dataSource;
			source.close();
		}
		
	}
	public static void main(String[] args) throws SQLException {
		DruidDataSource dataSource = (DruidDataSource)DruidUtil.getDataSource();
		System.out.println(dataSource.getConnection());
		DruidDataSource dataSource2 = (DruidDataSource)DruidUtil.getDataSource();
		System.out.println(dataSource2.getConnection());
	}
	
}

密码加密:passwordutil.java

package com.javaweb.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class PasswordUtil {
	// 16进制下数字到字符的映射数组
	private static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c",
			"d", "e", "f" };

	// 将inputstr加密
	public static String createPassword(String inputstr) {
		return encodeByMD5(inputstr);
	}

	// 验证密码是否正确
	public static boolean authenticatePassword(String pass, String inputstr) {
		if (pass.equals((encodeByMD5(inputstr)))) {
			return true;
		} else {
			return false;
		}
	}

	// 对字符串进行MD5编码
	private static String encodeByMD5(String originstr) {
		if (originstr != null) {
			try {
				// 创建具有指定算法名称的信息摘要
				MessageDigest md = MessageDigest.getInstance("MD5");
				// 使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算
				byte[] results = md.digest(originstr.getBytes());
				// 将得到的字节数组编程字符窜返回
				String resultString = byteArrayToHexString(results);
				return resultString.toUpperCase();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		return null;
	}

	// 转换字节数组为十六进制字符串
	private static String byteArrayToHexString(byte[] b) {
		StringBuffer resultsb = new StringBuffer();
		int i = 0;
		for (i = 0; i < b.length; i++) {
			resultsb.append(byteToHexString(b[i]));
		}
		return resultsb.toString();
	}

	// 将字节转化成十六进制的字符串
	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0) {
			n = 256 + n;
		}
		int d1 = n / 16;
		int d2 = n / 16;
		return hexDigits[d1] + hexDigits[d2];
	}
	
	/**
	 * @param decript 要加密的字符串
	 * @return 加密的字符串
	 * SHA1加密
	 */
	public final static String SHA1(String decript) {
	    try {
	        MessageDigest digest = java.security.MessageDigest
	                .getInstance("SHA-1");
	        digest.update(decript.getBytes());
	        byte messageDigest[] = digest.digest();
	        // Create Hex String
	        StringBuffer hexString = new StringBuffer();
	        // 字节数组转换为 十六进制 数
	        for (int i = 0; i < messageDigest.length; i++) {
	            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
	            if (shaHex.length() < 2) {
	                hexString.append(0);
	            }
	            hexString.append(shaHex);
	        }
	        return hexString.toString();

	    } catch (NoSuchAlgorithmException e) {
	        e.printStackTrace();
	    }
	    return "";
	}

	

	public static void main(String[] args) {
		String password = PasswordUtil.createPassword("123456");
		System.out.println("对123456用MD5加密后:" + password);
		String inputstr = "1234";
		System.out.println("1234与密码相同?" + PasswordUtil.authenticatePassword(password, inputstr));
		inputstr = "123456";
		System.out.println("123456与密码相同?" + PasswordUtil.authenticatePassword(password, inputstr));
	}
}

代码中用到的两个properties文件:alibaba、simplelogger

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false
username=root
password=980916
filters=stat
initialSize=21
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.

# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
org.slf4j.simpleLogger.defaultLogLevel=info
# 指定文件输出的方向
org.slf4j.simpleLogger.logFile = System.out
# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=

# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false

# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z

# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true

# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true

# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false

本文需要导入的架包:

  • 12
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现树洞小程序的管理员用户页面,可以按照以下步骤进行: 1. 设计页面布局和样式:管理员用户页面通常需要进行页面布局和样式设计,以保证页面的可读性和美观性。可以使用HTML、CSS等前端技术进行页面布局和样式设计,同时需要考虑页面的响应式设计,以适配不同的屏幕尺寸。 2. 实现管理员用户的登录功能:管理员用户需要使用账号和密码进行登录,可以使用前端框架如Vue.js或React.js来实现登录页面登录逻辑,并使用后端技术如Django或Flask来处理登录请求和验证用户身份。 3. 实现树洞管理功能:管理员用户页面需要实现对树洞的管理功能,包括树洞的发布、修改、删除、审核等。可以使用前端框架和后端技术来实现树洞管理功能,如使用Vue.js和Django REST framework实现前后端分离的树洞管理页面。 4. 实现用户管理功能:管理员用户页面还需要实现对用户的管理功能,包括用户的禁言、封号、删除等。可以使用前端框架和后端技术来实现用户管理功能,如使用React.js和Django来实现用户管理页面。 5. 实现反馈管理功能:管理员用户页面还需要实现对用户反馈的管理功能,包括反馈的查看、处理、回复等。可以使用前端框架和后端技术来实现反馈管理功能,如使用Vue.js和Django REST framework实现前后端分离的反馈管理页面。 需要注意的是,在实现管理员用户页面时,需要考虑页面的安全性和性能问题,如如何防止SQL注入和XSS攻击,如何处理大量的数据传输等问题。同时需要考虑页面的响应速度和性能问题,以提供良好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值