笔记说明:

前后端未分离数据交互。本次完成了web传输数据到后台servlet处理再操作数据库SQL再返回数据给前端的操作

点击跳转:

1.JDBC:Model→DBUtil→Dao

2.JSP:regist→login

3.Servlet:InitServlet→RegistServlet→LoginAccessCheck

4.其他java文件:UploadUtils→UserCheck→XML

JDBC

步骤一:模型层TOP

//步骤一:模型层
public class User {

	private String username;
	private String password;
	private String nickname;
	private String sex;
	private String hobby;
	private String path;

	……省略添加javaBean(get/set/toString)
}

步骤二:连接数据库(DBUtil)TOP

//步骤二:连接数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*
 * JDBC步骤:
 * 1.利用反射加载驱动(class.forName())
 * 2.获取数据库的链接getConnection()
 * 3.实现增删改查功能
 * ——导入“数据库连接JAVA”jar包:
 * mysql-connector-java-x.x.x.jar  和 mysql-connector-java-x.x.x-bin.jar
 */
public class DBUtil {
									//java技术:数据库类型:IP地址:端口:数据库的名称
	private static final String url = "jdbc:mysql://127.0.0.1:3306/user";
	private static final String user = "root";  //数据库账户名
	private static final String password = "root";  //数据库密码
	
	private static Connection conn = null;
	
