一、分析项目之前要了解下properties文件的使用
在开发项目时,有很多地方会出现重复的代码
或者日后可能需要修改的代码
,比如:连接数据库、设置项目编码格式、设定文件上传保存目录等等
。重复代码或许可以用静态变量来实现全局调用而不必重复出现,但是毕竟是写死在代码里的,日后需要修改时还要修改源码,比较麻烦而且不便于维护。Java给我们提供了Properties类,可以用来解决这些问题。
Properties类以"key=value"形式保存了一系列的配置信息,其中Key与value都是String类型。这样,我们可以把需要重复用的信息,或者日后需要修改的信息以配置的形式从源码中独立出来。修改时只需修改Properties文件,在源码中通过properties类对象来读取信息即可同步到整个项目。下面,介绍一下JavaWeb项目中使用Properties文件使项目配置化。
1、在项目的src目录下新建 .properties
后缀名的文件。
把文件放在src目录下,在部署时会自动部署到classes目录下的。放到别处是获取不到文件的。
注意: Properties文件名首字母不能大写否则也是找不到文件的。
用文本编辑文件或者在IDEA中打开这个配置文件,把项目中可以配置化的信息提取出来,以 key=value 形式书写。注意一行一个。
一般可以配置化的信息有:项目中重复出现的语句,日后需要修改的信息等。比如:数据库驱动、数据库url、数据库名以及密码、项目编码格式、文件上传路径、临时文件保存路径等等。
例如:
url=jdbc:mysql://localhost:3306/login
user:root
password=ForMe=520
driver=com.mysql.jdbc.Driver
三:在项目中获取配置信息
在properties文件中配置好信息后,在项目中可以通过Properties类对象来读取信息。分四步:
1、新建properties对象
2、创建输入流打开properties文件。
3、properties对象从输入流加载配置信息
4、通过properties.getProperties(“key”)获取具体配置信息
例如:
Properties prop = new Properties();
InputStream in = JdbcUtils.class.getResourceAsStream("/a");
try {
prop.load(in);
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
dv = prop.getProperty("driver");
省略以下非关键代码
}
注意:
1、 InputStream in=当前类 名.class.getClassLoader().getResourceAsStream("config.properties");
2、InputStream in=当前类名.(如果是Java App,对应src;如果是Java Web App,对应class).getClassLoader().getResourceAsStream("config.properties");
以上是两种获取InputStream对象的方法,但是创建输入流时,Test.class.getClassLoader().getResourceAsStream()方法直接获得字节输入流,所以不用考虑路径中是否包含中文的问题,如果是通过Test.class.getClassLoader().getResource()方法,因为该方法返回值是URL,如果项目的目录中有中文命名,则获得的URL会出现乱码。
二、分析问题:
1、用到的开发工具:IDEA、Tomcat、mysql-connector-java-5.1.25-bin.jar包
2、项目目录
3、分析问题
1、首先要有一个用户类(User类)
2、把连接数据库所需要用到的信息存到一个.properties文件中
3、进行数据库注册驱动操作的工具类 (JdbcUtils类)
4、与数据库进行交互的类UserDAo类
5、登录表单 (Login.jsp)
6、注册表单(register.jsp)
7、处理登录后的servlet (LoginServlet类)
8、处理注册后的servlet (RegisterServlet类)
9、登录成功与失败界面
10、配置web.xml
三、具体实现过程如下
1、User类(User.java)
包括id(int)、name(String)、password(String)、role(int)
代码如下:
package com.demo.bean;
/**
* Created by ForMe
* com.demo.bean
* 2018/12/1
* 15:25
*/
public class User {
private String name;
private int role;
private String password;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRole() {
return role;
}
public void setRole(int role) {
this.role = role;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
2、properties文件(a.properties)
在src目录下创建a.properties文件
url=jdbc:mysql://localhost:3306/login
user:root
password=ForMe=520
driver=com.mysql.jdbc.Driver
3、数据库注册驱动的工具类(JdbcUtils.java)
此类只实现了数据库的注册驱动,并实现了关闭资源的功能。
package com.demo.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* Created by ForMe
* com.demo
* 2018/12/1
* 15:31
*/
public class JdbcUtils {
private static String url = null;
private static String user = null;
private static String password = null;
private static String dv = null;
static{
Properties prop = new Properties();
InputStream in = JdbcUtils.class.getResourceAsStream("/a");//不能是a.properties,因为在IDEA中文件名字就是a,与eclipse不同
try {
//以下四步避免了以后数据库名字等信息改变后来修改源码
prop.load(in);
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
dv = prop.getProperty("driver");
//注册驱动
Class.forName(dv);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getconn() throws SQLException {
Connection connection = DriverManager.getConnection(url,user,password);
return connection;
}
public static void close(Statement statement, Connection connection){
if(statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(PreparedStatement preparedStatement, Connection connection, ResultSet result) {
if(preparedStatement != null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(result != null){
try {
result.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4、与数据库进行交互的类(UserDAo.java)
与数据库进行交互,实现了注册(向数据库中插入新的用户User)功能,登录(访问数据库与表格中所填数据比较,若一致则登陆成功,否则登录失败)功能
具体实现代码如下:
package com.demo.dao;
import com.demo.bean.User;
import com.demo.utils.JdbcUtils;
import javax.xml.transform.Result;
import java.sql.*;
/**
* Created by ForMe
* com.demo
* 2018/12/1
* 15:59
*/
public class UserDAo {
//数据库连接对象
//此方法用于在数据库中查询信息并与Login.jsp表格中所填信息比较,若数据库中存在
//与表格所填数据一一对应相等,则登陆成功,否则登录失败
public User login(String username, String password){
User u = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getconn();
String sql = "select * from user where name=? and password=?";
preparedStatement = (PreparedStatement)connection.prepareStatement(sql);
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
u = new User();
u.setName(resultSet.getString("name"));
u.setPassword(resultSet.getString("password"));
System.out.println("登录成功");
}
else{
System.out.println("用户名或者密码错误");
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.close(preparedStatement,connection);
}
return u;
}
//此方法实现注册功能,向数据库中写入新用户的信息
public void addUser(User user){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JdbcUtils.getconn();
String sql = "insert into user(id,name,password,role)values(?,?,?,?);";
preparedStatement = (PreparedStatement)connection.prepareStatement(sql);
preparedStatement.setInt(1,user.getId());
preparedStatement.setString(2,user.getName());
preparedStatement.setString(3,user.getPassword());
preparedStatement.setInt(4,user.getRole());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
JdbcUtils.close(preparedStatement,connection);
}
}
}
5、登录表单(Login.jsp)
登录界面的设计还是很简单的,是一个表单,如下:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/12/1
Time: 15:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录界面</title>
<style type="text/css">
body{
background-position: center;
background-repeat: no-repeat;
}
</style>
</head>
<body>
<div style="text-align:center;margin-top:120px">
<h2>ForMe的主页</h2>
<form action="/LoginServlet" method="post">
<table style="margin-left:40%">
<marquee width="200" scrolldelay="250">用户登录</marquee>
<tr>
<td>用户名:</td>
<td><input type="text" size="21" name="username"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name="password" size="21"/></td>
</tr>
</table>
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</form>
<br>
<a href="register.jsp">注册</a>
</div>
</body>
</html>
6、注册表单(register.jsp)
与登录表单相似,如下所示
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/12/1
Time: 16:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册界面</title>
<style type="text/css">
body{
background-repeat: no-repeat;
background-position: center;
}
</style>
</head>
<body>
<div style="text-align:center;margin-top: 120px">
<form action="/RegisterServlet" method="post">
<table style="margin-left:40%">
<caption>用户注册</caption>
<tr>
<td>ID:</td>
<td><input name="id" type="text" size="20"></td>
</tr>
<tr>
<td>登录名:</td>
<td><input name="name" type="text" size="20"></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="password" type="password" size="20"></td>
</tr>
<tr>
<td>角色:</td>
<td><input name="role" type="text" size="20"></td>
</tr>
</table>
<input type="submit" value="注册">
<input type="reset" value="重置">
</form>
<br>
<a href="Login.jsp">登录</a>
</form>
</div>
</body>
</html>
7、处理Login.jsp的servlet类(LoginServlet)
主要是获取登录表单所填写的用户名和密码,并调用UserDAo类访问数据库中的信息,将二者相比较,若是存在数据库中信息与表单信息相等,则登录成功,否则登录失败,失败或者成功后都将跳转到对应的页面。相对实现较为简单
package com.demo.service;
import com.demo.bean.User;
import com.demo.dao.UserDAo;
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 java.io.IOException;
/**
* Created by ForMe
* ${PACKAGE_NAME}
* 2018/12/1
* 15:57
*/
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
UserDAo userDAo = new UserDAo();
User user = userDAo.login(username,password);
if(user != null){
request.getRequestDispatcher("success.jsp").forward(request,response);
}
else {
request.getRequestDispatcher("defeat.jsp").forward(request,response);
}
}
}
8、处理register.jsp表单的servlet类(RegisterServlet.java)
与处理登录表单数据相似,当注册时,首先要把注册表单的信息获取到,并新建一个User类的对象,是User对象具备注册表单的注册信息,在调用UserDAo类的addlogin(User user)方法向数据库中写入此User对象,完成注册功能。具体实现如下:
package com.demo.service;
import com.demo.bean.User;
import com.demo.dao.UserDAo;
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 java.io.IOException;
import java.io.PrintWriter;
/**
* Created by ForMe
* ${PACKAGE_NAME}
* 2018/12/1
* 16:28
*/
@WebServlet(name = "RegisterServlet")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPut(request,response);
}
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//
// }
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("UTF-8");
//PrintWriter out = response.getWriter();
response.setContentType("text/html;charset=UTF-8");
int id = Integer.valueOf(request.getParameter("id"));
String username = request.getParameter("name");
String password = request.getParameter("password");
int role = Integer.valueOf(request.getParameter("role"));
User user = new User();
user.setId(id);
user.setName(username);
user.setPassword(password);
user.setRole(role);
UserDAo userDAo = new UserDAo();
userDAo.addUser(user);
System.out.println("注册成功");
request.getRequestDispatcher("Login.jsp").forward(request,response);
}
}
9、简单的登录成功与失败页面
success.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/12/1
Time: 16:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功页面</title>
</head>
<body>
<h1>
登录成功
</h1>
<hr>
</body>
</html>
defeat.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/12/1
Time: 16:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
<hr>
<a href="Login.jsp">重新登录</a>
<br>
<a href="register.jsp">注册</a>
</body>
</html>
10、配置we.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.demo.service.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.demo.service.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/RegisterServlet</url-pattern>
</servlet-mapping>
</web-app>
访问的时候先访问register.jsp进行注册,注册成功后会跳转到登录界面进行登录。结果如下:
当登陆失败时,结果如下:
各个页面的具体功能等待完善… …
完整的项目保存在github上:ForMe的github