一、分析項目之前要了解下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