	static {
		try {
			//(1)、加载mysql驱动用:Class.forName("com.mysql.jdbc.Driver");
			//(2)、加载orcle驱动用:Class.forName("oracle.jdbc.driver.OracleDriver");
			Class.forName("com.mysql.jdbc.Driver"); //通过java反射技术来加载驱动程序
			conn = DriverManager.getConnection(url, user, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//外部获取static代码块的数据库连接
	public static Connection getConnection(){
		return conn;
	}
	//连接数据库测试
//	public static void main(String[] args) throws Exception {
//		Class.forName("com.mysql.jdbc.Driver");
//		conn = DriverManager.getConnection(url, user, password);
//		//利用对象Statement执行SQL语句
//		Statement st = conn.createStatement();
//		ResultSet resultSet = st.executeQuery("select * from users");
//		while(resultSet.next()){
//			System.out.println("username:" + resultSet.getString("username")
//					+ ",passwrod:" + resultSet.getInt("password")
//					+ ",nickname:" + resultSet.getString("nickname"));
//		}
//	}
}

步骤三:DAO(数据库访问)TOP

//步骤三:DAO(数据库访问)
/*
 *java提供了三个接口,用来在给定连接上执行SQL语句的容器:
 *	Statement 对象用于执行不带参数的简单 SQL 语句;
 PreparedStatement 对象用于执行带或不带 IN参数的预编译 SQL 语句;
 CallableStatement 对象用于执行对数据库已存储过程的调用。 
 */
public class UserDao {

	// 注册(添加至数据库)
	public void add(User user) throws Exception {
		// 获取数据库链接
		Connection conn = DBUtil.getConnection();
		String sql = "insert into users(username,password,nickname,sex,hobby,path)"
				+ "value(?,?,?,?,?,?)";
		// 创建有参声明
		PreparedStatement preparedStatement = conn.prepareStatement(sql);
		// 设置各个参数值
		preparedStatement.setString(1, user.getUsername());
		preparedStatement.setString(2, user.getPassword());
		preparedStatement.setString(3, user.getNickname());
		preparedStatement.setString(4, user.getSex());
		preparedStatement.setString(5, user.getHobby());
		preparedStatement.setString(6, user.getPath());
		// 执行
		preparedStatement.execute();
	}

	// 查询(有参)
	public List<User> query(String name) throws Exception {
		// 获取数据库连接
		Connection conn = DBUtil.getConnection();
		String sql = " select * from users " + " where username=? ";
		// 创建声明(有参数)
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, name);
		// 执行语句
		ResultSet resultSet = ps.executeQuery();
		// 创建集合保存结果集
		List<User> list = new ArrayList<User>();
		User u = null;
		while (resultSet.next()) {
			u = new User();
			u.setUsername(resultSet.getString("username"));
			u.setPassword(resultSet.getString("password"));
			u.setNickname(resultSet.getString("nickname"));
			u.setSex(resultSet.getString("sex"));
			u.setHobby(resultSet.getString("hobby"));
			u.setPath(resultSet.getString("path"));
			list.add(u);
		}
		return list;
	}

	// 查询(无参)
	public List<User> query() throws Exception {
		// 获取数据库连接
		Connection conn = DBUtil.getConnection();
		String sql = " select * from users ";
		// 创建声明
		Statement statement = conn.createStatement();
		// 执行语句
		ResultSet resultSet = statement.executeQuery(sql);
		// 创建集合保存结果集
		List<User> list = new ArrayList<User>();
		User u = null;
		while (resultSet.next()) {
			u = new User();
			u.setUsername(resultSet.getString("username"));
			u.setPassword(resultSet.getString("password"));
			u.setNickname(resultSet.getString("nickname"));
			u.setSex(resultSet.getString("sex"));
			u.setHobby(resultSet.getString("hobby"));
			u.setPath(resultSet.getString("path"));
			list.add(u);
		}
		return list;
	}
	……其他SQL操作省略
}

WEB 页面

regist:TOP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    import="com.exercise.servlet.*"%>
<%
	//用jsp接受servlet的数据
    String msg = "";
     if(request.getAttribute("msg") != null){
     	msg = (String)request.getAttribute("msg");
    }
%>
<!-- 要传输数据到servlet(action="Servlet Name"),用method="post" enctype="multipart/form-data" -->
<h3><font color="red"><%=msg%></font></h3>
<form action="<%= request.getContextPath()%>/RegistServlet" method="post" enctype="multipart/form-data">
            <table>
                ……text
                ……radio
                <tr>
                    <td class="ph">上传头像/图片</td>
                    <td><input type="file" id="photo" name="upload"></td>
                </tr>
                ……chechbox
                ……submit
            </table>
 </form>

login:TOP

<body>
    <div class="login">
        <div class="header">
            <h1>
                <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
            </h1>
        </div>
        <%
        String username = "";        
        if(session.getAttribute("username") != null){
        	username = (String) session.getAttribute("username");
        }
        
        String msg02 = "";
        if(request.getAttribute("msg02") != null){
        	msg02 = (String) request.getAttribute("msg02");
        }
         %>
         <h3><font color="red"><%=msg02%></font></h3>
        <form action="<%=request.getContextPath()%>/LoginAccessCheck" method="post">
            <table>
                <tr>
                    <td class="td1">用户名</td>
                    <td><input type="text" class="input1" name="username" value="<%=username%>"></td>
                </tr>
                <tr>
                <td class="td1">密码</td>
                <td><input type="password" class="input1" name="password" value=""></td>
                </tr>
                <tr>
                <td class="td1" colspan="2">
                    <input type="checkbox" name="remember" value="true" checked="checked"> 记住用户名</td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div class="btn-red">
                            <input type="submit" value="登录" id="login-btn">
                        </div>
                    </td>
                </tr>
            </table>
        </form>
    </div>
</body>

Servlet:

InitServlet:TOP

//用户注册的初始化Servlet
/*
 * 在xml里添加标签<load-on-startup>,作用:在每次打开服务器都自动调用InitServlet
 */
public class InitServlet extends HttpServlet {
	
	@Override
	public void init() throws ServletException {
		//创建一个List集合用于保存用户注册信息
		List<User> list = new ArrayList<User>();
		//将list信息保存到ServletContext作用域中
		this.getServletContext().setAttribute("list", list);
	}
}

RegistServlet:TOP

DiskFileItemFactory 解析,菜鸟链接

public class RegistServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			//磁盘文件项目工厂
			DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
			//Servlet文件上传
			ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
			//定义一个list集合保存 获取的request文件项数据
			List<FileItem> list = servletFileUpload.parseRequest(request);
			//定义一个list集合保存 复选框数据
			List<String> hobbyList = new ArrayList<String>();
			//定义一个Map集合用于保存用户数据
			Map<String, String> map = new HashMap<String, String>();
			String url = null;
			
			for (FileItem fileItem : list) {
				if(fileItem.isFormField()){//isFormField是否为表单数据,上传文件不属于
					String name = fileItem.getFieldName(); //获取页面标签的name的值,这里不能获取type="file"的文件名
					String value = fileItem.getString("UTF-8"); //获取页面标签的value的值
//					System.out.println(name + "  " + value);
					//接收复选框数据
					if("hobby".equals(name)){ 
						String hobbyValue = fileItem.getString("UTF-8");
						hobbyList.add(hobbyValue);
						hobbyValue = hobbyList.toString().substring(1, hobbyList.toString().length()-1);//裁剪,substring可去掉
//						System.out.println(name + "  " + hobbyValue);
						//复选框数据
						map.put(name, hobbyValue);//保存到HashMap集合
					}else{
						//其余的为输入框数据
						map.put(name, value);
					}
				}else {
					//上传的文件数据
					String fileName = fileItem.getName();
					//对上传的文件加工,文件名随机且唯一化
					if(!fileName.equals("") && fileName.length() >= 4){//.png
						String uuidFileName = UploadUtils.getUUIDFileName(fileName);//获取随机名,下见UploadUtils.java文件
						//上传文件。 上传到WebRoot下的upload文件。在C盘tomcat同名路径处可查看上传的文件
						InputStream is = fileItem.getInputStream();
						String path = this.getServletContext().getRealPath("/upload");
						url = path + "\\" + uuidFileName;
						OutputStream os = new FileOutputStream(url);
						int len = 0;
						byte[] b = new byte[1024];
						while((len = is.read(b)) != -1){
							os.write(b, 0, len);
						}
						is.close();
						os.close();
					}
				}
			}
			System.out.println(map);
			System.out.println("url:"+url);
			//封装注册用户数据
			User user = new User();
			user.setUsername(map.get("username"));
			user.setPassword(map.get("password"));
			user.setNickname(map.get("nickname"));
			user.setSex(map.get("sex"));
			user.setHobby(map.get("hobby"));
			user.setPath(url);
			//注册-这里修改 数据库
			UserDao userDao = new UserDao(); 
			UserCheck userCheck = new UserCheck(); //下见UserCheck.java文件
			//校验用户名,返回true则可以注册
			if(userCheck.userNameCheck(map.get("username"))){
				//添加到数据库
				userDao.add(user);
			}else{
				//返回数据给页面
				request.setAttribute("msg", "用户名已经存在!");
				request.getRequestDispatcher("/regist.jsp").forward(request, response);
				return ;
			}

			//注册成功,跳转页面到login.jsp
			request.getSession().setAttribute("username", user.getUsername());
			response.sendRedirect(request.getContextPath() + "/login.jsp");
			
			System.out.println();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

获取随机文件名:TOP

import java.util.UUID;
public class UploadUtils {
	public static String getUUIDFileName(String fileName){
		int idx = fileName.lastIndexOf(".");//获取文件名的“.”的位置
		String extention = fileName.substring(idx);//裁剪
		String uuidFileName = UUID.randomUUID().toString().replace("-", "") + extention;//拼接
		return uuidFileName;
	}
}

用户名检查:TOP

public class UserCheck {

	//查找用户(用户名)
	public boolean userNameCheck(String username){
		boolean flag = false;
		
		UserDao ud = new UserDao();
		List<User> userList = new ArrayList<User>();
		try {
			userList = ud.query(username);
			//如果数据库不存在该 用户名的数据,则返回true,可以注册
			if(userList.isEmpty()){
				flag = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return flag;
	}
	
	//验证用户(用户名,密码)
	public List<User> userAccessCheck(String username){
		boolean flag = false;
		
		UserDao ud = new UserDao();
		List<User> userList = new ArrayList<User>();
		try {
			userList = ud.query(username);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return userList;
	}
}

用户登录servlet:TOP

public class LoginAccessCheck extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");//获取页面输入框数据
		String password = request.getParameter("password");
		UserCheck uc = new UserCheck();
		List<User> list = uc.userAccessCheck(username);
		for (User user : list) {
			// 判断用户名是否正确
			if (username.equals(user.getUsername())) {
				// 判断密码是否正确
				if (password.equals(user.getPassword())) {
					//判断复选框是否勾选
					String remember = request.getParameter("remember");
					if("true".equals(remember)){
						//保存用户名到cookie
						Cookie cookie = new Cookie("username", user.getUsername());
						//设置该cookie生效的工程路径
						cookie.setPath("/Web_jdbc_servlet");
						//设置保存时间
						cookie.setMaxAge(60*60);
						//回写到登录页面
						response.addCookie(cookie);
					}
					request.getSession().setAttribute("user", user);
					response.sendRedirect("/Web_jdbc_servlet/success.jsp");
					return ;
				}
			}
		}
		request.setAttribute("msg02", "用户名或密码错误");
		request.getRequestDispatcher("/login.jsp").forward(request, response);
	}

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

XML配置文件(节选):TOP

//<load-on-startup>2</load-on-startup> 表示启动服务器将自动调用InitServlet文件,数字2为优先值(权重)
<servlet>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>com.exercise.servlet.InitServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
 </servlet>